diff --git a/en/projects/bigdisk/index.sgml b/en/projects/bigdisk/index.sgml index 9e7e4e1a29..4f07d42a6a 100644 --- a/en/projects/bigdisk/index.sgml +++ b/en/projects/bigdisk/index.sgml @@ -1,213 +1,213 @@ - + %includes; N/A"> Done"> In progress"> -Needs testing"> +Needs testing"> Not done"> Unknown"> %developers; ]> &header;

Contents

Purpose and background

The UFS filesystem

When the UFS filesystem was introduced to BSD in 1982, its use of 32 bit offsets and counters to address the storage was considered to be ahead of its time. Since most fixed-disk storage devices use 512 byte sectors, 32 bits allowed for 2 Terabytes of storage. That was an almost un-imaginable quantity for the time. But now that 250 and 400 Gigabyte disks are available at consumer prices, it's trivial to build a hardware or software based storage array that can exceed 2TB for a few thousand dollars.

The UFS2 filesystem was introduced in 2003 as a replacement to the original UFS and provides 64 bit counters and offsets. This allows for files and filesystems to grow to 2^73 bytes (2^64 * 512) in size and hopefully be sufficient for quite a long time. UFS2 largely solved the storage size limits imposed by the filesystem. Unfortunately, many tools and storage mechanisms still use or assume 32 bit values, often keeping FreeBSD limited to 2TB.

We need to ensure that FreeBSD supports large storage sizes and that the benefits of UFS2 can actually be realized so that FreeBSD can remain relevant in the enterprise world. This page describes known issues and limits and provides a focus for further auditing, validation, and fixing.

Limits on disk partitioning

The first limit that is encountered is in disk partitioning. For x86 and amd64 PC's, the FDISK MBR table is used by the BIOS to partition the disk into logical extents and identify which partition ('slice' in FreeBSD terms) to boot from. The MBR is defined to use 32 bit disk offsets, and since it's an industry standard and interoperability is required, there is nothing that can be done to change this. As long as booting a PC requires the MBR, the boot slice in FreeBSD is going to be limited to 2TB.

The GPT partitioning scheme was introduced with the ia64 architecture as an MBR replacement. It provides 64 bit offsets and allows for an arbitrary number of partitions. It also provides a compatibility mode with MBR where it can generate an MBR-compatible structure on the disk for use with systems that don't understand GPT. However, to get the full benefits for boot storage, the BIOS and the FreeBSD loader must understand it. For secondary storage, GPT can be used by any architecture regardless of BIOS or boot support.

Many systems don't require an MBR or GPT, and even PCs don't require it if booting and inter-operating with other OS's is not required. The next limit that comes in, though, is with the BSD disklabel. This label defines up to 8 partitions on a disk, MBR slice, or other storage extent for filesystems and swap space. Unfortunately, the on-disk format of the disk label again uses 32 bit quantities, so it is also limited to 2TB. Fixing this would require creating a new format that is incompatible with the old and would require an update to the FreeBSD boot loader. This would complicate interoperability and the upgrade path. Also, if a new format is going to be created, it should also address the 8 partition limit that exists now. Given these requirements, it's tempting to just adopt the GPT format instead for secondary storage partitioning.

Testing large capacities

Even though large drives are cheap, it still isn't always feasible or economical to test on real hardware. Swap-backed memory disks, via the md(4) driver, can provide a good substitute for some of the testing. Backing with swap means that only the pages that are dirtied by data are actually allocated, so a multi-terabyte storage can be simulated with a minimal amount of physical RAM+swap. Note that this is less true with UFS1 since it will initialize all of the inode blocks during newfs, which will dirty quite a bit of data. But for UFS2, swap-backed md has the potential for working well. Unfortunately, the kernel md driver has a number of 32-bit size limits of its own that need to be fixed. Details are provided below.

It is still possible to avoid disklabels and MBRs for testing by using newfs directly on the raw disk or md disk. Sysinstall can be tested from a running system by just selecting Expert mode and just performing the MBR and disklabel steps. Beware that sysinstall might have other bugs that will wipe out your existing system, so care must be taken here!

Userland Tool Status

The following userland tools need auditing and testing for 64-bit cleanliness:

