FreeBSD kernel kern code
sys_generic.c File Reference
#include <sys/cdefs.h>
#include "opt_capsicum.h"
#include "opt_compat.h"
#include "opt_ktrace.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/capability.h>
#include <sys/filedesc.h>
#include <sys/filio.h>
#include <sys/fcntl.h>
#include <sys/file.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
#include <sys/socketvar.h>
#include <sys/uio.h>
#include <sys/kernel.h>
#include <sys/ktr.h>
#include <sys/limits.h>
#include <sys/malloc.h>
#include <sys/poll.h>
#include <sys/resourcevar.h>
#include <sys/selinfo.h>
#include <sys/sleepqueue.h>
#include <sys/syscallsubr.h>
#include <sys/sysctl.h>
#include <sys/sysent.h>
#include <sys/vnode.h>
#include <sys/bio.h>
#include <sys/buf.h>
#include <sys/condvar.h>
#include <security/audit/audit.h>
Include dependency graph for sys_generic.c:

Go to the source code of this file.

Data Structures

struct  seltd
 
struct  selfd
 
struct  read_args
 
struct  pread_args
 
struct  readv_args
 
struct  preadv_args
 
struct  write_args
 
struct  pwrite_args
 
struct  writev_args
 
struct  pwritev_args
 
struct  ftruncate_args
 
struct  ioctl_args
 
struct  select_args
 
struct  poll_args
 
struct  openbsd_poll_args
 

Macros

#define SYS_IOCTL_SMALL_SIZE   128 /* bytes */
 
#define SYS_IOCTL_SMALL_ALIGN   8 /* bytes */
 
#define SELTD_PENDING   0x0001 /* We have pending events. */
 
#define SELTD_RESCAN   0x0002 /* Doing a rescan. */
 
#define getbits(name, x)
 
#define swizzle_fdset(bits)
 
#define putbits(name, x)
 

Functions

 __FBSDID ("$BSDSUniX$")
 
 SYSCTL_INT (_debug, OID_AUTO, iosize_max_clamp, CTLFLAG_RW,&iosize_max_clamp, 0,"Clamp max i/o size to INT_MAX")
 
 SYSCTL_INT (_debug, OID_AUTO, devfs_iosize_max_clamp, CTLFLAG_RW,&devfs_iosize_max_clamp, 0,"Clamp max i/o size to INT_MAX for devices")
 
 CTASSERT (sizeof(register_t) >=sizeof(size_t))
 
static MALLOC_DEFINE (M_IOCTLOPS,"ioctlops","ioctl data buffer")
 
static MALLOC_DEFINE (M_SELECT,"select","select() buffer")
 
 MALLOC_DEFINE (M_IOV,"iov","large iov's")
 
static int pollout (struct thread *, struct pollfd *, struct pollfd *, u_int)
 
static int pollscan (struct thread *, struct pollfd *, u_int)
 
static int pollrescan (struct thread *)
 
static int selscan (struct thread *, fd_mask **, fd_mask **, int)
 
static int selrescan (struct thread *, fd_mask **, fd_mask **)
 
static void selfdalloc (struct thread *, void *)
 
static void selfdfree (struct seltd *, struct selfd *)
 
static int dofileread (struct thread *, int, struct file *, struct uio *, off_t, int)
 
static int dofilewrite (struct thread *, int, struct file *, struct uio *, off_t, int)
 
static void doselwakeup (struct selinfo *, int)
 
static void seltdinit (struct thread *)
 
static int seltdwait (struct thread *, int)
 
static void seltdclear (struct thread *)
 
int sys_read (struct thread *td, struct read_args *uap)
 
int sys_pread (struct thread *td, struct pread_args *uap)
 
int freebsd6_pread (struct thread *td, struct freebsd6_pread_args *uap)
 
int sys_readv (struct thread *td, struct readv_args *uap)
 
int kern_readv (struct thread *td, int fd, struct uio *auio)
 
int sys_preadv (struct thread *td, struct preadv_args *uap)
 
int kern_preadv (struct thread *td, int fd, struct uio *auio, off_t offset)
 
int sys_write (struct thread *td, struct write_args *uap)
 
int sys_pwrite (struct thread *td, struct pwrite_args *uap)
 
