freebsd-nq/sys/kern
Robert Watson 265de5bb62 Correct two problems relating to sorflush(), which is called to flush
read socket buffers in shutdown() and close():

- Call socantrcvmore() before sblock() to dislodge any threads that
  might be sleeping (potentially indefinitely) while holding sblock(),
  such as a thread blocked in recv().

- Flag the sblock() call as non-interruptible so that a signal
  delivered to the thread calling sorflush() doesn't cause sblock() to
  fail.  The sblock() is required to ensure that all other socket
  consumer threads have, in fact, left, and do not enter, the socket
  buffer until we're done flushin it.

To implement the latter, change the 'flags' argument to sblock() to
accept two flags, SBL_WAIT and SBL_NOINTR, rather than one M_WAITOK
flag.  When SBL_NOINTR is set, it forces a non-interruptible sx
acquisition, regardless of the setting of the disposition of SB_NOINTR
on the socket buffer; without this change it would be possible for
another thread to clear SB_NOINTR between when the socket buffer mutex
is released and sblock() is invoked.

Reviewed by:	bz, kmacy
Reported by:	Jos Backus <jos at catnook dot com>
2008-01-31 08:22:24 +00:00
..
bus_if.m
clock_if.m
cpufreq_if.m
device_if.m
genassym.sh refactor code so it can run in a chroot without having to have /dev/mounted 2008-01-18 17:02:14 +00:00
imgact_aout.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
imgact_elf32.c
imgact_elf64.c
imgact_elf.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
imgact_gzip.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
imgact_shell.c
inflate.c
init_main.c Don't zero td_runtime when billing thread CPU usage to the process; 2008-01-10 22:11:20 +00:00
init_sysent.c Regenerate. 2008-01-20 23:44:24 +00:00
kern_acct.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
kern_alq.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
kern_clock.c Add a new 'why' argument to kdb_enter(), and a set of constants to use 2007-12-25 17:52:02 +00:00
kern_condvar.c Commit 2/14 of sched_lock decomposition. 2007-06-04 23:50:56 +00:00
kern_conf.c Apply a workaround for the unkillable jail problem where some devices created 2007-12-05 01:22:03 +00:00
kern_context.c
kern_cpu.c Remove duplicate cpufreq levels, i.e. ones that are within 25 Mhz of each 2008-01-16 01:05:21 +00:00
kern_descrip.c Export a type for POSIX SHM file descriptors via kern.proc.filedesc as 2008-01-20 19:55:52 +00:00
kern_environment.c Merge first in a series of TrustedBSD MAC Framework KPI changes 2007-10-24 19:04:04 +00:00
kern_event.c Make ftruncate a 'struct file' operation rather than a vnode operation. 2008-01-07 20:05:19 +00:00
kern_exec.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
kern_exit.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
kern_fork.c When forking, the new thread deserves a name too. Don't just use the 2007-11-15 02:13:44 +00:00
kern_idle.c rename the process to 'idle' and 'intr' as per jhb. 2007-10-27 00:52:26 +00:00
kern_intr.c fix typo in code normally not compiled in. 2007-10-29 20:45:31 +00:00
kern_jail.c Replace the last susers calls in netinet6/ with privilege checks. 2008-01-24 08:25:59 +00:00
kern_kse.c Fix build. 2007-11-15 14:16:20 +00:00
kern_kthread.c Acquire the process mutex and spin locks before calling thread_exit() in 2007-11-15 21:45:17 +00:00
kern_ktr.c
kern_ktrace.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
kern_linker.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
kern_lock.c Cleanup lockmgr interface and exported KPI: 2008-01-24 12:34:30 +00:00
kern_lockf.c Do not call free() while holding vnode interlock. 2007-08-07 09:04:50 +00:00
kern_malloc.c Use vm_offset_t for kmembase and kmemlimit rather than char *, avoiding 2007-06-27 13:39:38 +00:00
kern_mbuf.c - fix tab to space issue, hmm maybe I should use vi. 2007-12-15 23:14:53 +00:00
kern_mib.c Add 'compat_freebsd[4567]' features corresponding to the kernel options 2008-01-17 22:46:32 +00:00
kern_module.c Move several data structure definitions out of freebsd32_misc.c and into 2007-12-06 23:11:27 +00:00
kern_mtxpool.c Universally adopt most conventional spelling of acquire. 2007-05-27 20:50:23 +00:00
kern_mutex.c - Re-implement lock profiling in such a way that it no longer breaks 2007-12-15 23:13:31 +00:00
kern_ntptime.c Only require privilege to set the current time adjustment, not in order to 2007-06-14 18:37:58 +00:00
kern_physio.c
kern_pmc.c Kernel and hwpmc(4) support for callchain capture. 2007-12-07 08:20:17 +00:00
kern_poll.c Remove the now-unused NET_{LOCK,UNLOCK,ASSERT}_GIANT() macros, which 2007-08-06 14:26:03 +00:00
kern_priv.c Continue kernel privilege cleanup for 7.0: unstaticize suser_enabled and 2007-07-02 14:03:29 +00:00
kern_proc.c Don't zero td_runtime when billing thread CPU usage to the process; 2008-01-10 22:11:20 +00:00
kern_prot.c Merge first in a series of TrustedBSD MAC Framework KPI changes 2007-10-24 19:04:04 +00:00
kern_resource.c Don't zero td_runtime when billing thread CPU usage to the process; 2008-01-10 22:11:20 +00:00
kern_rmlock.c Expand lock class with the "virtual" function lc_assert which will offer 2007-11-18 14:43:53 +00:00
kern_rwlock.c Remove a conditional that is always true. 2008-01-17 20:15:15 +00:00
kern_sema.c
kern_shutdown.c Add a wrapper function that bound checks writes to the dump device. 2008-01-28 19:04:07 +00:00
kern_sig.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
kern_subr.c Commit 14/14 of sched_lock decomposition. 2007-06-05 00:00:57 +00:00
kern_switch.c generally we are interested in what thread did something as 2007-11-14 06:21:24 +00:00
kern_sx.c - Re-implement lock profiling in such a way that it no longer breaks 2007-12-15 23:13:31 +00:00
kern_synch.c Don't zero td_runtime when billing thread CPU usage to the process; 2008-01-10 22:11:20 +00:00
kern_syscalls.c
kern_sysctl.c Add sysctl_rename_oid() to support device_set_unit() usage. Otherwise, 2007-11-30 21:29:08 +00:00
kern_tc.c Note what is too {short,long}. 2008-01-02 18:48:27 +00:00
kern_thr.c This time REALLY copy the name from the proc to the thread as a default. 2007-11-15 06:35:26 +00:00
kern_thread.c give thread0 the tid 100000 and bumpt the others to start at 100001 2007-12-22 04:56:48 +00:00
kern_time.c Make sure reading td_runtime in critical section since thread may be 2008-01-18 13:00:28 +00:00
kern_timeout.c Cache the value of c_lock as it can change, in the struct, 2007-11-22 12:15:54 +00:00
kern_umtx.c Check NULL pointer. 2007-12-17 08:09:37 +00:00
kern_uuid.c Correct typo. 2007-04-23 12:53:00 +00:00
kern_xxx.c
ksched.c Commit 14/14 of sched_lock decomposition. 2007-06-05 00:00:57 +00:00
link_elf_obj.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
link_elf.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
linker_if.m Add a function to list symbols in a file and their values at the 2007-11-18 00:23:31 +00:00
Make.tags.inc Remove netkey directory from cscope/TAGs generation and replace 2007-07-05 08:55:14 +00:00
Makefile style.Makefile(5) 2007-12-14 21:30:51 +00:00
makesyscalls.sh Add support for COMPAT6 syscalls. 2007-07-04 22:38:28 +00:00
md4c.c
md5c.c
p1003_1b.c generally we are interested in what thread did something as 2007-11-14 06:21:24 +00:00
posix4_mib.c
sched_4bsd.c - Re-implement lock profiling in such a way that it no longer breaks 2007-12-15 23:13:31 +00:00
sched_ule.c - sched_prio() should only adjust tdq_lowpri if the thread is running or on 2008-01-23 03:10:18 +00:00
serdev_if.m
subr_acl_posix1e.c Eliminate now-unused SUSER_ALLOWJAIL arguments to priv_check_cred(); in 2007-06-12 00:12:01 +00:00
subr_autoconf.c
subr_blist.c
subr_bus.c Add devctl_process_running() so that power management system driver 2008-01-27 16:06:37 +00:00
subr_clist.c
subr_clock.c If clock_ct_to_ts fails to convert time time from the real time clock, 2007-07-23 09:42:32 +00:00
subr_devstat.c
subr_disk.c
subr_eventhandler.c
subr_fattime.c
subr_firmware.c
subr_hints.c
subr_kdb.c Add a new 'why' argument to kdb_enter(), and a set of constants to use 2007-12-25 17:52:02 +00:00
subr_kobj.c
subr_lock.c Fix logic in skipcount handling (used to sample every 1/N lock operations 2008-01-08 01:11:40 +00:00
subr_log.c
subr_mbpool.c Add parens around *free in *free++ in mbp_count() so that mbp_count() 2007-05-27 17:38:36 +00:00
subr_mchain.c
subr_module.c
subr_msgbuf.c
subr_param.c Export maxswzone, maxbcache, maxtsiz, dfldsiz, maxdsiz, dflssiz, maxssiz, 2007-10-16 10:40:53 +00:00
subr_pcpu.c generally we are interested in what thread did something as 2007-11-14 06:21:24 +00:00
subr_power.c
subr_prf.c
subr_prof.c Commit 14/14 of sched_lock decomposition. 2007-06-05 00:00:57 +00:00
subr_rman.c Complete removal of restriction about overlaps to rman_manage_region: 2007-04-28 07:37:49 +00:00
subr_rtc.c
subr_sbuf.c
subr_scanf.c
subr_sleepqueue.c Fix a bug where a thread that hit the race where the sleep timeout fires 2008-01-25 19:44:46 +00:00
subr_smp.c A few whitespace fixes. 2008-01-02 17:09:15 +00:00
subr_stack.c When a symbol name can't be resolved, return "??" as the name, rather 2007-12-03 14:44:35 +00:00
subr_taskqueue.c Rename the kthread_xxx (e.g. kthread_create()) calls 2007-10-20 23:23:23 +00:00
subr_trap.c Kernel and hwpmc(4) support for callchain capture. 2007-12-07 08:20:17 +00:00
subr_turnstile.c generally we are interested in what thread did something as 2007-11-14 06:21:24 +00:00
subr_unit.c Since cdev mutex is after system map mutex in global lock order, free() 2007-07-04 06:56:58 +00:00
subr_witness.c Add a new 'why' argument to kdb_enter(), and a set of constants to use 2007-12-25 17:52:02 +00:00
sys_generic.c Make ftruncate a 'struct file' operation rather than a vnode operation. 2008-01-07 20:05:19 +00:00
sys_pipe.c Make ftruncate a 'struct file' operation rather than a vnode operation. 2008-01-07 20:05:19 +00:00
sys_process.c Use VM_FAULT_DIRTY to fault in pages for write access in 2007-11-08 19:35:36 +00:00
sys_socket.c Make ftruncate a 'struct file' operation rather than a vnode operation. 2008-01-07 20:05:19 +00:00
syscalls.c Regenerate. 2008-01-20 23:44:24 +00:00
syscalls.master Use audit events AUE_SHMOPEN and AUE_SHMUNLINK with new system calls 2008-01-20 23:43:06 +00:00
systrace_args.c Regen for shm_open(2) and shm_unlink(2). 2008-01-08 22:01:26 +00:00
sysv_ipc.c Eliminate now-unused SUSER_ALLOWJAIL arguments to priv_check_cred(); in 2007-06-12 00:12:01 +00:00
sysv_msg.c Merge first in a series of TrustedBSD MAC Framework KPI changes 2007-10-24 19:04:04 +00:00
sysv_sem.c Merge first in a series of TrustedBSD MAC Framework KPI changes 2007-10-24 19:04:04 +00:00
sysv_shm.c Merge first in a series of TrustedBSD MAC Framework KPI changes 2007-10-24 19:04:04 +00:00
tty_compat.c
tty_conf.c
tty_cons.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
tty_pts.c Fix bad function type passed to destroy_dev_sched_cb(). 2007-07-05 05:54:47 +00:00
tty_pty.c In rev. 1.156, the convertion of the minor number to the unit number 2008-01-26 06:09:23 +00:00
tty_subr.c
tty_tty.c Lock Giant and proctree lock around dereferencing p_session->s_ttyvp->v_rdev. 2007-07-03 17:46:37 +00:00
tty.c Close a race in the kern.ttys sysctl handler that resulted in panics in 2008-01-08 04:53:28 +00:00
uipc_accf.c
uipc_cow.c
uipc_debug.c Add missing sb_sndptr* fields to db_print_sockbuf(). 2008-01-03 15:19:31 +00:00
uipc_domain.c Remove the now-unused NET_{LOCK,UNLOCK,ASSERT}_GIANT() macros, which 2007-08-06 14:26:03 +00:00
uipc_mbuf2.c Merge first in a series of TrustedBSD MAC Framework KPI changes 2007-10-24 19:04:04 +00:00
uipc_mbuf.c promote ath_defrag to m_collapse (and retire private+unused 2008-01-17 21:25:09 +00:00
uipc_mqueue.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
uipc_sem.c Free MAC label on a POSIX semaphore when the semaphore is freed. 2008-01-07 22:03:19 +00:00
uipc_shm.c Add a set of regression tests for the POSIX shm API (shm_open(2) and 2008-01-16 15:51:24 +00:00
uipc_sockbuf.c Correct two problems relating to sorflush(), which is called to flush 2008-01-31 08:22:24 +00:00
uipc_socket.c Correct two problems relating to sorflush(), which is called to flush 2008-01-31 08:22:24 +00:00
uipc_syscalls.c Correct two problems relating to sorflush(), which is called to flush 2008-01-31 08:22:24 +00:00
uipc_usrreq.c Move unlock of global UNIX domain socket lock slightly lower in 2008-01-18 19:16:03 +00:00
vfs_acl.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
vfs_aio.c When asked to use kqueue, AIO stores its internal state in the 2008-01-24 17:10:19 +00:00
vfs_bio.c - Introduce the function lockmgr_recursed() which returns true if the 2008-01-19 17:36:23 +00:00
vfs_cache.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
vfs_cluster.c - Move rusage from being per-process in struct pstats to per-thread in 2007-06-01 01:12:45 +00:00
vfs_default.c Cleanup lockmgr interface and exported KPI: 2008-01-24 12:34:30 +00:00
vfs_export.c
vfs_extattr.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
vfs_hash.c
vfs_init.c
vfs_lookup.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
vfs_mount.c Cleanup lockmgr interface and exported KPI: 2008-01-24 12:34:30 +00:00
vfs_subr.c Cleanup lockmgr interface and exported KPI: 2008-01-24 12:34:30 +00:00
vfs_syscalls.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
vfs_vnops.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
vnode_if.src VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00