Task Responsible Last updated Status Details
newfs_ffs     &status.new; A quick audit of newfs shows that the '-s' option uses atoi() instead of strtoull() or equivalent. A more thorough audit is needed to see if other integer limits exist.
df     &status.new; An audit is needed to make sure that all reported fields are 64-bit clean. There are reports with certain fields being incorrect or negative with NFS volumes, which could either be an NFS or df problem.
du     &status.new; An audit is needed to make sure that all reported fields are 64-bit clean.
growfs &a.scottl; 12 Sept 2004 &status.wip; Growfs has problems with expanding to new cylinder groups. It also initializes UFS2 inode blocks instead of leaving them for lazy initialization. It also needs a 64-bit audit.
sysinstall     &status.new; A full audit is needed. Reports exist of problems with >1TB partitions.
fsck_ffs     &status.new; A full audit is needed.

Kernel Driver Status

Many storage peripherals simply are not designed to handle >2TB capacities. For those that are, an audit should be done to verify that their drivers handle the sizes correctly and pass those sizes correctly to the rest of the kernel.

Task Responsible Last updated Status Details
md &a.pjd; 17 Sept 2004 &status.done; Swap backed disks can now be created up to 16TB in size on i386. This corresponds to 2^32*4096.
&footer; diff --git a/en/projects/busdma/index.sgml b/en/projects/busdma/index.sgml index c44f9fc87a..f97327c895 100644 --- a/en/projects/busdma/index.sgml +++ b/en/projects/busdma/index.sgml @@ -1,1245 +1,1245 @@ - + %includes; N/A"> Done"> In progress"> -Needs testing"> +Needs testing"> Not done"> Unknown"> %developers; ]> &header;

Contents

Project Goal

busdma

The busdma interfaces permit hardware device drivers to operate on a variety of platforms avoiding the encoding of platform-specific access methods into drivers. This lowers the maintenance costs for drivers across platforms, and improves the chances that a driver will "just work" on a new platform. Modifying a driver to make use of busdma is relatively straight forward, but does require familiarity with both the device driver and busdma primitives. For busdma to be used in FreeBSD, two sets of changes are generally required: adaptation of the busdma implementation to run on all platforms, and adaptation of drivers to use the framework. As such, status information on this project is broken down into platform support, and driver support (sorted by category). Completing this work requires a thorough audit of the system device drivers, then prioritized conversion of drivers.

INTR_MPSAFE

Hardware drivers register their interrupt handler with the bus_setup_intr() function. Setting the flag INTR_MPSAFE tells the system interrupt code to call the interrupt routine without holding the Giant mutex. This can give a significant performance gain on SMP systems.

Drivers can set this flag even if they are not fully locked down as long as their interrupt routine is careful about not touching other data structures in the driver. An easy way to do this is to check and clear the hardware interrupt status registers and then schedule the interrupt processing for a taskqueue or kernel thread.

SMPng locked

Drivers should employ mutexes and sx locks to protect their data structures and hardware registers from competing threads. Mutex operations are somewhat expensive, so a good strategy is combine as many atomic operations into a single mutex acquisition as possible.

p!=a safety

Intel PAE support requires that pointers and physical address representations be of differing sizes. This means that drivers must be written to use vm_paddr_t or bus_addr_t rather than assuming that physical addresses can be represented using a void *. In addition, format strings and casts must be carefully handled.

The task list below is not intended to be complete, but does represent a set of relevant and/or important components of the overall work. The "Responsible" field identifies a developer who has expressed willingness to be responsible for completing the identified task; this doesn't preclude others working on it, but suggests that coordination with the responsible party might be appropriate so as to avoid unnecessary duplication of work, and to maximize forward progress. If beginning work on a new area of substantial size, or one that appears unclaimed, it may be worth dropping an e-mail to &a.mux; to see if any progress has been made.

The definition of the date field varies depending on the status of a task. For completed tasks, it refers to the date completed or reported completed. For in-progress tasks, it refers to the date of the last update of the entry. For stalled tasks, it refers to the date that the task was declared stalled. For new tasks, it refers to the date the task was added to the list.

Tasks are sorted first by status, then by date.

Platform Support Status

Task Responsible Last updated Status Details
alpha &a.gallatin; December 10, 2002 &status.done; There may be problems for systems with large amounts of memory.
amd64 &a.peter; July 1, 2003 &status.done; Fully supported.
ia64 &a.marcel; December 10, 2002 &status.done; There may be problems for systems with large amounts of memory.
i386 &a.sam; December 9, 2002 &status.done; Fully supported.
powerpc &a.hmp; January 15, 2003 &status.done; Fully supported.
sparc64 &a.tmm; January 6, 2003 &status.done; Fully supported.

Network Interface Driver Status