int freebsd6_pwrite (struct thread *td, struct freebsd6_pwrite_args *uap)
 
int sys_writev (struct thread *td, struct writev_args *uap)
 
int kern_writev (struct thread *td, int fd, struct uio *auio)
 
int sys_pwritev (struct thread *td, struct pwritev_args *uap)
 
int kern_pwritev (struct thread *td, int fd, struct uio *auio, off_t offset)
 
int kern_ftruncate (struct thread *td, int fd, off_t length)
 
int sys_ftruncate (struct thread *td, struct ftruncate_args *uap)
 
int sys_ioctl (struct thread *td, struct ioctl_args *uap)
 
int kern_ioctl (struct thread *td, int fd, u_long com, caddr_t data)
 
int poll_no_poll (int events)
 
int sys_pselect (struct thread *td, struct pselect_args *uap)
 
int kern_pselect (struct thread *td, int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tvp, sigset_t *uset, int abi_nfdbits)
 
int sys_select (struct thread *td, struct select_args *uap)
 
static int select_check_badfd (fd_set *fd_in, int nd, int ndu, int abi_nfdbits)
 
int kern_select (struct thread *td, int nd, fd_set *fd_in, fd_set *fd_ou, fd_set *fd_ex, struct timeval *tvp, int abi_nfdbits)
 
static __inline int selflags (fd_mask **ibits, int idx, fd_mask bit)
 
static __inline int selsetbits (fd_mask **ibits, fd_mask **obits, int idx, fd_mask bit, int events)
 
static __inline int getselfd_cap (struct filedesc *fdp, int fd, struct file **fpp)
 
int sys_poll (struct thread *td, struct poll_args *uap)
 
int sys_openbsd_poll (struct thread *td, struct openbsd_poll_args *uap)
 
int selsocket (struct socket *so, int events, struct timeval *tvp, struct thread *td)
 
void seldrain (struct selinfo *sip)
 
void selrecord (struct thread *selector, struct selinfo *sip)
 
void selwakeup (struct selinfo *sip)
 
void selwakeuppri (struct selinfo *sip, int pri)
 
void seltdfini (struct thread *td)
 
static void selectinit (void *)
 
 SYSINIT (select, SI_SUB_SYSCALLS, SI_ORDER_ANY, selectinit, NULL)
 
static void selectinit (void *dummy __unused)
 

Variables

int iosize_max_clamp = 1
 
int devfs_iosize_max_clamp = 1
 
static uma_zone_t selfd_zone
 
static struct mtx_poolmtxpool_select
 
static int select_flags [3]
 

Macro Definition Documentation

#define getbits (   name,
 
)
Value:
do { \
if (name == NULL) { \
ibits[x] = NULL; \
obits[x] = NULL; \
} else { \
ibits[x] = sbp + nbufbytes / 2 / sizeof *sbp; \
obits[x] = sbp; \
sbp += ncpbytes / sizeof *sbp; \
error = copyin(name, ibits[x], ncpubytes); \
if (error != 0) \
goto done; \
bzero((char *)ibits[x] + ncpubytes, \
ncpbytes - ncpubytes); \
} \
} while (0)
const char * name
Definition: kern_fail.c:97

Referenced by kern_select().

#define putbits (   name,
 
)
Value:
if (name && (error2 = copyout(obits[x], name, ncpubytes))) \
error = error2;
const char * name
Definition: kern_fail.c:97

Referenced by kern_select().

#define SELTD_PENDING   0x0001 /* We have pending events. */

Definition at line 141 of file sys_generic.c.

Referenced by doselwakeup(), and seltdwait().

#define SELTD_RESCAN   0x0002 /* Doing a rescan. */

Definition at line 142 of file sys_generic.c.

Referenced by selrecord(), and seltdwait().

#define swizzle_fdset (   bits)

Referenced by kern_select().

#define SYS_IOCTL_SMALL_ALIGN   8 /* bytes */

Definition at line 89 of file sys_generic.c.

Referenced by sys_ioctl().

#define SYS_IOCTL_SMALL_SIZE   128 /* bytes */

Definition at line 88 of file sys_generic.c.

Referenced by sys_ioctl().

Function Documentation

