cvs commit: src/sys/nfsserver nfs.h nfs_serv.c nfs_srvcache.c nfs_srvsock.c nfs_srvsubs.c nfs_syscalls.c nfsm_subs.h

Robert Watson rwatson at FreeBSD.org
Sun May 23 21:06:52 PDT 2004


rwatson     2004/05/23 21:06:14 PDT

  FreeBSD src repository

  Modified files:
    sys/nfsserver        nfs.h nfs_serv.c nfs_srvcache.c 
                         nfs_srvsock.c nfs_srvsubs.c 
                         nfs_syscalls.c nfsm_subs.h 
  Log:
  The socket code upcalls into the NFS server using the so_upcall
  mechanism so that early processing on mbufs can be performed before
  a context switch to the NFS server threads.  Because of this, if
  the socket code is running without Giant, the NFS server also needs
  to be able to run the upcall code without relying on the presence on
  Giant.  This change modifies the NFS server to run using a "giant
  code lock" covering operation of the whole subsystem.  Work is in
  progress to move to data-based locking as part of the NFSv4 server
  changes.
  
  Introduce an NFS server subsystem lock, 'nfsd_mtx', and a set of
  macros to operate on the lock:
  
    NFSD_LOCK_ASSERT()    Assert nfsd_mtx owned by current thread
    NFSD_UNLOCK_ASSERT()  Assert nfsd_mtx not owned by current thread
    NFSD_LOCK_DONTCARE()  Advisory: this function doesn't care
    NFSD_LOCK()           Lock nfsd_mtx
    NFSD_UNLOCK()         Unlock nfsd_mtx
  
  Constify a number of global variables/structures in the NFS server
  code, as they are not modified and contain constants only:
  
    nfsrvv2_procid       nfsrv_nfsv3_procid      nonidempotent
    nfsv2_repstat        nfsv2_type              nfsrv_nfsv3_procid
    nfsrvv2_procid       nfsrv_v2errmap          nfsv3err_null
    nfsv3err_getattr     nfsv3err_setattr        nfsv3err_lookup
    nfsv3err_access      nfsv3err_readlink       nfsv3err_read
    nfsv3err_write       nfsv3err_create         nfsv3err_mkdir
    nfsv3err_symlink     nfsv3err_mknod          nfsv3err_remove
    nfsv3err_rmdir       nfsv3err_rename         nfsv3err_link
    nfsv3err_readdir     nfsv3err_readdirplus    nfsv3err_fsstat
    nfsv3err_fsinfo      nfsv3err_pathconf       nfsv3err_commit
    nfsrv_v3errmap
  
  There are additional structures that should be constified but due
  to their being passed into general purpose functions without const
  arguments, I have not yet converted.
  
  In general, acquire nfsd_mtx when accessing any of the global NFS
  structures, including struct nfssvc_sock, struct nfsd, struct
  nfsrv_descript.
  
  Release nfsd_mtx whenever calling into VFS, and acquire Giant for
  calls into VFS.  Giant is not required for any part of the
  operation of the NFS server with the exception of calls into VFS.
  Giant will never by acquired in the upcall code path.  However, it
  may operate entirely covered by Giant, or not.  If debug.mpsafenet
  is set to 0, the system calls will acquire Giant across all
  operations, and the upcall will assert Giant.  As such, by default,
  this enables locking and allows us to test assertions, but should not
  cause any substantial new amount of code to be run without Giant.
  Bugs should manifest in the form of lock assertion failures for now.
  
  This approach is similar (but not identical) to modifications to the
  BSD/OS NFS server code snapshot provided by BSDi as part of their
  SMPng snapshot.  The strategy is almost the same (single lock over
  the NFS server), but differs in the following ways:
  
  - Our NFS client and server code bases don't overlap, which means
    both fewer bugs and easier locking (thanks Peter!).  Also means
    NFSD_*() as opposed to NFS_*().
  
  - We make broad use of assertions, whereas the BSD/OS code does not.
  
  - Made slightly different choices about how to handle macros building
    packets but operating with side effects.
  
  - We acquire Giant only when entering VFS from the NFS server daemon
    threads.
  
  - Serious bugs in BSD/OS implementation corrected -- the snapshot we
    received was clearly a work in progress.
  
  Based on ideas from:    BSDi SMPng Snapshot
  Reviewed by:            rick at snowhite.cis.uoguelph.ca
  Extensive testing by:   kris
  
  Revision  Changes    Path
  1.75      +9 -2      src/sys/nfsserver/nfs.h
  1.141     +406 -26   src/sys/nfsserver/nfs_serv.c
  1.38      +21 -5     src/sys/nfsserver/nfs_srvcache.c
  1.90      +48 -4     src/sys/nfsserver/nfs_srvsock.c
  1.127     +97 -36    src/sys/nfsserver/nfs_srvsubs.c
  1.98      +56 -9     src/sys/nfsserver/nfs_syscalls.c
  1.36      +5 -2      src/sys/nfsserver/nfsm_subs.h


More information about the cvs-all mailing list