Driver Responsible Last updated busdma INTR_MPSAFE SMPng locked a!=p 4.x status Notes
if_ar     &status.new; &status.new; &status.new; &status.new; &status.new; kvtop()
if_bge &a.wpaul; April 13, 2004 &status.done; &status.done; &status.done; &status.done; &status.new;  
if_cp &a.rik; June 24, 2004 &status.done; &status.wip; &status.wip; &status.new; &status.na;  
if_cs     &status.new; &status.new; &status.new; &status.new; &status.new;  
if_ct &a.rik; June 24, 2004 &status.done; &status.wip; &status.wip; &status.new; &status.new;  
if_cx &a.rik; June 24, 2004 &status.done; &status.wip; &status.wip; &status.new; &status.new;  
if_dc &a.mux; April 13, 2004 &status.done; &status.done; &status.done; &status.untested; &status.new; MPSAFE subject to use of MTX_RECURSE
if_de &a.mux; April 13, 2004 &status.done; &status.new; &status.new; &status.new; &status.done;  
if_ed     &status.new; &status.new; &status.new; &status.new; &status.new; kvtop()
if_em &a.pdeuskar; April 13, 2004 &status.done; &status.done; &status.done; &status.done; &status.new;  
if_en &a.harti; April 13, 2004 &status.done; &status.new; &status.new; &status.untested; &status.new; Locking present; not yet marked INTR_MPSAFE?
if_ep &a.imp; April 13, 2004 &status.na; &status.done; &status.done; &status.done; &status.na; Mutex marked MTX_RECURSE.
if_ex &a.imp; April 13, 2004 &status.na; &status.new; &status.new; &status.new; &status.na; not fully evaluated.
if_fatm &a.harti; July 20, 2004 &status.done; &status.untested; &status.untested; &status.untested; N/A  
if_fxp &a.mux; April 13, 2004 &status.done; &status.done; &status.done; &status.done; &status.new;  
if_fwe     &status.new; &status.new; &status.new; &status.new; &status.new;  
if_gem &a.tmm; January 6, 2003 &status.done; &status.new; &status.new; &status.new; N/A  
if_gx   April 13, 2004 &status.new; &status.new; &status.new; &status.new; &status.new; vtophys(); locking present; not marked INTR_MPSAFE? Mutex marked MTX_RECURSE.
if_hatm &a.harti; July 20, 2004 &status.done; &status.untested; &status.untested; &status.untested; N/A  
if_hme &a.tmm; January 6, 2003 &status.done; &status.new; &status.new; &status.new; N/A  
if_idt     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
if_lge     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
if_lmc     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
if_lnc &a.obrien;   &status.new; &status.new; &status.new; &status.new; &status.new; vtophys(). Please contact &a.phk; for info/hardware.
if_mn     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys(). Please contact &a.phk; for info/hardware.
if_my     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
if_nge   September 16, 2004 &status.new; &status.new; &status.done; &status.new; &status.new; vtophys()
if_pcn &a.obrien; April 13, 2004 &status.new; &status.new; &status.new; &status.new; &status.new; vtophys(); locking present; not yet marked INTR_MPSAFE? Mutex marked MTX_RECURSE.
if_pdq     &status.new; &status.new; &status.new; &status.new; &status.new; mostly busdma, except for vtophys()
if_rl &a.wpaul; April 13, 2004 &status.done; &status.done; &status.done; &status.new; &status.new;  
if_sf   April 13, 2004 &status.new; &status.new; &status.new; &status.new; &status.new; vtophys(); locking present; not yet marked INTR_MPSAFE? Mutex marked MTX_RECURSE.
if_sis &a.wpaul; April 13, 2004 &status.done; &status.done; &status.done; &status.new; &status.new; Mutex marked MTX_RECURSE.
if_sk     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
if_sr     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
if_ste     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
if_ti     &status.new; &status.new; &status.new; &status.new; &status.new;  
if_tl     &status.new; &status.new; &status.new; &status.new; &status.new;  
if_tx &a.mux; April 19, 2003 &status.done; &status.new; &status.new; &status.untested; &status.new; vtophys()
if_txp &a.will; July 18, 2003 &status.wip; &status.new; &status.new; &status.new; &status.new;  
if_vr   April 23, 2004 &status.new; &status.new; &status.new; &status.new; &status.new;  
if_wb     &status.new; &status.new; &status.new; &status.new; &status.new;  
if_wi &a.sam;, &a.imp; November 4, 2003 &status.unknown; &status.done; &status.unknown; &status.unknown; &status.unknown;  
if_xl &a.mux; April 13, 2004 &status.done; &status.done; &status.done; &status.done; &status.new;  