__FBSDID ( "$BSDSUniX$"  )
CTASSERT ( sizeof(register_t) >=sizeof(size_t)  )
static int dofileread ( struct thread *  td,
int  fd,
struct file *  fp,
struct uio *  auio,
off_t  offset,
int  flags 
)
static

Definition at line 326 of file sys_generic.c.

References cloneuio().

Referenced by kern_preadv(), and kern_readv().

Here is the call graph for this function:

Here is the caller graph for this function:

static int dofilewrite ( struct thread *  td,
int  fd,
struct file *  fp,
struct uio *  auio,
off_t  offset,
int  flags 
)
static

Definition at line 535 of file sys_generic.c.

References bwillwrite(), cloneuio(), and tdsignal().

Referenced by kern_pwritev(), and kern_writev().

Here is the call graph for this function:

Here is the caller graph for this function:

static void doselwakeup ( struct selinfo *  sip,
int  pri 
)
static

Definition at line 1675 of file sys_generic.c.

References cv_broadcastpri(), and SELTD_PENDING.

Referenced by seldrain(), selwakeup(), and selwakeuppri().

Here is the call graph for this function:

Here is the caller graph for this function:

int freebsd6_pread ( struct thread *  td,
struct freebsd6_pread_args *  uap 
)

Definition at line 222 of file sys_generic.c.

References pread_args::buf, pread_args::fd, pread_args::nbyte, pread_args::offset, and sys_pread().

Here is the call graph for this function:

int freebsd6_pwrite ( struct thread *  td,
struct freebsd6_pwrite_args *  uap 
)

Definition at line 431 of file sys_generic.c.

References pwrite_args::buf, pwrite_args::fd, pwrite_args::nbyte, pwrite_args::offset, and sys_pwrite().

Here is the call graph for this function:

static __inline int getselfd_cap ( struct filedesc *  fdp,
int  fd,
struct file **  fpp 
)
static

Definition at line 1152 of file sys_generic.c.

References cap_funwrap(), and fget_unlocked().

Referenced by selrescan(), and selscan().

Here is the call graph for this function:

Here is the caller graph for this function:

int kern_ftruncate ( struct thread *  td,
int  fd,
off_t  length 
)

Definition at line 589 of file sys_generic.c.

References fget().

Referenced by sys_ftruncate().

Here is the call graph for this function:

Here is the caller graph for this function:

int kern_ioctl ( struct thread *  td,
int  fd,
u_long  com,
caddr_t  data 
)

Definition at line 724 of file sys_generic.c.

References fd, and fget().

Referenced by parse_dir_md(), and sys_ioctl().

Here is the call graph for this function:

Here is the caller graph for this function:

int kern_preadv ( struct thread *  td,
int  fd,
struct uio *  auio,
off_t  offset 
)

Definition at line 299 of file sys_generic.c.

References dofileread(), and fget_read().

Referenced by sys_pread(), and sys_preadv().

Here is the call graph for this function:

Here is the caller graph for this function:

int kern_pselect ( struct thread *  td,
int  nd,
fd_set *  in,
fd_set *  ou,
fd_set *  ex,
struct timeval *  tvp,
sigset_t *  uset,
int  abi_nfdbits 
)

Definition at line 817 of file sys_generic.c.

References kern_select(), and kern_sigprocmask().

Referenced by sys_pselect().

Here is the call graph for this function:

Here is the caller graph for this function:

int kern_pwritev ( struct thread *  td,
int  fd,
struct uio *  auio,
off_t  offset 
)

Definition at line 508 of file sys_generic.c.

References dofilewrite(), and fget_write().

Referenced by sys_pwrite(), and sys_pwritev().

Here is the call graph for this function:

Here is the caller graph for this function:

int kern_readv ( struct thread *  td,
int  fd,
struct uio *  auio 
)

Definition at line 260 of file sys_generic.c.

References dofileread(), and fget_read().

Referenced by sys_read(), and sys_readv().

Here is the call graph for this function:

Here is the caller graph for this function:

int kern_select ( struct thread *  td,
int  nd,
fd_set *  fd_in,
fd_set *  fd_ou,
fd_set *  fd_ex,
struct timeval *  tvp,
int  abi_nfdbits 
)

