<!DOCTYPE HTML PUBLIC "-//FreeBSD//DTD HTML 4.01 Transitional-Based Extension//EN" [
<!ENTITY base CDATA "..">
<!ENTITY date "$FreeBSD$">
<!ENTITY title "FreeBSD SMPng Project">
<!ENTITY email 'freebsd-smp'>
<!ENTITY % navinclude.developers "INCLUDE">

<!-- Status levels -->
<!ENTITY status.done "<font color=green>Done</font>">
<!ENTITY status.wip "<font color=blue>In progress</font>">
<!ENTITY status.stalled "<font color=purple>Stalled</font>">
<!ENTITY status.new "<font color=red>Not Started</font>">
<!ENTITY status.resolved "<font color=green>Resolved</font>">
<!ENTITY status.unresolved "<font color=red>Unresolved</font>">

<!-- The list of contributors was moved to a separate file so that it can
  be used by other documents in the FreeBSD web site. -->

<!ENTITY % developers PUBLIC "-//FreeBSD//ENTITIES FreeBSD Developers Entities//EN"> %developers;

]>

<html>
  &header;

    <h2>Contents</h2>
    <ul>
      <li><a href="#goal">Project Goal</a></li>
      <li><a href="#status">Project Status</a></li>
      <li><a href="#history">Project History</a></li>
      <li><a href="#plan">Project Plan (Historical)</a></li>
      <li><a href="#resources">Resources and Links</a></li>
      <li><a href="#subsystems">Subsystems and Staffing (Historical)</a></li>
      <li><a href="#tasks">Tasks (Historical)</a></li>
      <li><a href="#issues">Known Issues (Historical)</a></li>
      <li><a href="#news">News (Historical)</a></li>
    </ul>

    <a name="goal"></a>
    <h2>Project Goal</h2>

    <p>The FreeBSD Next Generation Symmetric Multi-Processing Project,
      generally referred to as SMPng, had the goal of introducing parallelism
      into the FreeBSD kernel.
      While earlier versions of FreeBSD (3.x, 4.x) supported parallel
      execution of user processes, the kernel was limited to running on a
      single processor at a time, using a "Giant lock" around the kernel to
      prevent more than one kernel thread or interrupt handler from executing
      at once.
      For many interesting workloads, Giant-locked kernels give substantial
      speed-up when compared with uniprocessor systems, as significant
      computation occurs in user processes--especially for applications such
      as rendering and compilation.
      However, for kernel-intensive applications, such as intensive network
      or file system I/O, contention on the kernel lock results in little or
      no speed-up.
      The goal of the SMPng Project was to decompose the Giant lock into a
      number of smaller locks, resulting in reduced contention (and improved
      SMP performance).
      Important steps along the way included redesigning significant portions
      of the FreeBSD kernel architecture around the notion of ubiquitous
      parallelism: that at any moment, many processors might enter the kernel
      at the same time.
      This included the introduction of more mature threading and
      synchronization primitives, interrupt threads, cache-aware allocation
      and scheduling, and topology-aware scheduling. </p>

    <p>The FreeBSD Project wishes to recognize the contributions of the
      BSD/OS development team, including architectural direction and
      suggestions, as well as for initial locking strategies for some system
      components, and source code for some of the starting primitives, not to
      mention BSDI's contributions in staffing and resources for early parts
      of this project.  Likewise, we wish to recognize significant
      sponsorship of SMPng work by Yahoo!, Isilon, and the FreeBSD
      Foundation.</p>

    <a name="status"></a>
    <h2>Project Status</h2>

    <p>While limited sections of the FreeBSD kernel still require Giant,
      especially more obscure device drivers and file systems, most parts of
      the kernel now neither require nor run with the Giant lock.
      As of FreeBSD 6.0, the SMPng Project is considered "complete", in that
      the goal of moving to parallelized kernel operation has been met for
      most significant parts of the kernel.
      This web page is largely historical, and is not up-to-date with respect
      to the completion status of items in the task list, etc.</p>

    <a name="history"></a>
    <h2>Project History</h2>

    <p>SMPng debuted in FreeBSD 5.0-RELEASE in January of 2003, and involved
      over five years of continuous development by a large number of members
      of the FreeBSD development team as well as many external contributors.
      Since 5.0, the implementation has substantially matured; in the 5.0
      release, the basic architectural changes required to support SMPng were
      complete, including new kernel memory allocators, synchronization
      routines, the move to ithreads, and the removal of the Giant lock from
      activities such as process scheduling and several common forms of IPC.
      Since 5.0, the architecture has been refined in a number of ways,
      including optimizing synchronization approaches, stability and
      performance testing on larger systems (up to 32 processor threads), and the
      removal of Giant from several significant parts of the operating
      system, including large parts of Virtual Memory (VM), the Virtual File
      System (VFS), UNIX File System (UFS), most parts of the network stack,
      including IPv4, IPV6, FAST_IPSEC, UNIX domain sockets, and NetGraph,
      and also from inter-process communication primitives.
      The SMP-aware kernel slab allocator is now used almost universally, and
      the focus has changed from "make it work", to "optimize it".
      Simultaneous work on KSE 1:1 and M:N threading has also allowed
      applications to take advantage of new kernel parallelism.
      The FreeBSD 5.3 kernel introduced Giant-free network stack execution
      for most relevant code paths, and the FreeBSD 6.0 kernel introduced
      MPSAFE VFS, as well as wide-spread performance optimization.</p>

    <p>Continuing work on SMPng in the 6.x branch has included work sweeping
      up the "loose ends" that remain under Giant, such as parts of NFS, and
      less commonly used network stack components.</p>

    <p>Throughout SMPng, an important focus was performance measurement and
      optimization, which build on and refine the SMPng architecture: the
      introduction of features such as the kernel trace facility (KTR),
      hardware performance monitor counters (hwpmc), lock profiling, and
      improved memory monitoring play important roles in this process.
      Other important debugging and testing facilities include WITNESS, a
      run-time kernel lock order verifier, and wide-spread use of lock
      assertions and run-time invariants testing.</p>

    <a name="plan"></a>
    <h2>Project Plan (Historical)</h2>

    <p>This web page contains information relating to the SMPng effort;
      because of the immense scope of the work and rapid pace of development,
      it captures only a subset of what has been done.  As the base SMPng
      Project, moving towards fine-grained locking, is complete, this
      information is largely historical, and does not attempt to capture
      more recent work on locking and multi-processor performance.</p>

    <p>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 the FreeBSD SMP mailing list to
      see if any progress has been made.</p>

    <p>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.</p>

    <p>Locking down of individual device drivers is tracked at
      <a href="http://www.FreeBSD.org/projects/busdma/">the busdma and
      SMPng driver conversion web page</a>.</p>

    <p>Network stack locking information is available at &a.rwatson;'s
      <a href="http://www.watson.org/~robert/freebsd/netperf/">netperf web
      page</a> and the FreeBSD.org <a href="../projects/netperf/">Netperf
      web page</a>.
      An SMP <a href="../projects/netperf/cluster.html">network performance
      cluster</a> has also been created for the purposes of testing.</p>

    <p>Tasks are sorted first by status, then by date.</p>

    <a name="resources"></a>
    <h2>Resources and Links</h2>

    <ul>
      <li><p>Most SMP-related discussion takes place on the
	  <a href="mailto:freebsd-smp@FreeBSD.org">freebsd-smp</a>
	  mailing list.  You can read more about mailing lists in the
	  <a href="../doc/en_US.ISO8859-1/books/handbook/eresources.html#ERESOURCES-MAIL">
	  Resources on the Internet</a> appendix of the
	  <a href="../doc/en_US.ISO8859-1/books/handbook/index.html">FreeBSD Handbook</a>.</p></li>

      <li><p>Steve Passe has been maintaining a
	  <a href="http://people.FreeBSD.org/~fsmp/SMP/SMP.html">SMP
	  project page</a> that contains additional information, and
	  goes back further in time than this web page.</p></li>

      <li><p>&a.rwatson; is maintaining a page for SMP-related network
	  performance work for the <a href="../projects/netperf/">Netperf
	  project</a>.  In addition, he has a <a
	  href="http://www.watson.org/~robert/freebsd/netperf/">a personal
	  web page with a change log and other information</a>.</p></li>

      <li><p><a href="http://www.osnews.com/">OSNews</a> has run an
	interview with FreeBSD developers &a.rwatson;, &a.jhb;, and
	&a.scottl;, who talk about many features in 6.x, including recent
	SMPng work, SMPVFS, and more.  The <a
	href="http://www.osnews.com/story.php?news_id=10951">article is
	here</a>.</p></li>

      <li><p>A series of man pages on kernel synchronization and threading
	  primitives can be found here:</p>

	    <ul>
	      <li><a href="http://www.freebsd.org/cgi/man.cgi?query=mutex&amp;apropos=0&amp;sektion=9">Kernel Mutexes (mutex(9))</a></li>

	      <li><a href="http://www.freebsd.org/cgi/man.cgi?query=mtx_pool&amp;apropos=0&amp;sektion=9">Kernel Mutex Pools (mtx_pool(9))</a></li>

	      <li><a href="http://www.freebsd.org/cgi/man.cgi?query=critical&amp;apropos=0&amp;sektion=9">Kernel Critical Sections (critical(9))</a></li>

	      <li><a href="http://www.freebsd.org/cgi/man.cgi?query=sx&amp;apropos=0&amp;sektion=9">Kernel Shared/Exclusive Locks (sx(9))</a></li>

	      <li><a href="http://www.freebsd.org/cgi/man.cgi?query=condvar&amp;apropos=0&amp;sektion=9">Kernel Condition Variables (condvar(9))</a></li>

	      <li><a href="http://www.freebsd.org/cgi/man.cgi?query=sema&amp;apropos=0&amp;sektion=9">Kernel Semaphores (sema(9))</a></li>

	      <li><a href="http://www.freebsd.org/cgi/man.cgi?query=sleep&amp;apropos=0&amp;sektion=9">Kernel sleep/wakeup API (sleep(9))</a></li>

	      <li><a href="http://www.freebsd.org/cgi/man.cgi?query=kthread&amp;apropos=0&amp;sektion=9">Kernel Threads (kthread(9))</a></li>

	      <li><a href="http://www.freebsd.org/cgi/man.cgi?query=ithread&amp;apropos=0&amp;sektion=9">Interrupt Threads (ithread(9))</a></li>

	      <li><a href="http://www.freebsd.org/cgi/man.cgi?query=swi&amp;apropos=0&amp;sektion=9">Software Interrupt Threads (swi(9))</a></li>
	    </ul>

	  <br>
	  <p>In addition, the old <a href="http://www.freebsd.org/cgi/man.cgi?query=spl&amp;apropos=0&amp;sektion=9">SPL man page</a> may be of interest, as it reflects the previous SMP synchronization model.</p>
	</li>

      <li><p>
	  Hiten Pandya's <a
	  href="http://storm.uk.FreeBSD.org/~hiten/smp_synch_rules.html">
	  SMP kernel synchronization rules</a>.</p></li>

      <li><p>&a.dillon; maintained a
	  <a href="http://apollo.backplane.com/FreeBSDSmp/">web page</a>
	  that documented the work he was doing on the SMP project.</p></li>

      <li>
	<p>
	  <a href="http://www.usenix.org/events/bsdcon02/full_papers/baldwin/baldwin_html/index.html">
	  "Locking in the Multithreaded FreeBSD Kernel" USENIX paper by &a.jhb;</a>.
	</p>
      </li>

      <li>
	<p>
	  <a href="http://www.usenix.org/publications/library/proceedings/bsdcon03/tech/hsu.html">
	"Reasoning about SMP in FreeBSD" BSDCon'03 paper by &a.hsu;</a>.
	</p>
      </li>

      <li>
	<p>
	  <a href="http://www.usenix.org/publications/library/proceedings/bsdcon03/tech/roberson.html">
	"ULE: A Modern Scheduler for FreeBSD" BSDCon'03 paper by &a.jeff;</a>.
	</p>
      </li>

      <li>
	<p>
	  <a href="http://www.watson.org/~robert/freebsd/netperf/20051027-eurobsdcon2005-netperf.pdf">"Introduction to Multithreading and Multiprocessing in the FreeBSD SMPng Network Stack" EuroBSDCon 2005 paper by &a.rwatson;</a>.
	</p>
      </li>

    </ul>

    <a name="subsystems"></a>
    <h2>Subsystems and Staffing (Historical)</h2>

    <p>This is an incomplete list of high-level kernel subsystems and
      current, active staff working on SMP architecture and stability.</p>

    <table class="tblbasic">
      <tr class="heading">
	<th> Subsystem </th>
	<th> Status </th>
	<th> Last updated </th>
	<th> Staffing </th>
      </tr>

      <tr>
	<td> Newbus </td>
	<td> &status.wip; </td>
	<td> 5 October 2003 </td>
	<td> &a.imp;</td>
      </tr>

      <tr>
	<td> VM </td>
	<td> &status.wip; </td>
	<td> 4 October 2003 </td>
	<td> &a.alc;</td>
      </tr>

      <tr>
	<td> Buffer cache </td>
	<td> &status.wip; </td>
	<td> 4 October 2003 </td>
	<td> &a.jeff;, &a.phk; </td>
      </tr>

      <tr>
	<td> VFS </td>
	<td> &status.done; </td>
	<td> 24 January 2005 </td>
	<td> &a.jeff; </td>
      </tr>

      <tr>
	<td> Processes and thread operations </td>
	<td> &status.wip; </td>
	<td> 5 May 2003 </td>
	<td> &a.jhb; </td>
      </tr>

      <tr>
	<td> Scheduler </td>
	<td> &status.done; </td>
	<td> 23 April 2004 </td>
	<td> &a.jhb;, &a.jeff; </td>
      </tr>

      <tr>
	<td> GEOM </td>
	<td> &status.done; </td>
	<td> 5 February 2003 </td>
	<td> &a.phk; </td>
      </tr>

      <tr>
	<td> File descriptors </td>
	<td> &status.done; </td>
	<td> 5 February 2003 </td>
	<td> &a.alfred;, &a.tanimura;, &a.rwatson; </td>
      </tr>

      <tr>
	<td> TTY subsystem </td>
	<td> &status.done; </td>
	<td> 20 August 2008 </td>
	<td> &a.ed; </td>
      </tr>

      <tr>
	<td> Pipe IPC </td>
	<td> &status.done; </td>
	<td> 4 October 2003 </td>
	<td> &a.alfred; </td>
      </tr>

      <tr>
	<td> Socket structures and system calls </td>
	<td> &status.done; </td>
	<td> 25 November 2004 </td>
	<td> &a.sam;, &a.rwatson; </td>
      </tr>

      <tr>
	<td> KQueue </td>
	<td> &status.done; </td>
	<td> 24 November 2004 </td>
	<td> &a.jmg;, &a.green; </td>
      </tr>

      <tr>
	<td> IPv4 </td>
	<td> &status.done; </td>
	<td> 23 April 2004 </td>
	<td> &a.jennifer;, &a.hsu;, &a.sam;, &a.rwatson;, &a.gnn; </td>
      </tr>

      <tr>
	<td> IPv6 </td>
	<td> &status.wip; </td>
	<td> 01 July 2005 </td>
	<td> &a.rwatson;, &a.gnn; </td>
      </tr>

      <tr>
	<td> IPX/SPX </td>
	<td> &status.done; </td>
	<td> 09 January 2005 </td>
	<td> &a.rwatson; </td>
      </tr>

      <tr>
	<td> netatalk </td>
	<td> &status.done; </td>
	<td> 02 February 2005 </td>
	<td> &a.rwatson; </td>
      </tr>

      <tr>
	<td> Network stack infrastructure </td>
	<td> &status.done; </td>
	<td> 28 August 2004 </td>
	<td> &a.hsu;, &a.sam;, &a.rwatson;, &a.mlaier;, &a.luigi;, Maurycy Pawlowski-Wieronski &lt;maurycy@fouk.org&gt;, &a.brooks;,
	  &a.rik; </td>
      </tr>

      <tr>
	<td> NFS Client </td>
	<td> &status.done; </td>
	<td> 19 May 2006 </td>
	<td> &a.mohans; </td>
      </tr>

      <tr>
	<td> NFS Server </td>
	<td> &status.wip; </td>
	<td> 24 February 2007 </td>
	<td> &a.rwatson;, &a.jeff; </td>
      </tr>

    </table>

    <a name="tasks"></a>
    <h2>Tasks (Historical)</h2>

    <p>Following is an incomplete list of general tasks.</p>

    <table class="tblbasic">
      <tr class="heading">
	<th> Task </th>
	<th> Responsible </th>
	<th> Last updated </th>
	<th> Status </th>
      </tr>

      <tr>
	<td> Convert the giant lock from spinning to blocking, add the
	  scheduler lock, add per-CPU idle processes. </td>
	<td> &a.dillon; </td>
	<td> 25 June 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Port the BSD/OS locking primitives (i386). </td>
	<td> &a.jake; </td>
	<td> 3 July 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Implement heavy-weight interrupt threads (i386). </td>
	<td> &a.grog; </td>
	<td> 3 August 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Rewrite the low level interrupt code (i386 UP). </td>
	<td> &a.grog; </td>
	<td> 3 August 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Demonstrated reasonable stability (self-hosted buildworld)
	  (i386 UP). </td>
	<td> -smp developers </td>
	<td> 12 August 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Port the BSD/OS locking primitives (alpha). </td>
	<td> &a.dfr; </td>
	<td> 24 August 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Stub out (disable) spl()s. </td>
	<td> &a.grog; </td>
	<td> 30 August 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Port the BSD/OS ktr code. </td>
	<td> &a.grog;, &a.jhb; </td>
	<td> 30 August 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Rewrite the low level interrupt code (i386 SMP). </td>
	<td> &a.jhb; </td>
	<td> 1 September 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Demonstrated reasonable stability (self-hosted buildworld)
	  (i386 SMP). </td>
	<td> -smp developers </td>
	<td> 6 September 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Demonstrated reasonable stability (self-hosted buildworld)
	  (alpha). </td>
	<td> -smp developers </td>
	<td> 6 September 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make malloc and friends thread-safe. </td>
	<td> &a.jasone; </td>
	<td> 10 September 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Implement msleep(), make tsleep() an msleep() wrapper. </td>
	<td> &a.jake; </td>
	<td> 11 September 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make fxp driver thread-safe. </td>
	<td> &a.cp; </td>
	<td> 17 September 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make mbuf's thread-safe. </td>
	<td> &a.bmilekic; </td>
	<td> 29 September 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock manager re-work. </td>
	<td> &a.jasone; </td>
	<td> 3 October 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Implement heavy-weight interrupt threads (alpha). </td>
	<td> &a.jhb;, &a.dfr; </td>
	<td> 5 October 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Rewrite the low level interrupt code (alpha). </td>
	<td> &a.dfr;, &a.jhb; </td>
	<td> 5 October 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Process accounting. </td>
	<td> &a.tegge;, &a.jhb; </td>
	<td> 5 October 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make ethernet drivers thread-safe. </td>
	<td> &a.wpaul; </td>
	<td> 15 October 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make the mutex headers mostly machine-independent. </td>
	<td> &a.jhb; </td>
	<td> 20 October 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Rename SMP_DEBUG to MUTEX_DEBUG. </td>
	<td> &a.jhb; </td>
	<td> 20 October 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Give each soft interrupt its own thread. </td>
	<td> &a.cp; </td>
	<td> 25 October 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make sf_bufs (sendfile(2)) thread-safe. </td>
	<td> &a.bmilekic; </td>
	<td> 5 November 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make the witness code work correctly. </td>
	<td> &a.jhb; </td>
	<td> 18 November 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Split the ktr-specific code out of db_interface.c. </td>
	<td> &a.jhb;  </td>
	<td> 15 December 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Convert the sio driver to using a spin mutex. </td>
	<td> &a.jhb; </td>
	<td> 18 December 2000 </td>
	<td> &status.done; </td>
      </tr>
  	
      <tr>
	<td> Implement condition variables. </td>
	<td> &a.jake;, &a.jasone; </td>
	<td> 15 January 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add a flag to mtx_init() (MTX_RECURSE) that denotes
	  whether a mutex is allowed to recurse. </td>
	<td> &a.bmilekic; </td>
	<td> 19 January 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make the zone allocator thread-safe. </td>
	<td> &a.des; </td>
	<td> 21 January 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Convert simplelocks to mutexes. </td>
	<td> &a.jasone; </td>
	<td> 24 January 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make kernel preemptive with respect to interrupts. </td>
	<td> &a.jake; </td>
	<td> 31 January 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Cleanup of mutex API. </td>
	<td> &a.bmilekic; </td>
	<td> 8 February 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Remove COM_LOCK. </td>
	<td> &a.markm; </td>
	<td> 11 February 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Merge various scheduling classes into one run queue.
	  Modify scheduler to support preemptable kernel. </td>
	<td> &a.jake; </td>
	<td> 11 February 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make priority propagation work correctly. </td>
	<td> &a.jake; </td>
	<td> 11 February 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make most of the interrupt thread code MI and shared
	  between hardware and software interrupts. </td>
	<td> &a.jhb; </td>
	<td> 18 February 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add protection to struct jail and jail-related functionality. </td>
	<td> &a.rwatson; </td>
	<td> 20 February 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Implement sx (shared/exclusive) locks. </td>
	<td> &a.jasone; </td>
	<td> 5 March 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Generalize/improve witness to handle more complex locking
	  primitives (mtx, sx). </td>
	<td> &a.jhb; </td>
	<td> 28 March 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Convert the allproc and proctree locks from lockmgr locks
	  to sx locks. </td>
	<td> &a.jhb; </td>
	<td> 28 March 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make mbuf system use condition variables instead of
	  msleep()/wakeup(). </td>
	<td> &a.bmilekic; </td>
	<td> 2 April 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Remove &lt;sys/mutex.h&gt; includes from other kernel
	  headers such as &lt;vm/vm_zone.h&gt;, &lt;sys/resourcevar.h&gt;,
	  &lt;sys/ucred.h&gt;, and &lt;sys/mbuf.h&gt;. </td>
	<td> &a.markm; </td>
	<td> 15 May 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Cleanup the various mp_machdep.c's, unify various SMP
	  API's such as IPI delivery, etc. </td>
	<td> &a.jhb; </td>
	<td> 15 May 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make most of the forward_* and forwarded_* functions MI. </td>
	<td> &a.jhb; </td>
	<td> 15 May 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Complete the MD support for SMP on the Alpha platform.</td>
	<td> &a.gallatin;, &a.dfr;, &a.jhb; </td>
	<td> 15 May 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Convert select() to use condition variables. </td>
	<td> &a.tanimura; </td>
	<td> 15 May 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add a "giant" lock around the VM subsystem. </td>
	<td> &a.alfred; </td>
	<td> 13 June 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Introduce a modified slab allocator for the mbuf subsystem. </td>
	<td> &a.bmilekic; </td>
	<td> 21 June 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add a witness_assert() function to handle lock assertions. </td>
	<td> &a.jhb; </td>
	<td> 27 June 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Extend sx locks to support try lock operations. </td>
	<td> &a.jhb; </td>
	<td> 27 June 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Document KTR. </td>
	<td> &a.jhb; </td>
	<td> 28 June 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make fork_return, fork_exit, ast, and userret MI. </td>
	<td> &a.jhb; </td>
	<td> 29 June 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make sched_lock's savecrit a per-process property saved
	  and restored in mi_switch and initialized in fork_exit. </td>
	<td> &a.jhb; </td>
	<td> 30 June 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make ast() loop. </td>
	<td> &a.jhb; </td>
	<td> 10 August 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add upgrade/downgrade sx lock operations. </td>
	<td> &a.kan;, &a.jasone; </td>
	<td> 13 August 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Implement semaphores. </td>
	<td> &a.jasone; </td>
	<td> 14 August 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add support for upgrade/downgrades in witness. </td>
	<td> &a.jhb; </td>
	<td> 23 August 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make most of cpu_wait() and cpu_exit() MI. </td>
	<td> &a.peter; </td>
	<td> 9 September 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Split NFS into client and server. </td>
	<td> &a.peter; </td>
	<td> 18 Oct 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock taskqueues. </td>
	<td> &a.arr;, &a.jhb; </td>
	<td> 25 October 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add a per-thread ucred reference. </td>
	<td> &a.jhb; </td>
	<td> 25 October 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make most of the per-CPU stuff MI. </td>
	<td> &a.jhb; </td>
	<td> 11 December 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make critical section saved state per-thread instead of per-lock
	  so that interlocking spin locks work properly. </td>
	<td> &a.jhb; </td>
	<td> 17 December 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Replace the APIC-specific imen_mtx with a MI-named icu_lock to
	  protect interrupt controllers and associated data within the kernel
	  for both i386 and alpha. </td>
	<td> &a.jhb; </td>
	<td> 20 December 2001 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Use the per-thread critical section nesting level in the mutex
	    and interrupt thread code to automatically determine when to not
	    preempt.  This makes the MTX_NOSWITCH, SWI_SWITCH, and
	    SWI_NOSWITCH flags obsolete as the kernel will be able to figure
	    out the proper behavior on its own. </td>
	<td> &a.jhb; </td>
	<td> 5 January 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock struct filedesc and struct file. </td>
	<td> &a.tanimura;, &a.alfred; </td>
	<td> 12 January 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock struct pgrp, struct session, and struct sigio. </td>
	<td> &a.tanimura; </td>
	<td> 23 February 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock pipe implementation, but not sigio/fown, VM interactions. </td>
	<td> &a.alfred; </td>
	<td> 27 February 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Move to explicit reference counting for soft vnode references.
	  </td>
	<td> &a.phk; </td>
	<td> 8 March 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Initialize mutex pools early enough that sx locks can be used
	  for VM. </td>
	<td> &a.green; </td>
	<td> 14 March 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
        <td> Place a global lock (sellock) around selinfo structures to fix a
          variety of lock order reversals, and make select() MP-safe. </td>
        <td> &a.alfred;, &a.davidc; </td>
        <td> 14 March 2002 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
	<td> Push down Giant on read, write, pread, pwrite system calls,
	  acquiring Giant in the per-subsystem fileop layer for sockets, VFS,
	  etc.</td>
	<td> &a.alfred; </td>
	<td> 15 March 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock down kernel module structures. </td>
	<td> &a.arr; </td>
	<td> 18 March 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock down kernel linker globals.</td>
	<td> &a.arr; </td>
	<td> 18 March 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Rewrite kernel memory allocator to be a slab allocator that
	  uses per-cpu caches. </td>
	<td> &a.jeff; </td>
	<td> 21 March 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Replace incorrect use of MD critical section API to disable
	  interrupts with a specific interrupt disable API. </td>
	<td> &a.imp;, &a.dfr;, &a.benno;, &a.jhb; </td>
	<td> 21 March 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock down access to the shared p_args "process arguments"
	  structure through appropriate protection of that structure and
	  references to it. </td>
	<td> &a.mini; </td>
	<td> 31 March 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Move from flags/tsleep lock to sx locks to protect sysctl
	  tree from updates during sysctl operations. </td>
	<td> &a.mini; </td>
	<td> 1 April 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Create/port userland tool to manage KTR event dumps. </td>
	<td> &a.jake; </td>
	<td> 1 April 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Create MTX_SYSINIT and SX_SYSINIT macros that allow for
	  initializing locks that are subsystem independent. </td>
	<td> &a.arr; </td>
	<td> 2 April 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
 	<td> Lock down the global securelevel variable. </td>
	<td> &a.arr; </td>
	<td> 2 April 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make grow_stack() MI.  Possibly even a macro or inline. </td>
	<td> &a.alc; </td>
	<td> 6 April 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock use of p_fd, which otherwise can result in corrupted
	  p_fd panics during heavy operation.  Start with a global,
	  and move to per-proc locking. </td>
	<td> &a.alfred;, &a.tanimura; </td>
	<td> 8 April 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock struct pargs. </td>
	<td> &a.mini; </td>
	<td> 9 April 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock sysctl hierarchy. </td>
	<td> &a.mini; </td>
	<td> 9 April 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make {o,}sigreturn() MPSAFE. </td>
	<td> &a.alc; </td>
	<td> 11 April 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Rewrite kernel memory allocator so that Giant is not required
	  for malloc() or free(). </td>
	<td> &a.jeff; </td>
	<td> 2 May 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Replace complex shared/exclusive locking scheme in the VM
	  system with a purely exclusive lockmgr locking scheme, simplifying
	  locking and removing potential livelock/deadlock scenarios. </td>
	<td> &a.green;, &a.alc; </td>
	<td> 3 May 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Push down Giant into readv/writev system calls in style of
	  read/write/pread/pwrite once malloc no longer requires Giant in
	  the handling of iovec structures for uio. </td>
	<td> &a.alc; </td>
	<td> 9 May 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Push down Giant in mprotect(), minherit(), and madvise() so
	  that it is no longer acquired and released directly. </td>
	<td> &a.alc; </td>
	<td> 18 May 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Update suser() and p_can*() APIs to accept threads instead of
	  processes. </td>
	<td> &a.jhb; </td>
	<td> 18 May 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Broadly transition to td_ucred from p_ucred once KSE dependencies
	  are in place. </td>
	<td> &a.jhb; </td>
	<td> 18 May 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add a witness_sleep() check to uma_zalloc() to catch code
	  calling malloc() or uma_zalloc() while holding non-sleepable
	  locks. </td>
	<td> &a.jhb; </td>
	<td> 20 May 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Optimize UP support by changing spin locks to only perform
	  critical section enter and exits. </td>
	<td> &a.jhb; </td>
	<td> 21 May 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make sleep mutexes spin if the current lock holder is
	    executing on another CPU. </td>
	<td> &a.jhb; </td>
	<td> 21 May 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add support for the IA32 pause instruction to spin loops in
	  locks. </td>
	<td> &a.jhb; </td>
	<td> 21 May 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make KTRACE write into tracefiles asynchronously. </td>
	<td> &a.jhb; </td>
	<td> 7 June 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
        <td> Remove Giant from modnext(2), modfnext(2),
          modstat(2),and modfind(2).</td>
        <td> &a.arr; </td>
        <td> 25 June 2002 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
	<td> Fix synchronization of TLB flushes and invlpg() on x86 SMP. </td>
	<td> &a.peter; </td>
	<td> 12 July 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add KTR(9) tracing for mutex contention. </td>
	<td> &a.iedowse; </td>
	<td> 26 Augist 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make cpu_coredump MI. </td>
	<td> &a.peter; </td>
	<td> 7 September 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add a subsystem lock to the accounting code. </td>
	<td> &a.arr; </td>
	<td> 11 September 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Allow KTR(9) to write trace records to alq(9) record facility.
	  </td>
	<td> &a.jeff; </td>
	<td> 22 September 2002 </tD>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Create mechanism in cdevsw structure to protect
	  thread-unsafe drivers. </td>
	<td> &a.phk; </td>
	<td> 27 September 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Fix SIGXPU and other #if 0'd things in mi_switch(). </td>
	<td> &a.jhb; </td>
	<td> 30 September 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock down TrustedBSD MAC implementation. </td>
	<td> &a.rwatson; </td>
	<td> 11 November 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock eventhandlers. </td>
	<td> &a.msmith;, &a.mini;, &a.jhb; </td>
	<td> 11 March 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Fix PHOLD() so that it blocks to guarantee PS_INMEM. </td>
	<td> &a.jhb; </td>
	<td> 22 April 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Fix various procfs_machdep.c to not use sched_lock. </td>
	<td> &a.jhb; </td>
	<td> 22 April 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock all references to process credentials and remove Giant
	  from process credential-related system calls. </td>
	<td> &a.jhb; </td>
	<td> 1 May 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Merge the procsig and sigacts structures, move the new sigacts
	  structure out of the U-area and add appropriate locking. </td>
	<td> &a.jhb; </td>
        <td> 13 May 2003 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
	<td> Remove Giant from the kill() and killpg() system calls. </td>
	<td> &a.jhb; </td>
        <td> 13 May 2003 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
	<td> Enhance the mutex pool implementation to allow creation and
	  use of multiple, dynamically allocated pools with adjustable pool
	  sizes and mutex options. </td>
	<td> &a.truckman; </td>
        <td> 16 July 2003 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
	<td> Create mutex profiling tool for the kernel so as to measure
	  contention and behavior of kernel mutexes. </td>
	<td> &a.eivind;, &a.des; </td>
	<td> 31 March 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock down linker_file_t structures in the kernel linker.</td>
	<td> &a.arr; </td>
	<td> 19 June 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock pipe implementation: VM optimizations. </td>
	<td> &nbsp; </td>
	<td> 4 October 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
        <td> Reimplement i386 interrupt and SMP code so that SMP kernels
	  work on UP boxes and SMP can be enabled in GENERIC. </td>
        <td> &a.jhb; </td>
        <td> 3 November 2003 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
        <td> Implement generic turnstiles to use when blocking on non-sleepable
	  locks. </td>
        <td> &a.jhb; </td>
        <td> 11 November 2003 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
	<td> Split witness_lock() into witness_checkorder() and
	  witness_lock().  witness_checkorder() would be called before
	  acquiring a lock to increase the changes of detecting and warning
	  about a reversal prior to deadlocking.  witness_lock() would
	  simply update witness' internal state to note that a lock has
	  been acquired. </td>
	<td> &a.jhb; </td>
	<td> 24 January 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock per-process resource limits. </td>
	<td> &a.mtm;, &a.jhb; </td>
	<td> 4 February 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
        <td> Implement a sleep queue abstraction to be used by both msleep()
	  and condition variables.  This new abstraction should use a hash
	  table of sleep queues with a spin lock on each sleep queue chain
	  similar to turnstile chain locks to make sched_lock finger
	  grained.</td>
        <td> &a.jhb; </td>
        <td> 27 February 2004 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
        <td> Remove Giant from jail(2). </td>
        <td> &a.arr;, &a.rwatson; </td>
        <td> 23 April 2004 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
	<td> Add subsystem locking to NFSv2, NFSv3 server, permitting upcalls
	  and other network-related elements to run Giant-free. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add KTR(9) tracing for UMA allocation/free events. </td>
	<td> &a.rwatson; </td>
	<td> 05 August 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add KTR(9) tracing for GEOM I/O events. </td>
	<td> &a.rwatson; </td>
	<td> 21 October 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add KTR(9) tracing for busdma events. </td>
	<td> &a.rwatson; </td>
	<td> 23 October 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add KTR(9) tracing for critical sections. </td>
	<td> &a.rwatson; </td>
	<td> 07 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make the kernel fully preemptive. </td>
	<td> &a.jhb; </td>
	<td> 24 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock pipe implementation: sigio/fown-related evil. </td>
	<td> &a.alfred; </td>
	<td> 24 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
       <td> Lock down the SysV IPC code. </td>
	<td> &a.alfred; </td>
	<td> 24 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock contention measurement tool to measure heat of various
	  locks, including Giant, and permit more directed performance and
	  locking strategy optimization. </td>
	<td> &a.rwatson; </td>
	<td> 24 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add KTR(9) tracing to scheduler run queues. </td>
	<td> &a.jeff; </td>
	<td> 26 December 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Review locking strategy and correctness of VFS operations
	  and fix up various failure modes associated with enabling
	  VFS locking assertions. </td>
	<td> &a.jeff; </td>
	<td> 01 January 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Document in-vnode locking strategy, clean it up. </td>
	<td> &a.jeff; </td>
	<td> 01 January 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Run cross-file system VFS without Giant, acquiring Giant
	  conditionally based on a file system flag. </td>
	<td> &a.jeff; </td>
	<td> 01 January 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Run UFS file system MPSAFE. </td>
	<td> &a.jeff; </td>
	<td> 01 January 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add KTR(9) tracing for buffer cache events. </td>
	<td> &a.jeff; </td>
	<td> 24 January 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Break out critical section and spin lock APIs, and re-optimize
	  critical sections to not disable interrupts in hardware due to
	  the high cost on some hardware architectures. </td>
	<td> &a.jhb; </td>
	<td> 04 April 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Modify uma(9) to use critical sections to protect per-CPU
	  statistics, instead of mutexdes, in order to optimize access. </td>
	<td> &a.rwatson; </td>
	<td> 29 April 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Migrate malloc(9) to per-CPU statistics, and use critical
	  sections to optimize access to those statistics. </td>
	<td> &a.rwatson; </td>
	<td> 29 May 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add KTR(9) support for KTR_VFS to trace additional VFS events,
	  rather than mechanically inserted KTR_VOP events. </td>
	<td> &a.jeff; </td>
	<td> 11 June 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Push the grabbing of Giant into Linux i386 ABI system calls.</td>
	<td> &a.jhb; </td>
	<td> 13 July 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Push the grabbing of Giant into Linux AXP ABI system calls.</td>
	<td> &a.jhb; </td>
	<td> 13 July 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Push the grabbing of Giant into SVR4 i386 ABI system calls.</td>
	<td> &a.jhb; </td>
	<td> 13 July 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Push the grabbing of Giant into OSF/1 AXP ABI system calls.</td>
	<td> &a.jhb; </td>
	<td> 13 July 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Push the grabbing of Giant into IBCS i386 ABI system calls.</td>
	<td> &a.jhb; </td>
	<td> 13 July 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add a new witness check for exiting threads to verify that
	  an exiting thread holds no locks. </td>
	<td> &a.jhb; </td>
	<td> 2 September 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
        <td> Implement atomic_fetchadd() for ints. </td>
        <td> &a.jhb; </td>
        <td> 27 September 2005 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
        <td> Implement a simple reference count API using atomic operations and
	  use this to replace locks that just protect a reference count. </td>
        <td> &a.jhb; </td>
        <td> 27 September 2005 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
	<td> Split the interrupt handler list out of struct ithread into
	  its own structure and only start up kthreads for interrupt
	  vectors that actually have threaded interrupt handlers. </td>
	<td> &a.jhb; </td>
	<td> 25 October 2005 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock aio(4). </td>
	<td> &a.davidxu; </td>
	<td> 22 January 2006 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Implement reader/writer locks. </td>
	<td> &a.jhb; </td>
	<td> 27 January 2006 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
        <td> Remove the MPSAFE syscall flag from the syscall table. </td>
        <td> &a.jhb; </td>
        <td> 28 July 2006 </td>
        <td> &status.done; </td>
      </tr>

      <tr>
	<td> Add sufficient synchronization to printf to avoid printing
	  problems but not so much it doesn't work in debugging contexts. </td>
	<td> &a.jb; </td>
	<td> 1 November 2006 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Expand mutex profiling tool to also profile sx locks. </td>
	<td> &a.kmacy; </td>
	<td> 11 November 2006 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock down the TTY subsystem. </td>
	<td> &a.ed; </td>
	<td> 20 August 2008 </td>
	<td> &status.done; </td>
      </tr>

      <!-- WIP -->

      <tr>
	<td> Lock struct proc. </td>
	<td> &a.jhb; </td>
	<td> 20 February 2001 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Fix clock locking to be the same on all platforms. </td>
	<td> &a.jhb; </td>
	<td> 16 November 2001 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Make use of process locking and process reference counting
	  to protect debugging interfaces (and procfs). </td>
	<td> &a.jhb; </td>
	<td> 27 February 2002 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Make use of process locking to protect process monitoring
	  sysctls, including those employed by 'ps' and related tools.
	<td> &a.jhb; </td>
	<td> 27 February 2002 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Lock down newbus infrastructure to support driver
	  fine-graining. </td>
	<td> &a.imp; </td>
	<td> 28 February 2002 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> SMPng architecture document. </td>
	<td> &a.jhb;, &a.rwatson; </td>
	<td> 28 February 2002 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Move to shared lock for VOP_GETATTR() to reduce blocking during
	  frequent lightweight VFS operations.  Modify namei() to provide
	  a LOOKUP_SHARED flag to indicate when the lock required may be
	  shared instead of exclusive. </td>
	<td> &a.jeff; </td>
	<td> 11 March 2002 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Document existing vm_map locking and verify it's correctness. </td>
	<td> &a.alc; </td>
	<td> 18 May 2002 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Document existing vm_object locking and verify it's
	  correctness. </td>
	<td> &a.alc; </td>
	<td> 4 May 2002 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Implement lazy interrupt thread switching (context
	  stealing) on i386. </td>
	<td> &a.bmilekic;, &a.kan; </td>
	<td> 10 December 2002 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Implement lazy interrupt thread switching (context
	  stealing) on sparc64. </td>
	<td> &a.jake; </td>
	<td> 10 December 2002 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Switch from using lockmgr in VM to using a mutex or exclusive
	  sxlock.  Push down Giant on all VM except for vm_object/VFS and
	  vm_page/pmap components. </td>
	<td> &a.alc; </td>
	<td> 10 December 2002 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Modify device driver API to permit drivers to more easily
	  split "in interrupt context" and "in interrupt thread"
	  code so as to acknowledge interrupts faster.  This will permit
	  lower latency in interrupt handling. </td>
	<td> &a.piso; </td>
	<td> 24 February 2007 </td>
	<td> &status.wip; </td>
      </tr>

      <!-- Stalled -->

      <!-- Not Started -->

      <tr>
	<td> Conditionalize atomic ops in the SMP code that are used
	  for debugging statistics. </td>
	<td> &a.peter; </td>
	<td> 15 March 2001 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Axe schedcpu() in favor of event driven priority updates as
	  much as possible. </td>
	<td> &nbsp; </td>
	<td> 7 September 2001 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Fix *hold (e.g. crhold) to return reference to object. </td>
	<td> &nbsp; </td>
	<td> 7 September 2001 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Add witness checking for lockmgr locks. </td>
	<td> &nbsp; </td>
	<td> 7 September 2001 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Add ICU spin locks on ia64. </td>
	<td> &nbsp; </td>
	<td> 4 January 2002 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Add a witness_sleep() check to copyin/out() and s/fuword(). </td>
	<td> &a.jhb; </td>
	<td> 7 June 2002 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Remove Giant from mi_startup() and push Giant down into
	  individual SYSINIT functions.  Many SYSINIT functions probably do
	  not need Giant anyway. </td>
	<td> &nbsp; </td>
	<td> 21 October 2005 </td>
	<td> &status.new; </td>
      </tr>