Storage Device Driver Status

Driver Responsible Last updated busdma INTR_MPSAFE SMPng locked a!=p 4.x status Notes
aac &a.scottl; February 8, 2003 &status.done; &status.done; &status.done; &status.done; &status.new; PCI-64 capable, not endian clean
adv   December 9, 2002 &status.done; &status.new; &status.new; &status.new; &status.new;  
aha   April 13, 2004 &status.done; &status.wip; &status.wip; &status.new; &status.new; Uses BUSDMA, but may pun bus address with host address
ahb   December 9, 2002 &status.done; &status.new; &status.new; &status.new; &status.new;  
aic7xxx   December 9, 2002 &status.done; &status.new; &status.new; &status.new; &status.new;  
amd   December 14, 2002 &status.done; &status.new; &status.new; &status.new; &status.new;  
amr   December 9, 2002 &status.done; &status.new; &status.new; &status.new; &status.new;  
asr &a.obrien; January 4, 2003 &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
ata &a.sos; December 9, 2002 &status.done; &status.done; &status.done; &status.done; &status.new;  
buslogic     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
ciss   December 9, 2002 &status.done; &status.new; &status.new; &status.new; &status.new;  
ct     &status.new; &status.new; &status.new; &status.new; &status.new;  
dpt     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
ida   December 9, 2002 &status.done; &status.new; &status.new; &status.new; &status.new;  
iir     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
isp   February 8, 2003 &status.done; &status.done; &status.new; &status.new; &status.new;  
mlx &a.scottl; February 8, 2003 &status.done; &status.wip; &status.wip; &status.new; &status.new;  
mly &a.scottl; February 8, 2003 &status.done; &status.wip; &status.wip; &status.new; &status.new;  
mpt   December 9, 2002 &status.done; &status.done; &status.new; &status.new; &status.new;  
ncr     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys(). Please contact &a.phk; for a possible source of hardware.
pst     &status.new; &status.done; &status.new; &status.new; &status.new; vtophys()
stg   December 9, 2002 &status.done; &status.new; &status.new; &status.new; &status.new; At least, it looks like it may well be.
sym   December 19, 2002 &status.done; &status.new; &status.new; &status.new; &status.new;  
trm &a.cognet; December 9, 2002 &status.done; &status.new; &status.new; &status.new; &status.new;  
twe   December 9, 2002 &status.done; &status.new; &status.new; &status.new; &status.new;  

Miscellaneous Device Driver Status

Driver Responsible Last updated busdma INTR_MPSAFE SMPng locked a!=p 4.x status Notes
agp &a.cognet; January 23, 2003 &status.wip; &status.new; &status.new; &status.new; &status.new; vtophys()
bktr &a.cognet; January 15, 2003 &status.wip; &status.new; &status.new; &status.new; &status.new; vtophys()
digi     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
drm &a.anholt; October 27, 2003 &status.wip; &status.done; &status.done; &status.wip; &status.wip; vtophys(). The locking could use some review.
fb     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
firewire &a.simokawa; April 17, 2003 &status.done; &status.new; &status.new; &status.done; &status.new; vtophys()
hea     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
hfa     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
hifn &a.sam; April 13, 2004 &status.done; &status.done; &status.done; &status.new; &status.new;  
meteor     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys()
musycc     &status.new; &status.new; &status.new; &status.new; &status.new; vtophys(). Please contact &a.phk; for info/hardware.
pcm &a.cognet; February 20, 2003 &status.done; &status.done; &status.new; &status.new; &status.new;  
ubsec &a.sam; April 13, 2004 &status.done; &status.done; &status.done; &status.new; &status.new; vtophys() is used in debugging printf
usb &a.jmg; July 24, 2003 &status.done; &status.new; &status.new; &status.untested; &status.new; a!=p should be clean, but requires further testing
wds   December 9, 2002 &status.done; &status.new; &status.new; &status.new; &status.new;  

Documentation Status

Task Responsible Last updated Status Notes
manpages for the busdma API &a.hmp; January 15, 2003 &status.done;  
&footer; diff --git a/en/projects/dingo/index.sgml b/en/projects/dingo/index.sgml index 7b45329a1a..def3d29aa6 100644 --- a/en/projects/dingo/index.sgml +++ b/en/projects/dingo/index.sgml @@ -1,250 +1,250 @@ - + %includes; N/A"> Done"> Prototyped"> -Merged to HEAD; RELENG_5 candidate"> +Merged to HEAD; RELENG_5 candidate"> New task"> Unknown"> %developers; ]> &header;