Definition at line 915 of file sys_generic.c.

References free(), getbits, getmicrouptime(), hz, itimerfix(), malloc(), putbits, select_check_badfd(), selrescan(), selscan(), seltdclear(), seltdinit(), seltdwait(), swizzle_fdset, timevaladd(), timevalsub(), and tvtohz().

Referenced by kern_pselect(), and sys_select().

Here is the call graph for this function:

Here is the caller graph for this function:

int kern_writev ( struct thread *  td,
int  fd,
struct uio *  auio 
)

Definition at line 469 of file sys_generic.c.

References dofilewrite(), and fget_write().

Referenced by kern_sendfile(), sys_write(), and sys_writev().

Here is the call graph for this function:

Here is the caller graph for this function:

static MALLOC_DEFINE ( M_IOCTLOPS  ,
"ioctlops"  ,
"ioctl data buffer"   
)
static
static MALLOC_DEFINE ( M_SELECT  ,
"select"  ,
"select() buffer"   
)
static
MALLOC_DEFINE ( M_IOV  ,
"iov"  ,
"large iov's"   
)
int poll_no_poll ( int  events)

Definition at line 774 of file sys_generic.c.

Referenced by no_poll(), and vop_nopoll().

Here is the caller graph for this function:

static int pollout ( struct thread *  td,
struct pollfd *  fds,
struct pollfd *  ufds,
u_int  nfd 
)
static

Definition at line 1401 of file sys_generic.c.

Referenced by sys_poll().

Here is the caller graph for this function:

static int pollrescan ( struct thread *  td)
static

Definition at line 1351 of file sys_generic.c.

References cap_funwrap(), fd, and selfdfree().

Referenced by sys_poll().

Here is the call graph for this function:

Here is the caller graph for this function:

static int pollscan ( struct thread *  td,
struct pollfd *  fds,
u_int  nfd 
)
static

Definition at line 1426 of file sys_generic.c.

References cap_funwrap(), and selfdalloc().

Referenced by sys_poll().

Here is the call graph for this function:

Here is the caller graph for this function:

void seldrain ( struct selinfo *  sip)

Definition at line 1587 of file sys_generic.c.

References doselwakeup().

Referenced by destroy_vpollinfo(), kqueue_close(), mqueue_free(), pipeclose(), ptsdrv_free(), sofree(), and tty_dealloc().

Here is the call graph for this function:

Here is the caller graph for this function:

static int select_check_badfd ( fd_set *  fd_in,
int  nd,
int  ndu,
int  abi_nfdbits 
)
static

Definition at line 876 of file sys_generic.c.

Referenced by kern_select().

Here is the caller graph for this function:

static void selectinit ( void *  )
static
static void selectinit ( void *dummy  __unused)
static

Definition at line 1786 of file sys_generic.c.

References mtx_pool_create().

Here is the call graph for this function:

static void selfdalloc ( struct thread *  td,
void *  cookie 
)
static

Definition at line 1559 of file sys_generic.c.

Referenced by pollscan(), selscan(), and selsocket().

Here is the caller graph for this function:

static void selfdfree ( struct seltd stp,
struct selfd sfp 
)
static

Definition at line 1575 of file sys_generic.c.

Referenced by pollrescan(), selrescan(), and seltdclear().

Here is the caller graph for this function:

static __inline int selflags ( fd_mask **  ibits,
int  idx,
fd_mask  bit 
)
static

Definition at line 1102 of file sys_generic.c.

Referenced by selrescan(), and selscan().

Here is the caller graph for this function:

void selrecord ( struct thread *  selector,
struct selinfo *  sip 
)

Definition at line 1606 of file sys_generic.c.

References mtx_pool_find(), panic(), and SELTD_RESCAN.

Referenced by devpoll(), kqueue_poll(), logpoll(), mqf_poll(), pipe_poll(), ptsdev_poll(), sopoll_generic(), ttydev_poll(), and vn_pollrecord().

Here is the call graph for this function:

Here is the caller graph for this function:

static int selrescan ( struct thread *  td,
fd_mask **  ibits,
fd_mask **  obits 
)
static

Definition at line 1187 of file sys_generic.c.

References fd, getselfd_cap(), selfdfree(), selflags(), and selsetbits().