<!--
      <tr>
        <td>  </td>
        <td> &nbsp; </td>
        <td> D M 2002 </td>
        <td> &status.new; </td>
      </tr>

-->
    </table>

    <p>This table lists the todo subtasks for multithreading the network
      stack.</p>

    <table class="tblbasic">
      <tr class="heading">
	<th> Task </th>
	<th> Responsible </th>
	<th> Last updated </th>
	<th> Status </th>
      </tr>

      <tr>
	<td> Protect network interface queues. </td>
	<td> &a.jlemon; </td>
	<td> 24 November 2000 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock up IP. </td>
	<td> &a.jennifer;, &a.hsu; </td>
	<td> 10 June 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock up TCP. </td>
	<td> &a.jennifer;, &a.hsu;, &a.sam;, &a.rwatson;</td>
	<td> 24 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock up UDP. </td>
	<td> &a.jennifer;, &a.hsu;, &a.rwatson; </td>
	<td> 24 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock ifaddr reference counts. </td>
	<td> &a.hsu; </td>
	<td> 18 December 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock up ifnet list. </td>
	<td> &a.hsu; </td>
	<td> 21 December 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock radix trees. </td>
	<td> &a.hsu; </td>
	<td> 23 December 2002 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock up ARP. </td>
	<td> &a.hsu; </td>
	<td> 16 January 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock up raw IP. </td>
	<td> &a.sam;, &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock divert sockets. </td>
	<td> &a.sam; </td>
	<td> 4 October 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock ipfw2. </td>
	<td> &a.sam; </td>
	<td> 4 October 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock DUMMYNET. </td>
	<td> &a.sam; </td>
	<td> 4 October 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock ethernet bridge. </td>
	<td> &a.sam; </td>
	<td> 4 October 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock IP fragment queues. </td>
	<td> &a.rwatson; </td>
	<td> 4 October 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock routing entries. </td>
	<td> &a.sam; </td>
	<td> 4 October 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock FAST_IPSEC. </td>
	<td> &a.sam; </td>
	<td> 4 October 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Permit parallel entry into isr processing. </td>
	<td> &a.rwatson;, &a.sam; </td>
	<td> 11 October 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock if_disc "discard interface". </td>
	<td> &a.rwatson; </td>
	<td> 9 March 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock if_faith "IPv6-to-IPv4 TCP relay interface. " </td>
	<td> &a.sam;, &a.rwatson; </td>
	<td> 9 March 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock if_gif "generic tunnel interface". </td>
	<td> &a.rwatson; </td>
	<td> 9 March 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Review ECN tunnel support (ip_ecn.c). </td>
	<td> &a.rwatson; </td>
	<td> 9 March 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> if_tap global and softc locking. </td>
	<td> &a.rwatson; </td>
	<td> 23 April 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> if_tun global and softc locking. </td>
	<td> &a.rwatson; </td>
	<td> 23 April 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> netatalk/aarp.c locking. </td>
	<td> &a.rwatson; </td>
	<td> 23 April 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Cache socket MAC label in inpcb label for IPv4 sockets so that
	  the label can be used safely at the inet layer without socket
	  locks. </tD>
	<td> &a.rwatson; </td>
	<td> 23 April 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> IP encapsulation subroutines (ip_encap.c). </td>
	<td> &a.rwatson; </td>
	<td> 23 April 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock globals in loopback interface (if_loop.c). </td>
	<td> &a.rwatson; </td>
	<td> 23 April 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Use m_tags in if_gif to limit looping configurations, rather
	  than a non-MPSAFE static coutner. </td>
	<td> &a.ru; </td>
	<td> 23 April 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> netatalk DDP PCB locking. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock up syncache. </td>
	<td> &a.hsu;, &a.sam; </td>
	<td> 10 November 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Permit IP forwarding path to run Giant-free. </td>
	<td> &a.sam; </td>
	<td> 1 December 2003 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock &unix; domain protocols, fifofs. </td>
	<td> &a.sam;, &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Giant lock over NFS server to protect against so_upcall() w/o Giant </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock interface cloning meta-data. </td>
	<td> &a.brooks; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Apply combination of socket and socket buffer locks, label caching
	  to MAC labels on sockets so that they can be used safely without
	  Giant. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Make routing socket message dispatch use a netisr to avoid
	  re-entering the socket code from the routing code, resolving lock
	  order issues. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Introduce accept locking to protect accept incomplete and
	  complete queues on listen sockets. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Break out socket buffer wakeup, socket buffer append, socket
	  state change, socket buffer reserve, flush, etc, calls into
	  _locked() and unlocked versions, and avoid conditional locking.
	  </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock down AARP, AppleTalk Address Resolution Protocol. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Fix pull/push cache data synchronization issues in sosend(),
	  soreceive(), allowing them to run Giant-free. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Protect socket global counters/limits and generation number
	  with a mutex. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock down unit allocation meta-data in interface related
	  netgraph modules. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock down socket buffer OOB fields across TCP/IP, IPX. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add MSG_NBIO so that fifofs can avoid frobbing SO_NBIO in
	  a manner that risks races. </td>
	<td> &a.truckman; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Protect all use of so_count with socket lock. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Move socket buffer related state from so_state to sb_state so
	  it can be properly locked by the socket buffer mutex. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Introduce a temporary global lock to lock the if_label field
	  used by the MAC Framework. </tD>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Push VFS-specific behavior out of fdrop_locked() and acquire
	  Giant in the fo_close per-object methods rather than
	  fdrop_locked(), so that pipes and sockets can run fo_close()
	  Giant-free. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Push Giant acquisition into fo_stat() file descriptor stat
	  operation, rather than acquiring it in fstat(), so that fstat()
	  on sockets and pipes can run Giant-free. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Don't hold socket locks over entry to protocol switch methods,
	  allowing protocol methods to acquire socket locks after protocol
	  locks in the lock order. </td>
	<td> &a.rwatson; </td>
	<td> 24 July 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Port inpcb mutex locking, assertions from IPv4 to IPv6. </td>
	<td> &a.rwatson; </td>
	<td> 8 August 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add IFF_NEEDSGIANT to allow if_start to run with Giant for
	  specific interfaces.  Defer if_start to task queue. </td>
	<td> &a.rwatson; </td>
	<td> 8 August 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Push down Giant in stat(), fo_stat() to allow Giant-free stat
	  of pipes, sockets. </td>
	<td> &a.rwatson; </td>
	<td> 8 August 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Add TCP lock assertions. </td>
	<td> &a.rwatson; </td>
	<td> 24 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock socket layer. </td>
	<td> &a.sam;, &a.rwatson; </td>
	<td> 24 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Review TCP timer code. </td>
	<td> &a.rwatson; </td>
	<td> 24 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Analyze and reduce cost of entropy gathering in network critical
	  paths. </td>
	<td> &a.rwatson;, &a.markm; </td>
	<td> 24 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Allow code to declare NET_NEEDS_GIANT(), forcing Giant over the
	  network stack if that code is compiled into the kernel. </td>
	<td> &a.rwatson; </td>
	<td> 28 August 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Disable Giant over the network stack in the default
	  configuration. </td>
	<td> &a.rwatson; </td>
	<td> 28 August 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Additional KTR tracing for UMA, callouts, interrupts, etc. </td>
	<td> &a.rwatson; </td>
	<td> 07 November 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Move to using file descriptor reference counts instead of
	  socket reference counts for socket system calls, avoiding extra
	  reference couht operations. </td>
	<td> &a.rwatson; </td>
	<td> 24 October 2004 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Lock down netnatm. </td>
	<td> &a.rwatson; </td>
	<td> April 2006 </td>
	<td> &status.done; </td>
      </tr>

      <tr>
	<td> Default to direct dispatch from ithreads </td>
	<td> &a.rwatson; </td>
	<td> 28 November 2006 </td>
	<td> &status.done; </td>
      </tr>

      <!-- WIP -->

      <tr>
	<td> Lock IPv6. </td>
	<td> &a.sam;, &a.rwatson;, &a.ume;, &a.mlaier; </td>
	<td> 8 August 2004 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> if_ppp global, per-softc locking. </td>
	<td> &a.rwatson;, Maurycy Pawlowski-Wieronski &lt;maurycy@fouk.org&gt; </td>
	<td> 23 April 2004 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Lock struct ifnet. </td>
	<td> &a.mlaier;, &a.luigi;, Maurycy Pawlowski-Wieronski &lt;maurycy@fouk.org&gt; </td>
	<td> 23 April 2004 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Lock IPv4, IPv6, atalk interface address lists. </td>
	<td> &a.mlaier;, &a.rwatson; </td>
	<td> 8 August 2004 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Lock consumers of BSD compress (bsd_comp.c) code to protect
	  compression state. </td>
	<td> &a.rwatson; </td>
	<td> 23 April 2004 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Lock global and softc state for six-to-four converter (if_stf.c). </td>
	<td> &a.rwatson; </td>
	<td> 23 April 2004 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Lock down global and softc state for SLIP (if_sl.c). </td>
	<td> &a.rwatson; </td>
	<td> 23 April 2004 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Lock global and softc state for SPPP (if_sppsubr.c). </td>
	<td> &a.rik;, &a.rwatson; </td>
	<td> 23 April 2004 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> IGMP locking. </td>
	<td> &a.rwatson; </td>
	<td> 23 April 2004 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> IP ID locking. </td>
	<td> &a.ups; </td>
	<td> 24 June 2005 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> Locking for polling(4). </td>
	<td> &a.pjd;, &a.glebius; </td>
	<td> 19 October 2005 </td>
	<td> &status.wip; </td>
      </tr>

      <tr>
	<td> BPF locking needs some cleanup, there are some race conditions there relating to interface removal. </td>
	<td> &a.csjp; </td>
	<td> 2 June 2006 </td>
	<td> &status.wip; </td>
      </tr>

      <!-- Not Started -->

      <tr>
	<td> Reduce contention upon locking a socket buffer by replacing
	     tsleep() and wakeup() with a condvar. </td>
	<td> &a.tanimura; </td>
	<td> 21 April 2002 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Lock if_ef "ethernet frame" driver. </td>
	<td> &nbsp; </td>
	<td> 9 March 2004 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Further cleanup of socket state machine in order to facilitate finishing socking locking of state transitions. </td>
	<td> &a.rwatson; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Lock KAME IPSEC. </td>
	<td> &nbsp; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Only one of our ATM stacks is MPSAFE, the other two should be deleted or fixed. </td>
	<td> &nbsp; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Lock ND6 (IPv6 Neighbor Discovery). </td>
	<td> &a.gnn; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Lock IPv6 multicast address lists. </td>
	<td> &nbsp; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Lock IPv4 and IPv6 global address lists. </td>
	<td> &nbsp; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Continued cleanup of the stack/device driver ownership and locking for struct ifnet needs to be done. Most fields are now either locked or assigned ownership. Some fields, such as if_flags, need a bit more cleanup due to device drivers modifying stack-owned fields. </td>
	<td> &a.rwatson; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> When interfaces are torn down, there are a number of races (not all associated with SMPng) that need to be thought about. </td>
	<td> &nbsp; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Lock if_vlan and inter-layer multicast address manipulation and synchronization in if_vlan. </td>
	<td> &a.glebius;, &a.yar; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Further investigate locking in in_gif and in6_gif. </td>
	<td> &nbsp; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> FAST_IPSEC and KAME IPSEC's PF_KEY support likely needs an asynchronous dispatch to prevent socket lock ordering issues similar to what was done for PF_ROUTE. </td>
	<td> &a.rwatson; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Investigate how to eliminate the use of ACCEPT_LOCK(), which currently prevents races in the tear-down of sockets. </td>
	<td> &a.rwatson; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Fix SMP problems with netgraph restructuring. </td>
	<td> &a.glebius; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> Verify locking in netgraph nodes and improve where necessary. </td>
	<td> &a.glebius; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

      <tr>
	<td> More finely-grained locking for pf(4). </td>
	<td> &a.glebius; </td>
	<td> 19 October 2005 </td>
	<td> &status.new; </td>
      </tr>

    </table>

    <a name="issues"></a>
    <h2>Known Issues (Historical)</h2>

    <table class="tblbasic">
      <tr class="heading">
	<th> Issue </th>
	<th> Last updated </th>
	<th> Status </th>
      </tr>

      <tr>
	<td> Idle processor time is not charged to the idle processes. </td>
	<td> 20 September 2000 </td>
	<td> &status.resolved; </td>
      </tr>

      <tr>
	<td> microuptime creeps backwards. </td>
	<td> 4 October 2000 </td>
	<td> &status.resolved; </td>
      </tr>

      <tr>
	<td> microuptime() went backwards </td>
	<td> 4 October 2000 </td>
	<td> &status.resolved; </td>
      </tr>

      <tr>
	<td> Process accounting is not accurate (the more CPUs, the
	  closer to correct it is). </td>
	<td> 5 October 2000 </td>
	<td> &status.resolved; </td>
      </tr>

      <tr>
	<td> M_DEVBUF is probably the wrong memory pool for interrupt
	  stuff and we should think about creating a new malloc pool for
	  that stuff. </td>
	<td> 9 February 2001 </td>
	<td> &status.resolved; </td>
      </tr>

      <tr>
	<td> PC card eject panics due to a race condition in the
	  interrupt thread code. </td>
	<td> 15 March 2001 </td>
	<td> &status.resolved; </td>
      </tr>

      <tr>
	<td> SMP x86 boxes are seeing NCPU * 100 clk interrupts and
	  NCPU * 128 rtc interrupts. </td>
	<td> 15 May 2001 </td>
	<td> &status.resolved; </td>
      </tr>

      <tr>
	<td> Witness will infinitely recurse when it acquires Giant after
	  sleeping with a sleepable lock. </td>
	<td> 27 June 2001 </td>
	<td> &status.resolved; </td>
      </tr>

      <tr>
	<td> Serial gdb does not work if boot_ddb and boot_gdb options
	  are specified. </td>
	<td> 14 July 2002 </td>
	<td> &status.resolved; </td>
      </tr>

      <tr>
	<td> Serial gdb does not work at 115200 baud. </td>
	<td> 14 July 2002 </td>
	<td> &status.resolved; </td>
      </tr>

      <tr>
	<td> Serial gdb never regains control once 'cont' has been
	  entered. </td>
	<td> 14 July 2002 </td>
	<td> &status.resolved; </td>
      </tr>

      <!-- unresolved -->

      <tr>
	<td> Profiling is broken. </td>
	<td> 20 February 2001 </td>
	<td> &status.unresolved; </td>
      </tr>