Contents

Project Goal

The Dingo project is a collection of work that needs to be done to clean up and advance the network stack. The overriding goal is to remove duplicated functionality while also adding new features that will make FreeBSD easier to use both for the network engineer and experimenter and for the first time user.

The Dingo project is closely related to the Netperf Project which is removing all the Giant locks from the various network stacks.

Project Tasks

Task Responsible Last updated Status Notes
ARP rewrite, layer 2 separation from FIB code 20041128 &status.new; luigi started but didn't finish. Mail Message Problem Report
Add IP_SENDIF. Get SO_BINDTODEVICE for next to free. fenner likes this 20041128 &status.new;
Update TCP-MD5 support in FreeBSD. 20041128 &status.new;
Refactor PF_ROUTE as a tag-length-value based ABI 20041128 &status.new;
Rework code in FreeBSD's ip_icmp.c such that ICMP responses for forwarding can be throttled also. Call badport_bandlim() before icmp_error()? 20041128 &status.new;
Take M_PROMISC from NetBSD. 20041128 &status.new;
Refactor wi(4) to implement IFF_ALLMULTI in PPROMISC using M_PROMISC 20041128 &status.new; Refactor wi(4) to implement IFF_ALLMULTI in PPROMISC using M_PROMISC and if_ethersubr or 802.11 layer handling to throw out the promisc stuff which isn't needed. Or on any hardware without IFF_ALLMULTI
Make sure mlaier's multiple inaddr on same subnet change is A-OK 20041203 &status.head;
Import CARP from OpenBSD mlaier 20041203 &status.prototyped; Patches are available for testing. Needs coordination with ifconfigNG and maybe the ARP rewrite.
Get pff(4) house in order wrt M_PROMISC 20041128 &status.new;
Make an(4) radiotap-aware. 80% DONE! Depends on task below 20041128 &status.new;
Make an(4) net80211-aware (bringin NetBSD diffs from onoe). 20041128 &status.new;
Bringin busdma vr(4) from netbsd 20041128 &status.new;
Add radiotap support to acx(4). 20041128 &status.new; In touch with darron about the firmware redistribution issue
Import Benno's software AAL5 layer for native ATM DSL, bug him about it 20041128 &status.new;
Port howl's autoipd and nifd to FreeBSD --> bsd-licensed full zeroconf... 20041128 &status.new;
KAME tunnel code needs to be brought in line with the tunnel mib. 20041128 &status.new; (As in, if_type should be IFT_TUNNEL). This can probably be done for IFT_GIF but need review from ume/kame people.
Take sam's new ifconfig from p4 20041128 &status.new;
We need to add features to gre(4). Use dev.* sysctls. 20041128 &status.new;
Write a plugin for Sam's ifconfig 20041128 &status.new; RFC1701, RFC2784 Checksum+Offset Sequence number RFC1701 Key (for multipoint tunnel support) Other Path MTU Discovery
Investigate policy/classful routing as an option for FreeBSD. 20041128 &status.new;
Nuke struct arpcom (partially related to ARP rewrite). 20041203 &status.new;
Generic mechanism to attach per-subsystem data to interfaces (needed to clean up ng_fec and remove ac_netgraph from struct arpcom). 20041203 &status.new;
Remove struct ifnet from softc. brooks 20041203 &status.new;
&footer; diff --git a/en/projects/netperf/index.sgml b/en/projects/netperf/index.sgml index d4bcf1c119..6bd8e56497 100644 --- a/en/projects/netperf/index.sgml +++ b/en/projects/netperf/index.sgml @@ -1,293 +1,293 @@ - + %includes; N/A"> Done"> Prototyped"> -Merged to HEAD; RELENG_5 candidate"> +Merged to HEAD; RELENG_5 candidate"> New task"> Unknown"> %developers; ]> &header;

Contents

Project Goal

The netperf project is working to enhance the performance of the FreeBSD network stack. This work grew out of the SMPng Project, which moved the FreeBSD kernel from a "Giant Lock" to more fine-grained locking and multi-threading. SMPng offered both performance improvement and degradation for the network stack, improving parallelism and preemption, but substantially increasing per-packet processing costs. The netperf project is primarily focussed on further improving parallelism in network processing while reducing the SMP synchronization overhead. This in turn will lead to higher processing throughput and lower processing latency.

Project Strategies

Robert Watson