Referenced by kern_select().

Here is the call graph for this function:

Here is the caller graph for this function:

static int selscan ( struct thread *  td,
fd_mask **  ibits,
fd_mask **  obits,
int  nfd 
)
static

Definition at line 1229 of file sys_generic.c.

References fd, getselfd_cap(), selfdalloc(), selflags(), and selsetbits().

Referenced by kern_select().

Here is the call graph for this function:

Here is the caller graph for this function:

static __inline int selsetbits ( fd_mask **  ibits,
fd_mask **  obits,
int  idx,
fd_mask  bit,
int  events 
)
static

Definition at line 1123 of file sys_generic.c.

Referenced by selrescan(), and selscan().

Here is the caller graph for this function:

int selsocket ( struct socket *  so,
int  events,
struct timeval *  tvp,
struct thread *  td 
)

Definition at line 1505 of file sys_generic.c.

References getmicrouptime(), hz, itimerfix(), selfdalloc(), seltdclear(), seltdinit(), seltdwait(), sopoll(), timevaladd(), timevalsub(), and tvtohz().

Here is the call graph for this function:

static void seltdclear ( struct thread *  td)
static

Definition at line 1771 of file sys_generic.c.

References selfdfree().

Referenced by kern_select(), selsocket(), and sys_poll().

Here is the call graph for this function:

Here is the caller graph for this function:

void seltdfini ( struct thread *  td)

Definition at line 1751 of file sys_generic.c.

References free().

Referenced by thread_fini().

Here is the call graph for this function:

Here is the caller graph for this function:

static void seltdinit ( struct thread *  td)
static

Definition at line 1707 of file sys_generic.c.

References cv_init(), malloc(), and mtx_init().

Referenced by kern_select(), selsocket(), and sys_poll().

Here is the call graph for this function:

Here is the caller graph for this function:

static int seltdwait ( struct thread *  td,
int  timo 
)
static

Definition at line 1722 of file sys_generic.c.

References SELTD_PENDING, and SELTD_RESCAN.

Referenced by kern_select(), selsocket(), and sys_poll().

Here is the caller graph for this function:

void selwakeup ( struct selinfo *  sip)

Definition at line 1656 of file sys_generic.c.

References doselwakeup().

Referenced by _mqueue_recv(), _mqueue_send(), devctl_queue_data_f(), mqueue_fdclose(), ptsdrv_inwakeup(), ptsdrv_outwakeup(), and tty_wakeup().

Here is the call graph for this function:

Here is the caller graph for this function:

void selwakeuppri ( struct selinfo *  sip,
int  pri 
)

Definition at line 1664 of file sys_generic.c.

References doselwakeup().

Referenced by kqueue_close(), kqueue_wakeup(), logtimeout(), pipeselwakeup(), sohasoutofband(), and sowakeup().

Here is the call graph for this function:

Here is the caller graph for this function:

int sys_ftruncate ( struct thread *  td,
struct ftruncate_args uap 
)

Definition at line 621 of file sys_generic.c.

References ftruncate_args::fd, kern_ftruncate(), and ftruncate_args::length.

Referenced by freebsd6_ftruncate().

Here is the call graph for this function:

Here is the caller graph for this function:

int sys_ioctl ( struct thread *  td,
struct ioctl_args uap 
)

Definition at line 655 of file sys_generic.c.

References __aligned(), ioctl_args::com, ioctl_args::data, ioctl_args::fd, free(), kern_ioctl(), malloc(), printf(), SYS_IOCTL_SMALL_ALIGN, and SYS_IOCTL_SMALL_SIZE.

Here is the call graph for this function:

int sys_openbsd_poll ( struct thread *  td,
struct openbsd_poll_args uap 
)

Definition at line 1491 of file sys_generic.c.

References sys_poll().

Here is the call graph for this function:

int sys_poll ( struct thread *  td,
struct poll_args uap 
)

Definition at line 1273 of file sys_generic.c.

References poll_args::fds, free(), getmicrouptime(), hz, itimerfix(), malloc(), maxfilesperproc, poll_args::nfds, pollout(), pollrescan(), pollscan(), seltdclear(), seltdinit(), seltdwait(), poll_args::timeout, timevaladd(), timevalsub(), and tvtohz().

