Mark various forms of read() and write() MPSAFE. Note that the MP lock is
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 27 May 2006 20:17:17 +0000 (20:17 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 27 May 2006 20:17:17 +0000 (20:17 +0000)
still acquire, but now its a lot deeper in the fileops.

Mark dup(), dup2(), close(), closefrom(), and fcntl() MPSAFE.  Some code
paths don't have to get the MP lock, but most still do deeper into the
fileops.

14 files changed:
sys/kern/init_sysent.c
sys/kern/kern_subr.c
sys/kern/sys_generic.c
sys/kern/syscalls.c
sys/kern/syscalls.master
sys/kern/vfs_bio.c
sys/kern/vfs_lock.c
sys/sys/syscall-args
sys/sys/syscall-hide.h
sys/sys/syscall.h
sys/sys/syscall.mk
sys/sys/sysproto.h
sys/sys/sysunion.h
sys/sys/uio.h

index 4269c9a..3002b5d 100644 (file)
@@ -2,7 +2,7 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/kern/init_sysent.c,v 1.36 2006/05/24 12:42:01 corecode Exp $
+ * $DragonFly: src/sys/kern/init_sysent.c,v 1.37 2006/05/27 20:17:16 dillon Exp $
  * created from DragonFly: src/sys/kern/syscalls.master,v 1.35 2006/05/24 12:40:19 corecode Exp 
  */
 
@@ -37,10 +37,10 @@ struct sysent sysent[] = {
        { 0, (sy_call_t *)nosys },                      /* 0 = syscall */
        { AS(sys_exit_args), (sy_call_t *)sys_exit },   /* 1 = exit */
        { 0, (sy_call_t *)fork },                       /* 2 = fork */
-       { AS(read_args), (sy_call_t *)read },           /* 3 = read */
-       { AS(write_args), (sy_call_t *)write },         /* 4 = write */
+       { SYF_MPSAFE | AS(read_args), (sy_call_t *)read },      /* 3 = read */
+       { SYF_MPSAFE | AS(write_args), (sy_call_t *)write },    /* 4 = write */
        { AS(open_args), (sy_call_t *)open },           /* 5 = open */
-       { AS(close_args), (sy_call_t *)close },         /* 6 = close */
+       { SYF_MPSAFE | AS(close_args), (sy_call_t *)close },    /* 6 = close */
        { AS(wait_args), (sy_call_t *)wait4 },          /* 7 = wait4 */
        { compat(AS(ocreat_args),creat) },              /* 8 = old creat */
        { AS(link_args), (sy_call_t *)link },           /* 9 = link */
@@ -75,7 +75,7 @@ struct sysent sysent[] = {
        { compat(AS(ostat_args),stat) },                /* 38 = old stat */
        { 0, (sy_call_t *)getppid },                    /* 39 = getppid */
        { compat(AS(olstat_args),lstat) },              /* 40 = old lstat */
-       { AS(dup_args), (sy_call_t *)dup },             /* 41 = dup */
+       { SYF_MPSAFE | AS(dup_args), (sy_call_t *)dup },        /* 41 = dup */
        { 0, (sy_call_t *)pipe },                       /* 42 = pipe */
        { 0, (sy_call_t *)getegid },                    /* 43 = getegid */
        { AS(profil_args), (sy_call_t *)profil },       /* 44 = profil */
@@ -124,9 +124,9 @@ struct sysent sysent[] = {
        { compat(AS(gethostname_args),gethostname) },   /* 87 = old gethostname */
        { compat(AS(sethostname_args),sethostname) },   /* 88 = old sethostname */
        { SYF_MPSAFE | 0, (sy_call_t *)getdtablesize }, /* 89 = getdtablesize */
-       { AS(dup2_args), (sy_call_t *)dup2 },           /* 90 = dup2 */
+       { SYF_MPSAFE | AS(dup2_args), (sy_call_t *)dup2 },      /* 90 = dup2 */
        { 0, (sy_call_t *)nosys },                      /* 91 = getdopt */
-       { AS(fcntl_args), (sy_call_t *)fcntl },         /* 92 = fcntl */
+       { SYF_MPSAFE | AS(fcntl_args), (sy_call_t *)fcntl },    /* 92 = fcntl */
        { AS(select_args), (sy_call_t *)select },       /* 93 = select */
        { 0, (sy_call_t *)nosys },                      /* 94 = setdopt */
        { AS(fsync_args), (sy_call_t *)fsync },         /* 95 = fsync */
@@ -154,8 +154,8 @@ struct sysent sysent[] = {
        { AS(getrusage_args), (sy_call_t *)getrusage }, /* 117 = getrusage */
        { AS(getsockopt_args), (sy_call_t *)getsockopt },       /* 118 = getsockopt */
        { 0, (sy_call_t *)nosys },                      /* 119 = resuba */
-       { AS(readv_args), (sy_call_t *)readv },         /* 120 = readv */
-       { AS(writev_args), (sy_call_t *)writev },       /* 121 = writev */
+       { SYF_MPSAFE | AS(readv_args), (sy_call_t *)readv },    /* 120 = readv */
+       { SYF_MPSAFE | AS(writev_args), (sy_call_t *)writev },  /* 121 = writev */
        { AS(settimeofday_args), (sy_call_t *)settimeofday },   /* 122 = settimeofday */
        { AS(fchown_args), (sy_call_t *)fchown },       /* 123 = fchown */
        { AS(fchmod_args), (sy_call_t *)fchmod },       /* 124 = fchmod */
@@ -207,8 +207,8 @@ struct sysent sysent[] = {
        { AS(msgsys_args), (sy_call_t *)msgsys },       /* 170 = msgsys */
        { AS(shmsys_args), (sy_call_t *)shmsys },       /* 171 = shmsys */
        { 0, (sy_call_t *)nosys },                      /* 172 = nosys */
-       { AS(pread_args), (sy_call_t *)pread },         /* 173 = pread */
-       { AS(pwrite_args), (sy_call_t *)pwrite },       /* 174 = pwrite */
+       { SYF_MPSAFE | AS(pread_args), (sy_call_t *)pread },    /* 173 = pread */
+       { SYF_MPSAFE | AS(pwrite_args), (sy_call_t *)pwrite },  /* 174 = pwrite */
        { 0, (sy_call_t *)nosys },                      /* 175 = nosys */
        { AS(ntp_adjtime_args), (sy_call_t *)ntp_adjtime },     /* 176 = ntp_adjtime */
        { 0, (sy_call_t *)nosys },                      /* 177 = sfork */
@@ -323,8 +323,8 @@ struct sysent sysent[] = {
        { 0, (sy_call_t *)nosys },                      /* 286 = nosys */
        { 0, (sy_call_t *)nosys },                      /* 287 = nosys */
        { 0, (sy_call_t *)nosys },                      /* 288 = nosys */
-       { AS(preadv_args), (sy_call_t *)preadv },       /* 289 = preadv */
-       { AS(pwritev_args), (sy_call_t *)pwritev },     /* 290 = pwritev */
+       { SYF_MPSAFE | AS(preadv_args), (sy_call_t *)preadv },  /* 289 = preadv */
+       { SYF_MPSAFE | AS(pwritev_args), (sy_call_t *)pwritev },        /* 290 = pwritev */
        { 0, (sy_call_t *)nosys },                      /* 291 = nosys */
        { 0, (sy_call_t *)nosys },                      /* 292 = nosys */
        { 0, (sy_call_t *)nosys },                      /* 293 = nosys */
@@ -508,7 +508,7 @@ struct sysent sysent[] = {
        { AS(jail_attach_args), (sy_call_t *)jail_attach },     /* 471 = jail_attach */
        { AS(sys_set_tls_area_args), (sy_call_t *)sys_set_tls_area },   /* 472 = sys_set_tls_area */
        { AS(sys_get_tls_area_args), (sy_call_t *)sys_get_tls_area },   /* 473 = sys_get_tls_area */
-       { AS(closefrom_args), (sy_call_t *)closefrom }, /* 474 = closefrom */
+       { SYF_MPSAFE | AS(closefrom_args), (sy_call_t *)closefrom },    /* 474 = closefrom */
        { AS(stat_args), (sy_call_t *)stat },           /* 475 = stat */
        { AS(fstat_args), (sy_call_t *)fstat },         /* 476 = fstat */
        { AS(lstat_args), (sy_call_t *)lstat },         /* 477 = lstat */
index e537cbe..f1401a4 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_subr.c 8.3 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/kern_subr.c,v 1.31.2.2 2002/04/21 08:09:37 bde Exp $
- * $DragonFly: src/sys/kern/kern_subr.c,v 1.22 2006/04/26 17:42:53 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_subr.c,v 1.23 2006/05/27 20:17:16 dillon Exp $
  */
 
 #include "opt_ddb.h"
@@ -322,6 +322,8 @@ phashinit(elements, type, nentries)
  * Copyin an iovec.  If the iovec array fits, use the preallocated small
  * iovec structure.  If it is too big, dynamically allocate an iovec array
  * of sufficient size.
+ *
+ * MPSAFE
  */
 int
 iovec_copyin(struct iovec *uiov, struct iovec **kiov, struct iovec *siov,
index 94203b0..6b21633 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)sys_generic.c       8.5 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/sys_generic.c,v 1.55.2.10 2001/03/17 10:39:32 peter Exp $
- * $DragonFly: src/sys/kern/sys_generic.c,v 1.30 2006/05/19 07:33:45 dillon Exp $
+ * $DragonFly: src/sys/kern/sys_generic.c,v 1.31 2006/05/27 20:17:16 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -85,6 +85,8 @@ static int    dofilewrite(int, struct file *, struct uio *, int, int *);
 
 /*
  * Read system call.
+ *
+ * MPSAFE
  */
 int
 read(struct read_args *uap)
@@ -113,6 +115,8 @@ read(struct read_args *uap)
 
 /*
  * Positioned (Pread) read system call
+ *
+ * MPSAFE
  */
 int
 pread(struct pread_args *uap)
@@ -141,6 +145,8 @@ pread(struct pread_args *uap)
 
 /*
  * Scatter read system call.
+ *
+ * MPSAFE
  */
 int
 readv(struct readv_args *uap)
@@ -170,6 +176,8 @@ readv(struct readv_args *uap)
 
 /*
  * Scatter positioned read system call.
+ *
+ * MPSAFE
  */
 int
 preadv(struct preadv_args *uap)
@@ -196,6 +204,9 @@ preadv(struct preadv_args *uap)
        return(error);
 }
 
+/*
+ * MPSAFE
+ */
 int
 kern_preadv(int fd, struct uio *auio, int flags, int *res)
 {
@@ -223,6 +234,8 @@ kern_preadv(int fd, struct uio *auio, int flags, int *res)
 /*
  * Common code for readv and preadv that reads data in
  * from a file using the passed in uio, offset, and flags.
+ *
+ * MPALMOSTSAFE - ktrace needs help
  */
 static int
 dofileread(int fd, struct file *fp, struct uio *auio, int flags, int *res)
@@ -260,7 +273,9 @@ dofileread(int fd, struct file *fp, struct uio *auio, int flags, int *res)
                if (error == 0) {
                        ktruio.uio_iov = ktriov;
                        ktruio.uio_resid = len - auio->uio_resid;
+                       get_mplock();
                        ktrgenio(p, fd, UIO_READ, &ktruio, error);
+                       rel_mplock();
                }
                FREE(ktriov, M_TEMP);
        }
@@ -273,6 +288,8 @@ dofileread(int fd, struct file *fp, struct uio *auio, int flags, int *res)
 
 /*
  * Write system call
+ *
+ * MPSAFE
  */
 int
 write(struct write_args *uap)
@@ -302,6 +319,8 @@ write(struct write_args *uap)
 
 /*
  * Pwrite system call
+ *
+ * MPSAFE
  */
 int
 pwrite(struct pwrite_args *uap)
@@ -329,6 +348,9 @@ pwrite(struct pwrite_args *uap)
        return(error);
 }
 
+/*
+ * MPSAFE
+ */
 int
 writev(struct writev_args *uap)
 {
@@ -357,6 +379,8 @@ writev(struct writev_args *uap)
 
 /*
  * Gather positioned write system call
+ *
+ * MPSAFE
  */
 int
 pwritev(struct pwritev_args *uap)
@@ -383,6 +407,9 @@ pwritev(struct pwritev_args *uap)
        return(error);
 }
 
+/*
+ * MPSAFE
+ */
 int
 kern_pwritev(int fd, struct uio *auio, int flags, int *res)
 {
@@ -409,6 +436,8 @@ kern_pwritev(int fd, struct uio *auio, int flags, int *res)
 /*
  * Common code for writev and pwritev that writes data to
  * a file using the passed in uio, offset, and flags.
+ *
+ * MPALMOSTSAFE - ktrace needs help
  */
 static int
 dofilewrite(int fd, struct file *fp, struct uio *auio, int flags, int *res)
@@ -443,15 +472,20 @@ dofilewrite(int fd, struct file *fp, struct uio *auio, int flags, int *res)
                    error == EINTR || error == EWOULDBLOCK))
                        error = 0;
                /* Socket layer is responsible for issuing SIGPIPE. */
-               if (error == EPIPE)
+               if (error == EPIPE) {
+                       get_mplock();
                        psignal(p, SIGPIPE);
+                       rel_mplock();
+               }
        }
 #ifdef KTRACE
        if (ktriov != NULL) {
                if (error == 0) {
                        ktruio.uio_iov = ktriov;
                        ktruio.uio_resid = len - auio->uio_resid;
+                       get_mplock();
                        ktrgenio(p, fd, UIO_WRITE, &ktruio, error);
+                       rel_mplock();
                }
                FREE(ktriov, M_TEMP);
        }
index 68c575b..7b88400 100644 (file)
@@ -2,7 +2,7 @@
  * System call names.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/kern/syscalls.c,v 1.35 2006/05/24 12:42:01 corecode Exp $
+ * $DragonFly: src/sys/kern/syscalls.c,v 1.36 2006/05/27 20:17:16 dillon Exp $
  * created from DragonFly: src/sys/kern/syscalls.master,v 1.35 2006/05/24 12:40:19 corecode Exp 
  */
 
index e2bc03e..0756267 100644 (file)
@@ -1,4 +1,4 @@
- $DragonFly: src/sys/kern/syscalls.master,v 1.35 2006/05/24 12:40:19 corecode Exp $
+ $DragonFly: src/sys/kern/syscalls.master,v 1.36 2006/05/27 20:17:16 dillon Exp $
 
 ; @(#)syscalls.master  8.2 (Berkeley) 1/13/94
 ; $FreeBSD: src/sys/kern/syscalls.master,v 1.72.2.10 2002/07/12 08:22:46 alfred Exp $
 0      STD     NOHIDE  { int nosys(void); } syscall nosys_args int
 1      STD     NOHIDE  { void sys_exit(int rval); } exit sys_exit_args void
 2      STD     POSIX   { int fork(void); }
-3      STD     POSIX   { ssize_t read(int fd, void *buf, size_t nbyte); }
-4      STD     POSIX   { ssize_t write(int fd, const void *buf, size_t nbyte); }
+3      MPSAFE  STD     POSIX   { ssize_t read(int fd, void *buf, size_t nbyte); }
+4      MPSAFE  STD     POSIX   { ssize_t write(int fd, const void *buf, size_t nbyte); }
 5      STD     POSIX   { int open(char *path, int flags, int mode); }
 ; XXX should be                { int open(const char *path, int flags, ...); }
 ; but we're not ready for `const' or varargs.
 ; XXX man page says `mode_t mode'.
-6      STD     POSIX   { int close(int fd); }
+6      MPSAFE  STD     POSIX   { int close(int fd); }
 7      STD     BSD     { int wait4(int pid, int *status, int options, \
                            struct rusage *rusage); } wait4 wait_args int
 8      COMPAT  BSD     { int creat(char *path, int mode); }
@@ -95,7 +95,7 @@
 38     COMPAT  POSIX   { int stat(char *path, struct ostat *ub); }
 39     STD     POSIX   { pid_t getppid(void); }
 40     COMPAT  POSIX   { int lstat(char *path, struct ostat *ub); }
-41     STD     POSIX   { int dup(u_int fd); }
+41     MPSAFE  STD     POSIX   { int dup(u_int fd); }
 42     STD     POSIX   { int pipe(void); }
 43     STD     POSIX   { gid_t getegid(void); }
 44     STD     BSD     { int profil(caddr_t samples, size_t size, \
 88     COMPAT  BSD     { int sethostname(char *hostname, u_int len); } \
                            sethostname sethostname_args int
 89     MPSAFE  STD     BSD     { int getdtablesize(void); }
-90     STD     POSIX   { int dup2(u_int from, u_int to); }
+90     MPSAFE  STD     POSIX   { int dup2(u_int from, u_int to); }
 91     UNIMPL  BSD     getdopt
-92     STD     POSIX   { int fcntl(int fd, int cmd, long arg); }
+92     MPSAFE  STD     POSIX   { int fcntl(int fd, int cmd, long arg); }
 ; XXX should be                { int fcntl(int fd, int cmd, ...); }
 ; but we're not ready for varargs.
 ; XXX man page says `int arg' too.
 118    STD     BSD     { int getsockopt(int s, int level, int name, \
                            caddr_t val, int *avalsize); }
 119    UNIMPL  NOHIDE  resuba (BSD/OS 2.x)
-120    STD     BSD     { int readv(int fd, struct iovec *iovp, u_int iovcnt); }
-121    STD     BSD     { int writev(int fd, struct iovec *iovp, \
+120    MPSAFE  STD     BSD     { int readv(int fd, struct iovec *iovp, u_int iovcnt); }
+121    MPSAFE  STD     BSD     { int writev(int fd, struct iovec *iovp, \
                            u_int iovcnt); }
 122    STD     BSD     { int settimeofday(struct timeval *tv, \
                            struct timezone *tzp); }
 171    STD     BSD     { int shmsys(int which, int a2, int a3, int a4); }
 ; XXX should be                { int shmsys(int which, ...); }
 172    UNIMPL  NOHIDE  nosys
-173    STD     POSIX   { ssize_t pread(int fd, void *buf, size_t nbyte, \
+173    MPSAFE  STD     POSIX   { ssize_t pread(int fd, void *buf, size_t nbyte, \
                            int pad, off_t offset); }
-174    STD     POSIX   { ssize_t pwrite(int fd, const void *buf, \
+174    MPSAFE  STD     POSIX   { ssize_t pwrite(int fd, const void *buf, \
                            size_t nbyte, int pad, off_t offset); }
 175    UNIMPL  NOHIDE  nosys
 176    STD     BSD     { int ntp_adjtime(struct timex *tp); }
 287    UNIMPL  NOHIDE  nosys
 288    UNIMPL  NOHIDE  nosys
 ; 289 and 290 from NetBSD (OpenBSD: 267 and 268)
-289    STD     BSD     { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
-290    STD     BSD     { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
+289    MPSAFE  STD     BSD     { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
+290    MPSAFE  STD     BSD     { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); }
 291    UNIMPL  NOHIDE  nosys
 292    UNIMPL  NOHIDE  nosys
 293    UNIMPL  NOHIDE  nosys
 471    STD     BSD     { int jail_attach(int jid); }
 472    STD     BSD     { int sys_set_tls_area(int which, struct tls_info *info, size_t infosize); }
 473    STD     BSD     { int sys_get_tls_area(int which, struct tls_info *info, size_t infosize); }
-474    STD     BSD     { int closefrom(int fd); }
+474    MPSAFE  STD     BSD     { int closefrom(int fd); }
 475    STD     POSIX   { int stat(const char *path, struct stat *ub); }
 476    STD     POSIX   { int fstat(int fd, struct stat *sb); }
 477    STD     POSIX   { int lstat(const char *path, struct stat *ub); }
index efe6633..99d31c2 100644 (file)
@@ -12,7 +12,7 @@
  *             John S. Dyson.
  *
  * $FreeBSD: src/sys/kern/vfs_bio.c,v 1.242.2.20 2003/05/28 18:38:10 alc Exp $
- * $DragonFly: src/sys/kern/vfs_bio.c,v 1.76 2006/05/25 19:31:13 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_bio.c,v 1.77 2006/05/27 20:17:16 dillon Exp $
  */
 
 /*
@@ -56,6 +56,7 @@
 
 #include <sys/buf2.h>
 #include <sys/thread2.h>
+#include <sys/spinlock2.h>
 #include <vm/vm_page2.h>
 
 #include "opt_ddb.h"
@@ -94,8 +95,6 @@ static void vfs_setdirty(struct buf *bp);
 static void vfs_vmio_release(struct buf *bp);
 static int flushbufqueues(void);
 
-static int bd_request;
-
 static void buf_daemon (void);
 /*
  * bogus page -- for I/O to/from partially complete buffers
@@ -110,13 +109,16 @@ int runningbufspace;
 static int bufspace, maxbufspace,
        bufmallocspace, maxbufmallocspace, lobufspace, hibufspace;
 static int bufreusecnt, bufdefragcnt, buffreekvacnt;
-static int needsbuffer;
 static int lorunningspace, hirunningspace, runningbufreq;
 static int numdirtybuffers, lodirtybuffers, hidirtybuffers;
 static int numfreebuffers, lofreebuffers, hifreebuffers;
 static int getnewbufcalls;
 static int getnewbufrestarts;
 
+static int needsbuffer;                /* locked by needsbuffer_spin */
+static int bd_request;         /* locked by needsbuffer_spin */
+static struct spinlock needsbuffer_spin;
+
 /*
  * Sysctls for operational control of the buffer cache.
  */
@@ -187,7 +189,9 @@ numdirtywakeup(int level)
 {
        if (numdirtybuffers <= level) {
                if (needsbuffer & VFS_BIO_NEED_DIRTYFLUSH) {
+                       spin_lock_wr(&needsbuffer_spin);
                        needsbuffer &= ~VFS_BIO_NEED_DIRTYFLUSH;
+                       spin_unlock_wr(&needsbuffer_spin);
                        wakeup(&needsbuffer);
                }
        }
@@ -211,7 +215,9 @@ bufspacewakeup(void)
         * process will be able to now.
         */
        if (needsbuffer & VFS_BIO_NEED_BUFSPACE) {
+               spin_lock_wr(&needsbuffer_spin);
                needsbuffer &= ~VFS_BIO_NEED_BUFSPACE;
+               spin_unlock_wr(&needsbuffer_spin);
                wakeup(&needsbuffer);
        }
 }
@@ -249,9 +255,11 @@ bufcountwakeup(void)
 {
        ++numfreebuffers;
        if (needsbuffer) {
+               spin_lock_wr(&needsbuffer_spin);
                needsbuffer &= ~VFS_BIO_NEED_ANY;
                if (numfreebuffers >= hifreebuffers)
                        needsbuffer &= ~VFS_BIO_NEED_FREE;
+               spin_unlock_wr(&needsbuffer_spin);
                wakeup(&needsbuffer);
        }
 }
@@ -319,7 +327,9 @@ void
 bd_wakeup(int dirtybuflevel)
 {
        if (bd_request == 0 && numdirtybuffers >= dirtybuflevel) {
+               spin_lock_wr(&needsbuffer_spin);
                bd_request = 1;
+               spin_unlock_wr(&needsbuffer_spin);
                wakeup(&bd_request);
        }
 }
@@ -350,6 +360,8 @@ bufinit(void)
        vm_offset_t bogus_offset;
        int i;
 
+       spin_init(&needsbuffer_spin);
+
        /* next, make a null set of free lists */
        for (i = 0; i < BUFFER_QUEUES; i++)
                TAILQ_INIT(&bufqueues[i]);
@@ -918,13 +930,16 @@ void
 bwillwrite(void)
 {
        if (numdirtybuffers >= hidirtybuffers) {
-               crit_enter();
                while (numdirtybuffers >= hidirtybuffers) {
                        bd_wakeup(1);
-                       needsbuffer |= VFS_BIO_NEED_DIRTYFLUSH;
-                       tsleep(&needsbuffer, 0, "flswai", 0);
+                       spin_lock_wr(&needsbuffer_spin);
+                       if (numdirtybuffers >= hidirtybuffers) {
+                               needsbuffer |= VFS_BIO_NEED_DIRTYFLUSH;
+                               msleep(&needsbuffer, &needsbuffer_spin, 0,
+                                      "flswai", 0);
+                       }
+                       spin_unlock_wr(&needsbuffer_spin);
                }
-               crit_exit();
        }
 }
 
@@ -1875,8 +1890,10 @@ buf_daemon()
                         * request and sleep until we are needed again.
                         * The sleep is just so the suspend code works.
                         */
+                       spin_lock_wr(&needsbuffer_spin);
                        bd_request = 0;
-                       tsleep(&bd_request, 0, "psleep", hz);
+                       msleep(&bd_request, &needsbuffer_spin, 0, "psleep", hz);
+                       spin_unlock_wr(&needsbuffer_spin);
                } else {
                        /*
                         * We couldn't find any flushable dirty buffers but
index 80ef065..8a5789f 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/kern/vfs_lock.c,v 1.18 2006/05/24 03:23:31 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_lock.c,v 1.19 2006/05/27 20:17:16 dillon Exp $
  */
 
 /*
index 4d9c3cb..44c0bd9 100644 (file)
@@ -1,8 +1,8 @@
 # System call argument table.
 # DO NOT EDIT-- this file is automatically generated.
-# $DragonFly: src/sys/sys/Attic/syscall-args,v 1.20 2006/04/26 17:17:57 dillon Exp $
+# $DragonFly: src/sys/sys/Attic/syscall-args,v 1.21 2006/05/27 20:17:17 dillon Exp $
 
-# Created from DragonFly: src/sys/kern/syscalls.master,v 1.31 2006/03/24 06:45:04 dillon Exp 
+# Created from DragonFly: src/sys/kern/syscalls.master,v 1.35 2006/05/24 12:40:19 corecode Exp 
 
 int    syscall nosys   nosys_args
 void   exit    sys_exit        sys_exit_args   int     rval
index 2021caf..e2eb35d 100644 (file)
@@ -2,8 +2,8 @@
  * System call hiders.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/syscall-hide.h,v 1.36 2006/04/26 17:17:57 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.31 2006/03/24 06:45:04 dillon Exp 
+ * $DragonFly: src/sys/sys/syscall-hide.h,v 1.37 2006/05/27 20:17:17 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.35 2006/05/24 12:40:19 corecode Exp 
  */
 
 #ifdef COMPAT_43
index 78af2da..e7260c1 100644 (file)
@@ -2,8 +2,8 @@
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/syscall.h,v 1.36 2006/04/26 17:17:57 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.31 2006/03/24 06:45:04 dillon Exp 
+ * $DragonFly: src/sys/sys/syscall.h,v 1.37 2006/05/27 20:17:17 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.35 2006/05/24 12:40:19 corecode Exp 
  */
 
 #define        SYS_syscall     0
index 4b3b17b..16aefba 100644 (file)
@@ -1,7 +1,7 @@
 # DragonFly system call names.
 # DO NOT EDIT-- this file is automatically generated.
-# $DragonFly: src/sys/sys/syscall.mk,v 1.36 2006/04/26 17:17:57 dillon Exp $
-# created from DragonFly: src/sys/kern/syscalls.master,v 1.31 2006/03/24 06:45:04 dillon Exp 
+# $DragonFly: src/sys/sys/syscall.mk,v 1.37 2006/05/27 20:17:17 dillon Exp $
+# created from DragonFly: src/sys/kern/syscalls.master,v 1.35 2006/05/24 12:40:19 corecode Exp 
 MIASM =  \
        syscall.o \
        exit.o \
index b372324..884c876 100644 (file)
@@ -2,8 +2,8 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/sysproto.h,v 1.36 2006/04/26 17:17:57 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.31 2006/03/24 06:45:04 dillon Exp 
+ * $DragonFly: src/sys/sys/sysproto.h,v 1.37 2006/05/27 20:17:17 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.35 2006/05/24 12:40:19 corecode Exp 
  */
 
 #ifndef _SYS_SYSPROTO_H_
index 079ec5f..df88c20 100644 (file)
@@ -2,8 +2,8 @@
  * Union of syscall args for messaging.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/sysunion.h,v 1.33 2006/04/26 17:17:57 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.31 2006/03/24 06:45:04 dillon Exp 
+ * $DragonFly: src/sys/sys/sysunion.h,v 1.34 2006/05/27 20:17:17 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.35 2006/05/24 12:40:19 corecode Exp 
  */
 
 union sysunion {
index 5304d86..e325beb 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)uio.h       8.5 (Berkeley) 2/22/94
  * $FreeBSD: src/sys/sys/uio.h,v 1.11.2.1 2001/09/28 16:58:35 dillon Exp $
- * $DragonFly: src/sys/sys/uio.h,v 1.13 2006/05/21 03:43:47 dillon Exp $
+ * $DragonFly: src/sys/sys/uio.h,v 1.14 2006/05/27 20:17:17 dillon Exp $
  */
 
 #ifndef _SYS_UIO_H_
@@ -105,6 +105,9 @@ int uioread (int, struct uio *, struct vm_object *, int *);
 int    iovec_copyin(struct iovec *, struct iovec **, struct iovec *,
                            size_t, int *);
 
+/*
+ * MPSAFE
+ */
 static __inline void
 iovec_free(struct iovec **kiov, struct iovec *siov)
 {