The two primary focuses of this work are to increase parallelism while decreasing overhead. Several activities are being performed that will work toward these goals:

Project Tasks

Task Responsible Last updated Status Notes
Prefer file descriptor reference counts to socket reference counts for system calls. &a.rwatson; 20041124 &status.done; Sockets and file descriptors both have reference counts in order to prevent these objects from being free'd while in use. However, if a file descriptor is used to reach the socket, the reference counts are somewhat interchangeable, as either will prevent undesired garbage collection. For socket system calls, overhead can be reduced by relying on the file descriptor reference count, thus avoiding the synchronized operations necessary to modify the socket reference count, an approach also taken in the VFS code. This change has been made for most socket system calls, and has been committed to HEAD (6.x). It has also been merged to RELENG_5 for inclusion in 5.4.
Mbuf queue library &a.rwatson; 20041124 &status.prototyped; In order to facilitate passing off queues of packets between network stack components, create an mbuf queue primitive, struct mbufqueue. The initial implementation is complete, and the primitive is now being applied in several sample cases to determine whether it offers the desired semantics and benefits. The implementation can be found in the rwatson_dispatch Perforce branch. Additional work must also be done to explore the performance impact of "queues" vs arrays of mbuf pointers, which are likely to behave better from a caching perspective.
Employ queued dispatch in interface send API &a.rwatson; 20041106 &status.prototyped; An experimental if_start_mbufqueue() interface to struct ifnet has been added, which passes an mbuf queue to the device driver for processing, avoiding redundant synchronization against the interface queue, even in the event that additional queueing is required. This has not yet been benchmarked. A subset change to dispatch a single mbuf to a driver has also been prototyped, and bencharked at a several percentage point improvement in packet send rates from user space.
Employ queued dispatch in the interface receive API &a.rwatson; 20041106 &status.new; Similar to if_start_mbufqueue, allow input of a queue of mbufs from the device driver into the lowest protocol layers, such as ether_input_mbufqueue.
Employ queued dispatch across netisr dispatch API &a.rwatson; 20041124 &status.prototyped; Pull all of the mbufs in the netisr ifqueue out of the ifqueue into a thread-local mbuf queue to avoid repeated lock operations to access the queue. Also use lock-free operations to test for queue contents being present. This has been prototyped in the rwatson_netperf branch.
Modify UMA allocator to use critical sections not mutexes for per-CPU caches. &a.rwatson; 20041124 &status.prototyped; The mutexes protecting per-CPU caches require atomic operations on SMP systems; as they are per-CPU objects, the cost of synchronizing access to the caches can be reduced by combining CPU pinning and/or critical sections instead. A prototype of this has been implemented in the rwatson_percpu branch, but is waiting on critical section performance optimizations that will prevent this change from negatively impacting uniprocessor performance. The critical section operations from John Baldwin have been posted for public review.
Optimize critical section performance &a.jhb; 20041124 &status.prototyped; Critical sections prevent preemption of a thread on a CPU, as well as preventing migration of that thread to another CPU, and maybe used for synchronizing access to per-CPU data structures, as well as preventing recursion in interrupt processing. Currently, critical sections disable interrupts on the CPU. In previous versions of FreeBSD (4.x and before), optimizations were present that allowed for software interrupt disabling, which lowers the cost of critical sections in the common case by avoiding expensive microcode operations on the CPU. By restoring this model, or a variation on it, critical sections can be made substantially cheaper to enter. In particular, this change will lower the cost of critical sections on UP such that it is approximately the same cost as a mutex, meaning that optimizations on SMP to use critical sections instead of mutexes will not harm UP performance. A prototype of this change is present in the jhb_lock Perforce branch, and patches have been posted to per-architecture mailing lists for review.

Netperf Cluster

Through the generous donations and investment of Sentex Data Communications, FreeBSD Systems, IronPort Systems, and the FreeBSD Foundation, a network performance testbed has been created in Ontario, Canada for use by FreeBSD developers working in the area of network performance. A similar cluster, made possible through the generous donation of Verio, is being prepared for use in more general SMP performance work in Virginia, US. Each cluster consists of several SMP systems inter-connected with giga-bit ethernet such that relatively arbitrary topologies can be constructed in order to test host-host, IP forwarding, and bridging performance scenarios. Systems are network booted, have serial console, and remote power, in order to maximize availability and minimize configuration overhead. These systems are available on a check-out basis for experimentation and performance measurement to FreeBSD developers working on the Netperf project, and in related areas.

Links

Some useful links relating to the netperf work:

&footer;