Referenced by sys_openbsd_poll().

Here is the call graph for this function:

Here is the caller graph for this function:

int sys_pread ( struct thread *  td,
struct pread_args uap 
)

Definition at line 201 of file sys_generic.c.

References pread_args::buf, pread_args::fd, kern_preadv(), pread_args::nbyte, and pread_args::offset.

Referenced by freebsd6_pread().

Here is the call graph for this function:

Here is the caller graph for this function:

int sys_preadv ( struct thread *  td,
struct preadv_args uap 
)

Definition at line 285 of file sys_generic.c.

References copyinuio(), preadv_args::fd, free(), preadv_args::iovcnt, preadv_args::iovp, kern_preadv(), and preadv_args::offset.

Here is the call graph for this function:

int sys_pselect ( struct thread *  td,
struct pselect_args *  uap 
)

Definition at line 790 of file sys_generic.c.

References kern_pselect(), and set.

Here is the call graph for this function:

int sys_pwrite ( struct thread *  td,
struct pwrite_args uap 
)

Definition at line 410 of file sys_generic.c.

References pwrite_args::buf, pwrite_args::fd, kern_pwritev(), pwrite_args::nbyte, and pwrite_args::offset.

Referenced by freebsd6_pwrite().

Here is the call graph for this function:

Here is the caller graph for this function:

int sys_pwritev ( struct thread *  td,
struct pwritev_args uap 
)

Definition at line 494 of file sys_generic.c.

References copyinuio(), pwritev_args::fd, free(), pwritev_args::iovcnt, pwritev_args::iovp, kern_pwritev(), and pwritev_args::offset.

Here is the call graph for this function:

int sys_read ( struct thread *  td,
struct read_args uap 
)

Definition at line 168 of file sys_generic.c.

References read_args::buf, read_args::fd, kern_readv(), and read_args::nbyte.

Here is the call graph for this function:

int sys_readv ( struct thread *  td,
struct readv_args uap 
)

Definition at line 246 of file sys_generic.c.

References copyinuio(), readv_args::fd, free(), readv_args::iovcnt, readv_args::iovp, and kern_readv().

Here is the call graph for this function:

int sys_select ( struct thread *  td,
struct select_args uap 
)

Definition at line 849 of file sys_generic.c.

References select_args::ex, select_args::in, kern_select(), select_args::nd, select_args::ou, and select_args::tv.

Here is the call graph for this function:

int sys_write ( struct thread *  td,
struct write_args uap 
)

Definition at line 377 of file sys_generic.c.

References write_args::buf, write_args::fd, kern_writev(), and write_args::nbyte.

Here is the call graph for this function:

int sys_writev ( struct thread *  td,
struct writev_args uap 
)

Definition at line 455 of file sys_generic.c.

References copyinuio(), writev_args::fd, free(), writev_args::iovcnt, writev_args::iovp, and kern_writev().

Here is the call graph for this function:

SYSCTL_INT ( _debug  ,
OID_AUTO  ,
iosize_max_clamp  ,
CTLFLAG_RW  ,
iosize_max_clamp,
,
"Clamp max i/o size to INT_MAX"   
)
SYSCTL_INT ( _debug  ,
OID_AUTO  ,
devfs_iosize_max_clamp  ,
CTLFLAG_RW  ,
devfs_iosize_max_clamp,
,
"Clamp max i/o size to INT_MAX for devices"   
)
SYSINIT ( select  ,
SI_SUB_SYSCALLS  ,
SI_ORDER_ANY  ,
selectinit  ,
NULL   
)

Variable Documentation

int devfs_iosize_max_clamp = 1

Definition at line 94 of file sys_generic.c.

int iosize_max_clamp = 1

Definition at line 91 of file sys_generic.c.

struct mtx_pool* mtxpool_select
static

Definition at line 158 of file sys_generic.c.

int select_flags[3]
static
Initial value:
= {
POLLRDNORM | POLLHUP | POLLERR,
POLLWRNORM | POLLHUP | POLLERR,
POLLRDBAND | POLLERR
}

Definition at line 1091 of file sys_generic.c.

uma_zone_t selfd_zone
static

Definition at line 157 of file sys_generic.c.