diff options
author | smpatel <smpatel@FreeBSD.org> | 1996-08-20 07:18:10 +0000 |
---|---|---|
committer | smpatel <smpatel@FreeBSD.org> | 1996-08-20 07:18:10 +0000 |
commit | c61e4bcfdb1e5ae975e1d75cbeb8a7ed1ceebe97 (patch) | |
tree | ab6497bc38f907dc6bb88c6b38fd4b7e32a584ee /sys | |
parent | 076318a498c311c3ddbad40c9ce240e63ae19657 (diff) | |
download | FreeBSD-src-c61e4bcfdb1e5ae975e1d75cbeb8a7ed1ceebe97.zip FreeBSD-src-c61e4bcfdb1e5ae975e1d75cbeb8a7ed1ceebe97.tar.gz |
Remove the kernel FD_SETSIZE limit for select().
Make select()'s first argument 'int' not 'u_int'.
Reviewed by: bde
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/kern_exit.c | 8 | ||||
-rw-r--r-- | sys/kern/sys_generic.c | 58 | ||||
-rw-r--r-- | sys/kern/syscalls.master | 4 | ||||
-rw-r--r-- | sys/sys/malloc.h | 6 | ||||
-rw-r--r-- | sys/sys/proc.h | 5 | ||||
-rw-r--r-- | sys/sys/sysproto.h | 2 |
6 files changed, 61 insertions, 22 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index d7e4202..fc58173 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_exit.c 8.7 (Berkeley) 2/12/94 - * $Id: kern_exit.c,v 1.35 1996/07/30 03:08:37 dyson Exp $ + * $Id: kern_exit.c,v 1.36 1996/08/19 02:28:23 julian Exp $ */ #include "opt_ktrace.h" @@ -160,6 +160,12 @@ exit1(p, rv) fdfree(p); /* + * Delete select() buffers + */ + if (p->p_selbits) + free (p->p_selbits, M_SELECT); + + /* * XXX Shutdown SYSV semaphores */ semexit(p); diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index acf407b..27b9910 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)sys_generic.c 8.5 (Berkeley) 1/21/94 - * $Id: sys_generic.c,v 1.17 1995/12/14 08:31:48 phk Exp $ + * $Id: sys_generic.c,v 1.18 1996/01/03 21:42:17 wollman Exp $ */ #include "opt_ktrace.h" @@ -61,7 +61,7 @@ #endif #include <vm/vm.h> -static int selscan __P((struct proc *, fd_set *, fd_set *, int, int *)); +static int selscan __P((struct proc *, fd_mask **, fd_mask **, int, int *)); /* * Read system call. @@ -516,7 +516,7 @@ int selwait; */ #ifndef _SYS_SYSPROTO_H_ struct select_args { - u_int nd; + int nd; fd_set *in, *ou, *ex; struct timeval *tv; }; @@ -527,22 +527,49 @@ select(p, uap, retval) register struct select_args *uap; int *retval; { - fd_set ibits[3], obits[3]; + fd_mask *ibits[3], *obits[3]; struct timeval atv; - int s, ncoll, error = 0, timo; + int s, ncoll, error = 0, timo, i; u_int ni; - bzero((caddr_t)ibits, sizeof(ibits)); - bzero((caddr_t)obits, sizeof(obits)); - if (uap->nd > FD_SETSIZE) - return (EINVAL); + if (uap->nd < 0) + return EINVAL; + if (uap->nd > p->p_fd->fd_nfiles) - uap->nd = p->p_fd->fd_nfiles; /* forgiving; slightly wrong */ + uap->nd = p->p_fd->fd_nfiles; /* forgiving; slightly wrong */ + + /* The amount of space we need to allocate */ + ni = howmany(roundup2 (uap->nd, FD_SETSIZE), NFDBITS) * + sizeof(fd_mask); + + if (ni > p->p_selbits_size) { + if (p->p_selbits_size) + free (p->p_selbits, M_SELECT); + + while (p->p_selbits_size < ni) + p->p_selbits_size += 32; /* Increase by 256 bits */ + + p->p_selbits = malloc(p->p_selbits_size * 6, M_SELECT, + M_WAITOK); + } + for (i = 0; i < 3; i++) { + ibits[i] = (fd_mask *)(p->p_selbits + i * p->p_selbits_size); + obits[i] = (fd_mask *)(p->p_selbits + (i + 3) * + p->p_selbits_size); + } + + /* + * This buffer is usually very small therefore it's probably faster + * to just zero it, rather than calculate what needs to be zeroed. + */ + bzero (p->p_selbits, p->p_selbits_size * 6); + + /* The amount of space we need to copyin/copyout */ ni = howmany(uap->nd, NFDBITS) * sizeof(fd_mask); #define getbits(name, x) \ if (uap->name && \ - (error = copyin((caddr_t)uap->name, (caddr_t)&ibits[x], ni))) \ + (error = copyin((caddr_t)uap->name, (caddr_t)ibits[x], ni))) \ goto done; getbits(in, 0); getbits(ou, 1); @@ -600,7 +627,7 @@ done: error = 0; #define putbits(name, x) \ if (uap->name && \ - (error2 = copyout((caddr_t)&obits[x], (caddr_t)uap->name, ni))) \ + (error2 = copyout((caddr_t)obits[x], (caddr_t)uap->name, ni))) \ error = error2; if (error == 0) { int error2; @@ -616,7 +643,7 @@ done: static int selscan(p, ibits, obits, nfd, retval) struct proc *p; - fd_set *ibits, *obits; + fd_mask **ibits, **obits; int nfd, *retval; { register struct filedesc *fdp = p->p_fd; @@ -628,14 +655,15 @@ selscan(p, ibits, obits, nfd, retval) for (msk = 0; msk < 3; msk++) { for (i = 0; i < nfd; i += NFDBITS) { - bits = ibits[msk].fds_bits[i/NFDBITS]; + bits = ibits[msk][i/NFDBITS]; while ((j = ffs(bits)) && (fd = i + --j) < nfd) { bits &= ~(1 << j); fp = fdp->fd_ofiles[fd]; if (fp == NULL) return (EBADF); if ((*fp->f_ops->fo_select)(fp, flag[msk], p)) { - FD_SET(fd, &obits[msk]); + obits[msk][(fd)/NFDBITS] |= + (1 << ((fd) % NFDBITS)); n++; } } diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index ba6ef55..ad5ba53 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -1,4 +1,4 @@ - $Id: syscalls.master,v 1.26 1996/02/23 18:20:44 peter Exp $ + $Id: syscalls.master,v 1.27 1996/03/02 16:51:25 peter Exp $ ; from: @(#)syscalls.master 8.2 (Berkeley) 1/13/94 ; ; System call name/number master file. @@ -152,7 +152,7 @@ ; XXX should be { int fcntl(int fd, int cmd, ...); } ; but we're not ready for varargs. ; XXX man page says `int arg' too. -93 STD BSD { int select(u_int nd, fd_set *in, fd_set *ou, \ +93 STD BSD { int select(int nd, fd_set *in, fd_set *ou, \ fd_set *ex, struct timeval *tv); } 94 UNIMPL BSD setdopt 95 STD POSIX { int fsync(int fd); } diff --git a/sys/sys/malloc.h b/sys/sys/malloc.h index 75860e4..70f85e0 100644 --- a/sys/sys/malloc.h +++ b/sys/sys/malloc.h @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)malloc.h 8.5 (Berkeley) 5/3/95 - * $Id: malloc.h,v 1.14 1996/06/14 17:22:18 wollman Exp $ + * $Id: malloc.h,v 1.15 1996/08/04 20:12:57 phk Exp $ */ #ifndef _SYS_MALLOC_H_ @@ -128,7 +128,8 @@ #define M_SECA 81 /* security associations, key management */ #define M_BIOBUF 82 /* BIO buffer */ #define M_KTRACE 83 /* KTRACE */ -#define M_LAST 84 /* Must be last type + 1 */ +#define M_SELECT 84 /* select() buffer */ +#define M_LAST 85 /* Must be last type + 1 */ #define INITKMEMNAMES { \ "free", /* 0 M_FREE */ \ @@ -212,6 +213,7 @@ "key mgmt", /* 81 M_SECA */ \ "BIO buffer", /* 82 M_BIOBUF */ \ "KTRACE", /* 83 M_KTRACE */ \ + "select", /* 84 M_SELECT */ \ } struct kmemstats { diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 669567e..43c56af 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)proc.h 8.15 (Berkeley) 5/19/95 - * $Id: proc.h,v 1.25 1996/06/09 15:00:11 alex Exp $ + * $Id: proc.h,v 1.26 1996/07/31 09:26:54 davidg Exp $ */ #ifndef _SYS_PROC_H_ @@ -138,6 +138,9 @@ struct proc { char p_lock; /* Process lock (prevent swap) count. */ char p_pad2[3]; /* alignment */ + char *p_selbits; /* For select(), bits */ + u_int p_selbits_size; /* For select(), fd_set size (bytes) */ + short p_locks; /* DEBUG: lockmgr count of held locks */ short p_simple_locks; /* DEBUG: count of held simple locks */ diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h index b9769c9..d627819 100644 --- a/sys/sys/sysproto.h +++ b/sys/sys/sysproto.h @@ -326,7 +326,7 @@ struct fcntl_args { int arg; }; struct select_args { - u_int nd; + int nd; fd_set * in; fd_set * ou; fd_set * ex; |