From f832287e48b0c3200a0ca46c5b85f9b98f5a095e Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Sat, 27 May 2006 20:17:17 +0000 Subject: [PATCH] Mark various forms of read() and write() MPSAFE. Note that the MP lock is 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. --- sys/kern/init_sysent.c | 28 ++++++++++++++-------------- sys/kern/kern_subr.c | 4 +++- sys/kern/sys_generic.c | 38 ++++++++++++++++++++++++++++++++++++-- sys/kern/syscalls.c | 2 +- sys/kern/syscalls.master | 28 ++++++++++++++-------------- sys/kern/vfs_bio.c | 35 ++++++++++++++++++++++++++--------- sys/kern/vfs_lock.c | 2 +- sys/sys/syscall-args | 4 ++-- sys/sys/syscall-hide.h | 4 ++-- sys/sys/syscall.h | 4 ++-- sys/sys/syscall.mk | 4 ++-- sys/sys/sysproto.h | 4 ++-- sys/sys/sysunion.h | 4 ++-- sys/sys/uio.h | 5 ++++- 14 files changed, 111 insertions(+), 55 deletions(-) diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index 4269c9a4af..3002b5d171 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -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 */ diff --git a/sys/kern/kern_subr.c b/sys/kern/kern_subr.c index e537cbe715..f1401a4d6c 100644 --- a/sys/kern/kern_subr.c +++ b/sys/kern/kern_subr.c @@ -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, diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 94203b0e25..6b2163376d 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -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); } diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index 68c575b586..7b88400ef4 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -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 */ diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index e2bc03e902..0756267215 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -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 $ @@ -48,13 +48,13 @@ 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, \ @@ -156,9 +156,9 @@ 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. @@ -198,8 +198,8 @@ 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); } @@ -274,9 +274,9 @@ 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); } @@ -429,8 +429,8 @@ 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 @@ -644,7 +644,7 @@ 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); } diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index efe6633b43..99d31c2239 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -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 #include +#include #include #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 diff --git a/sys/kern/vfs_lock.c b/sys/kern/vfs_lock.c index 80ef065df8..8a5789fc56 100644 --- a/sys/kern/vfs_lock.c +++ b/sys/kern/vfs_lock.c @@ -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 $ */ /* diff --git a/sys/sys/syscall-args b/sys/sys/syscall-args index 4d9c3cb904..44c0bd9bb0 100644 --- a/sys/sys/syscall-args +++ b/sys/sys/syscall-args @@ -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 diff --git a/sys/sys/syscall-hide.h b/sys/sys/syscall-hide.h index 2021caf7dd..e2eb35d7ec 100644 --- a/sys/sys/syscall-hide.h +++ b/sys/sys/syscall-hide.h @@ -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 diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h index 78af2dacbb..e7260c1af8 100644 --- a/sys/sys/syscall.h +++ b/sys/sys/syscall.h @@ -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 diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk index 4b3b17bbd4..16aefbae72 100644 --- a/sys/sys/syscall.mk +++ b/sys/sys/syscall.mk @@ -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 \ diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h index b37232431b..884c876756 100644 --- a/sys/sys/sysproto.h +++ b/sys/sys/sysproto.h @@ -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_ diff --git a/sys/sys/sysunion.h b/sys/sys/sysunion.h index 079ec5f176..df88c20e9f 100644 --- a/sys/sys/sysunion.h +++ b/sys/sys/sysunion.h @@ -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 { diff --git a/sys/sys/uio.h b/sys/sys/uio.h index 5304d86958..e325bebd43 100644 --- a/sys/sys/uio.h +++ b/sys/sys/uio.h @@ -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) { -- 2.41.0