<!--
      <tr>
        <td> </td>
        <td> D M 2002 </td>
        <td> &status.unresolved; </td>
      </tr>

-->
    </table>

    <a name="news"></a>
    <h2>News (Historical)</h2>

    <p>The remainder of this page is structured as a
      reverse-chronological log.</p>

<!--
<b> D M 2002</b>
<ul>
	<li> <p>  </p> </li>
</ul>
-->
    <b>28 August 2004</b>
    <ul>
      <li>
	<p>&a.rwatson; threw the switch to change the network stack to run
	without the Giant lock by default, permitting the network stack to be
	run on multiple CPUs at a time, as well as to preempt and be
	preempted by other code.</p>
      </li>
    </ul>
    <b>30 October 2003</b>
    <ul>
      <li>
      <p>&a.grog; submitted a
        <a href="http://www.lemis.com/grog/SMPng/Singapore/">FreeBSD SMPng paper</a> 
       	to the <a href="http://www.aeosc.org/">Asian Enterprise Open Source
        Conference</a> in Singapore.  The paper presents a historical view of
        SMPng development through 2001, but omits discussion of more recent
        progress on the SMPng project, such as substantial performance enhancements
        resulting from extensive lock pushdown in the storage subsystem, VM
        subsystem, and major IPC subsystems.</p>
      </li>
    </ul>

    <b>13 January 2002</b>
    <ul>
      <li>
      <p>A <a href =
        "http://docs.FreeBSD.org/cgi/getmsg.cgi?fetch=122646+0+archive/2002/freebsd-smp/20020113.freebsd-smp">
        status report</a> was sent to the -smp mailing list.</p>
      </li>
    </ul>

    <b>15 May 2001</b>
    <ul>
      <li>
	<p>&a.grog; has made his <a href =
	  "http://www.lemis.com/~grog/SMPng/USENIX/">USENIX paper</a> available,
	  which he will present in Boston at the end of June.</p>
      </li>
    </ul>

    <b>22 March 2001</b>
    <ul>
	<li>
	<p>A <a href =
	  "http://docs.FreeBSD.org/cgi/getmsg.cgi?fetch=41302+0+archive/2001/freebsd-smp/20010325.freebsd-smp">
	  status report</a> was sent to the -smp mailing list.</p>
      </li>
    </ul>

    <b>5 March 2001</b>
    <ul>
      <li>
	<p>A <a href =
	  "http://docs.FreeBSD.org/cgi/getmsg.cgi?fetch=0+0+archive/2001/freebsd-smp/20010311.freebsd-smp">
	  status report</a> was sent to the -smp mailing list.</p>
      </li>
    </ul>

    <b>24 January 2001</b>
    <ul>
      <li>
	<p>A <a href =
	  "http://docs.FreeBSD.org/cgi/getmsg.cgi?fetch=38125+0+archive/2001/freebsd-smp/20010128.freebsd-smp">
	  status report</a> was sent to the -smp mailing list.</p>
      </li>
    </ul>

    <b>12 January 2001</b>
    <ul>
      <li>
	<p>A <a href =
	  "http://www.FreeBSD.org/cgi/getmsg.cgi?fetch=45111+48223+/usr/local/www/db/text/2001/freebsd-smp/20010114.freebsd-smp">
	  status report</a> was sent to the -smp mailing list.</p>
      </li>
    </ul>

    <b>11 October 2000</b>
    <ul>
      <li>
	<p>&a.jhb; and &a.cp; came up with a preliminary list of
	  <a href="http://storm.uk.FreeBSD.org/~hiten/smp_synch_rules.html">rules
	  </a> that should be followed when working on kernel
	  synchronization.</p>
      </li>
    </ul>

    <b>6 September 2000</b>
    <ul>
      <li>
	<p>The SMP code has been committed.  All further work is being
	  done in cvs rather than with patches.</p>
      </li>

      <li>
	<p>An updated <a
	  href="http://people.FreeBSD.org/~jasone/smp/smpng_patch_9.7">patch</a>
	  is available for download.  This patch is probably what will
	  actually get committed.</p>
      </li>
    </ul>

    <b>5 September 2000</b>
    <ul>
      <li>
	<p>An updated <a
	  href="http://people.FreeBSD.org/~jasone/smp/smpng_patch_9.1">patch</a>
	  is available for download.  This patch makes rtc a fast
	  interrupt, uses locked instructions for mutexes in MP kernels,
	  and corrects mtx_*() linkage within modules.</p>
      </li>
    </ul>

    <b>1 September 2000</b>
    <ul>
      <li>
	<p>The code is working for the most part now on i386 (UP and MP).
	  Some additional coding is still necessary for the alpha,
	  which is being done now.</p>
      </li>
    </ul>

    <b>30 August 2000</b>
    <ul>
      <li>
	<p>Updated patches for i386 and alpha are available <a href =
	  "http://people.FreeBSD.org/~jasone/smp/smpng_patch8.6">here</a>.</p>
      </li>
    </ul>

    <b>12 August 2000</b>
    <ul>
      <li>
	<p>Updated patches for i386 are available <a href =
	  "http://www.FreeBSD.org/~jhb/patches/smpng.patch6">here</a>.
	  Process accounting still doesn't work correctly, but a number
	  of other improvements have been made.</p>
      </li>
    </ul>

    <b>3 August 2000</b>
    <ul>
      <li>
	<p>Patches with functional heavy-weight threads for the i386
	  platform are available <a href =
	  "http://people.FreeBSD.org/~grog/patches4.gz">here</a>.
	  There are a couple of minor issues with this patch set.
	  Specifically, process accounting doesn't work correctly.</p>
      </li>
    </ul>

    <b>6 July 2000</b>
    <ul>
      <li>
	<p>Sheldon Hearn has prepared a mutex(9) man page based on the
	  BSD/OS one, which is available <a href =
	  "http://people.FreeBSD.org/~jake/mutex.9">here</a>.</p>
      </li>
    </ul>

    <b>5 July 2000</b>
    <ul>
      <li>
	<p>&a.jake; put an updated patch <a href =
	  "http://people.FreeBSD.org/~jake/smpng.diff">here</a>.</p>
      </li>
    </ul>

    <b>3 July 2000</b>
    <ul>
      <li>
	<p>&a.jake; has the BSD/OS lock code working now, and has
	  incorporated the pertinent portions of &a.dillon;'s patches
	  (idle processes, some of the schedlock changes, etc.).
	  His patch set is available <a href =
	  "http://people.FreeBSD.org/~jake/smpng2.tar">here</a>.</p>
      </li>
    </ul>

    <b>26 June 2000</b>
    <ul>
      <li>
	<p>&a.cp; has provided the PostScript versions of his
	  presentation slides for the
	  <a href="http://people.FreeBSD.org/~jasone/smp/smp_meeting_slides_1.ps">first day</a> and
	  <a href="http://people.FreeBSD.org/~jasone/smp/smp_meeting_slides_2.ps">second day</a> of the
	  SMP meeting.</p>
      </li>
    </ul>

    <b>25 June 2000</b>
    <ul>
      <li>
	<p>Here's a copy of the
	  <a href="http://docs.FreeBSD.org/cgi/getmsg.cgi?fetch=226208+0+archive/2000/freebsd-smp/20000625.freebsd-smp">SMP meeting summary</a>
	  that was posted to the -smp mailing list.</p>
      </li>
    </ul>

    <b>19 June 2000</b>
    <ul>
      <li>
	<p>Here's a copy of the
	  <a href="http://docs.FreeBSD.org/cgi/getmsg.cgi?fetch=154884+0+archive/2000/freebsd-current/20000625.freebsd-current">SMP project announcement</a>
	  that was posted to the -current mailing list.</p>
      </li>
    </ul>

  &footer;
  </body>
</html>
