Date: Thu, 29 Jun 2006 04:01:16 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 100254 for review Message-ID: <200606290401.k5T41G21098624@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=100254 Change 100254 by kmacy@kmacy_storage:sun4v_work_stable on 2006/06/29 04:00:50 csjp's socket and filedesc pushdown Affected files ... .. //depot/projects/kmacy_sun4v_stable/src/sys/kern/kern_descrip.c#2 integrate .. //depot/projects/kmacy_sun4v_stable/src/sys/kern/kern_umtx.c#2 integrate .. //depot/projects/kmacy_sun4v_stable/src/sys/kern/sys_pipe.c#2 integrate .. //depot/projects/kmacy_sun4v_stable/src/sys/kern/sys_socket.c#2 integrate .. //depot/projects/kmacy_sun4v_stable/src/sys/sys/filedesc.h#2 integrate .. //depot/projects/kmacy_sun4v_stable/src/sys/sys/lock.h#2 integrate .. //depot/projects/kmacy_sun4v_stable/src/sys/sys/socket.h#2 integrate .. //depot/projects/kmacy_sun4v_stable/src/sys/sys/unpcb.h#2 integrate Differences ... ==== //depot/projects/kmacy_sun4v_stable/src/sys/kern/kern_descrip.c#2 (text+ko) ==== @@ -359,25 +359,8 @@ struct vnode *vp; u_int newmin; int error, flg, tmp; - int giant_locked; + int giant_locked = 0; - /* - * XXXRW: Some fcntl() calls require Giant -- others don't. Try to - * avoid grabbing Giant for calls we know don't need it. - */ - switch (cmd) { - case F_DUPFD: - case F_GETFD: - case F_SETFD: - case F_GETFL: - giant_locked = 0; - break; - - default: - giant_locked = 1; - mtx_lock(&Giant); - } - error = 0; flg = F_POSIX; p = td->td_proc; @@ -391,9 +374,12 @@ } pop = &fdp->fd_ofileflags[fd]; + if ((fp->f_ops->fo_flags & DFLAG_MPSAFE) == 0) { + mtx_lock(&Giant); + giant_locked = 1; + } switch (cmd) { case F_DUPFD: - /* mtx_assert(&Giant, MA_NOTOWNED); */ FILEDESC_UNLOCK(fdp); newmin = arg; PROC_LOCK(p); @@ -408,20 +394,17 @@ break; case F_GETFD: - /* mtx_assert(&Giant, MA_NOTOWNED); */ td->td_retval[0] = (*pop & UF_EXCLOSE) ? FD_CLOEXEC : 0; FILEDESC_UNLOCK(fdp); break; case F_SETFD: - /* mtx_assert(&Giant, MA_NOTOWNED); */ *pop = (*pop &~ UF_EXCLOSE) | (arg & FD_CLOEXEC ? UF_EXCLOSE : 0); FILEDESC_UNLOCK(fdp); break; case F_GETFL: - /* mtx_assert(&Giant, MA_NOTOWNED); */ FILE_LOCK(fp); td->td_retval[0] = OFLAGS(fp->f_flag); FILE_UNLOCK(fp); @@ -429,7 +412,6 @@ break; case F_SETFL: - mtx_assert(&Giant, MA_OWNED); FILE_LOCK(fp); fhold_locked(fp); fp->f_flag &= ~FCNTLFLAGS; @@ -457,7 +439,6 @@ break; case F_GETOWN: - mtx_assert(&Giant, MA_OWNED); fhold(fp); FILEDESC_UNLOCK(fdp); error = fo_ioctl(fp, FIOGETOWN, &tmp, td->td_ucred, td); @@ -467,7 +448,6 @@ break; case F_SETOWN: - mtx_assert(&Giant, MA_OWNED); fhold(fp); FILEDESC_UNLOCK(fdp); tmp = arg; @@ -476,12 +456,10 @@ break; case F_SETLKW: - mtx_assert(&Giant, MA_OWNED); flg |= F_WAIT; /* FALLTHROUGH F_SETLK */ case F_SETLK: - mtx_assert(&Giant, MA_OWNED); if (fp->f_type != DTYPE_VNODE) { FILEDESC_UNLOCK(fdp); error = EBADF; @@ -555,7 +533,6 @@ break; case F_GETLK: - mtx_assert(&Giant, MA_OWNED); if (fp->f_type != DTYPE_VNODE) { FILEDESC_UNLOCK(fdp); error = EBADF; ==== //depot/projects/kmacy_sun4v_stable/src/sys/kern/kern_umtx.c#2 (text+ko) ==== @@ -97,7 +97,6 @@ static void umtxq_init_chains(void *); static int umtxq_hash(struct umtx_key *key); static struct mtx *umtxq_mtx(int chain); -static void umtxq_lock(struct umtx_key *key); static void umtxq_unlock(struct umtx_key *key); static void umtxq_busy(struct umtx_key *key); static void umtxq_unbusy(struct umtx_key *key); @@ -188,12 +187,20 @@ wakeup_one(&umtxq_chains[chain]); } +#define umtxq_lock(key) \ +do { \ + int chain = umtxq_hash(key); \ + mtx_lock(umtxq_mtx(chain)); \ +} while (0) + +#if 0 static inline void umtxq_lock(struct umtx_key *key) { int chain = umtxq_hash(key); - mtx_lock(umtxq_mtx(chain)); + mtx_lock(umtxq_mtx(chain)); } +#endif static inline void umtxq_unlock(struct umtx_key *key) ==== //depot/projects/kmacy_sun4v_stable/src/sys/kern/sys_pipe.c#2 (text+ko) ==== @@ -153,7 +153,7 @@ .fo_kqfilter = pipe_kqfilter, .fo_stat = pipe_stat, .fo_close = pipe_close, - .fo_flags = DFLAG_PASSABLE + .fo_flags = DFLAG_PASSABLE | DFLAG_MPSAFE }; static void filt_pipedetach(struct knote *kn); ==== //depot/projects/kmacy_sun4v_stable/src/sys/kern/sys_socket.c#2 (text+ko) ==== @@ -63,7 +63,7 @@ .fo_kqfilter = soo_kqfilter, .fo_stat = soo_stat, .fo_close = soo_close, - .fo_flags = DFLAG_PASSABLE + .fo_flags = DFLAG_PASSABLE | DFLAG_MPSAFE }; /* ARGSUSED */ ==== //depot/projects/kmacy_sun4v_stable/src/sys/sys/filedesc.h#2 (text+ko) ==== @@ -114,7 +114,7 @@ ("fdesc locking mistake %d should be %d", (fd)->fd_locked, 2)); \ (fd)->fd_locked = 0; \ if ((fd)->fd_wanted) \ - wakeup(&(fd)->fd_locked); \ + wakeup_one(&(fd)->fd_locked); \ mtx_unlock(&(fd)->fd_mtx); \ } while (0) @@ -134,7 +134,7 @@ ("fdesc locking mistake %d should be %d", (fd)->fd_locked, 1)); \ (fd)->fd_locked = 0; \ if ((fd)->fd_wanted) \ - wakeup(&(fd)->fd_locked); \ + wakeup_one(&(fd)->fd_locked); \ mtx_unlock(&(fd)->fd_mtx); \ } while (0) ==== //depot/projects/kmacy_sun4v_stable/src/sys/sys/lock.h#2 (text+ko) ==== @@ -72,7 +72,7 @@ #define LO_PROFILE 0x10000000 /* Enable per-lock profiling */ /* - * Lock classes are statically assigned an index into the gobal lock_classes + * Lock classes are statically assigned an index into the global lock_classes * array. Debugging code looks up the lock class for a given lock object * by indexing the array. */ ==== //depot/projects/kmacy_sun4v_stable/src/sys/sys/socket.h#2 (text+ko) ==== @@ -208,7 +208,8 @@ #define AF_SCLUSTER 34 /* Sitara cluster protocol */ #define AF_ARP 35 #define AF_BLUETOOTH 36 /* Bluetooth sockets */ -#define AF_MAX 37 +#define AF_STUB 37 /* Stub sample protocol */ +#define AF_MAX 38 #endif /* @@ -293,6 +294,7 @@ #define PF_SCLUSTER AF_SCLUSTER #define PF_ARP AF_ARP #define PF_BLUETOOTH AF_BLUETOOTH +#define PF_STUB AF_STUB #define PF_MAX AF_MAX ==== //depot/projects/kmacy_sun4v_stable/src/sys/sys/unpcb.h#2 (text+ko) ==== @@ -78,6 +78,7 @@ unp_gen_t unp_gencnt; /* generation count of this instance */ int unp_flags; /* flags */ struct xucred unp_peercred; /* peer credentials, if applicable */ + struct mtx unp_mtx; /* mutex */ }; /* @@ -98,6 +99,14 @@ #define UNP_WANTCRED 0x004 /* credentials wanted */ #define UNP_CONNWAIT 0x008 /* connect blocks until accepted */ +/* + * These flags are used to handle non-atomicity in connect() and bind() + * operations on a socket: in particular, to avoid races between multiple + * threads or processes operating simultaneously on the same socket. + */ +#define UNP_CONNECTING 0x010 /* Currently connecting. */ +#define UNP_BINDING 0x020 /* Currently binding. */ + #define sotounpcb(so) ((struct unpcb *)((so)->so_pcb)) /* Hack alert -- this structure depends on <sys/socketvar.h>. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606290401.k5T41G21098624>