freebsd-nq/sys/kern
David Xu d10183d94d This is initial version of POSIX priority mutex support, a new userland
mutex structure is added as following:
struct umutex {
        __lwpid_t       m_owner;
        uint32_t        m_flags;
        uint32_t        m_ceilings[2];
        uint32_t        m_spare[4];
};
The m_owner represents owner thread, it is a thread id, in non-contested
case, userland can simply use atomic_cmpset_int to lock the mutex, if the
mutex is contested, high order bit will be set, and userland should do locking
and unlocking via kernel syscall. Flag UMUTEX_PRIO_INHERIT represents
pthread's PTHREAD_PRIO_INHERIT mutex, which when contention happens, kernel
should do priority propagating. Flag UMUTEX_PRIO_PROTECT indicates it is
pthread's PTHREAD_PRIO_PROTECT mutex, userland should initialize m_owner
to contested state UMUTEX_CONTESTED, then atomic_cmpset_int will be failure
and kernel syscall should be invoked to do locking, this becauses
for such a mutex, kernel should always boost the thread's priority before
it can lock the mutex, m_ceilings is used by PTHREAD_PRIO_PROTECT mutex,
the first element is used to boost thread's priority when it locked the mutex,
second element is used when the mutex is unlocked, the PTHREAD_PRIO_PROTECT
mutex's link list is kept in userland, the m_ceiling[1] is managed by thread
library so kernel needn't allocate memory to keep the link list, when such
a mutex is unlocked, kernel reset m_owner to UMUTEX_CONTESTED.
Flag USYNC_PROCESS_SHARED indicate if the synchronization object is process
shared, if the flag is not set, it saves a vm_map_lookup() call.

The umtx chain is still used as a sleep queue, when a thread is blocked on
PTHREAD_PRIO_INHERIT mutex, a umtx_pi is allocated to support priority
propagating, it is dynamically allocated and reference count is used,
it is not optimized but works well in my tests, while the umtx chain has
its own locking protocol, the priority propagating protocol are all protected
by sched_lock because priority propagating function is called with sched_lock
held from scheduler.

No visible performance degradation is found which these changes. Some parameter
names in _umtx_op syscall are renamed.
2006-08-28 04:24:51 +00:00
..
bus_if.m Create bus_enumerate_hinted_children. This routine will allow drivers 2006-07-08 17:06:15 +00:00
clock_if.m
cpufreq_if.m
device_if.m
genassym.sh
imgact_aout.c Correct two vm object reference leaks in error cases. 2006-03-16 08:51:59 +00:00
imgact_elf32.c
imgact_elf64.c
imgact_elf.c Avoid a vm object reference leak in a rarely used code path. 2006-01-21 20:11:49 +00:00
imgact_gzip.c Maintain the lock on the vnode for most of exec_elfN_imgact(). 2005-12-24 04:57:50 +00:00
imgact_shell.c Fix a panic which could occur parsing #!-lines in a shell-script. If the 2005-06-19 02:21:03 +00:00
inflate.c Normalize a significant number of kernel malloc type names: 2005-10-31 15:41:29 +00:00
init_main.c Initialize kg_base_user_pri. 2006-08-25 06:29:16 +00:00
init_sysent.c Regen to propogate <prefix>_AUE_<mumble> changes as well as the earlier 2006-08-15 17:37:01 +00:00
kern_acct.c Audit path passed to the acct() system call. 2006-06-05 13:02:34 +00:00
kern_acl.c Move POSIX.1e-specific utility routines from kern_acl.c to 2006-07-06 23:37:39 +00:00
kern_alq.c - Conditionalize Giant around VFS operations for ALQ, ktrace, and 2006-03-28 21:30:22 +00:00
kern_clock.c Unexpand an instance of TAILQ_EMPTY() 2006-06-14 03:14:26 +00:00
kern_condvar.c Fix a sleep queue race for KSE thread. 2006-02-23 00:13:58 +00:00
kern_conf.c Make the printfs relating to purging threads from a device less intrusive. 2006-05-17 06:37:14 +00:00
kern_context.c
kern_cpu.c - Print message about cpufreq and timecounter TSC 2006-03-03 02:06:04 +00:00
kern_descrip.c Add a comment to explain what fdclose() does and what it's purpose is 2006-07-21 20:24:00 +00:00
kern_environment.c Use a sleep mutex instead of an sx lock for the kernel environment. This 2006-07-09 21:42:58 +00:00
kern_event.c Use fget() in kqueue_register() instead of doing all the work by hand. 2006-06-12 21:46:23 +00:00
kern_exec.c - Change process_exec function handlers prototype to include struct 2006-08-15 12:10:57 +00:00
kern_exit.c Close race between vmspace_exitfree() and exit1() and races between 2006-05-29 21:28:56 +00:00
kern_fork.c - Change process_exec function handlers prototype to include struct 2006-08-15 12:10:57 +00:00
kern_idle.c Divorce critical sections from spinlocks. Critical sections as denoted by 2005-04-04 21:53:56 +00:00
kern_intr.c Simplify the pager support in DDB. Allowing different db commands to 2006-07-12 21:22:44 +00:00
kern_jail.c Push Giant down in jails. Pass the MPSAFE flag to NDINIT, and keep track 2005-09-28 00:30:56 +00:00
kern_kse.c Close some races between procfs/ptrace and exit(2): 2006-02-22 18:57:50 +00:00
kern_kthread.c Don't do a PHOLD() in kthread_create() w/o a matching PRELE() in 2006-02-22 17:21:45 +00:00
kern_ktr.c Simplify the pager support in DDB. Allowing different db commands to 2006-07-12 21:22:44 +00:00
kern_ktrace.c Trim an obsolete comment. ktrgenio() stopped doing crazy gymnastics when 2006-07-31 15:31:43 +00:00
kern_linker.c Explicitly use STAILQ_REMOVE_HEAD() when we know we are removing the head 2006-07-10 19:28:57 +00:00
kern_lock.c Add a new 'show sleepchain' ddb command similar to 'show lockchain' except 2006-08-15 18:29:01 +00:00
kern_lockf.c Print name of device instead of useless major/minor numbers. 2005-03-29 08:13:01 +00:00
kern_mac.c Remove the NDEVFSINO and NDEVFSOVERFLOW options which no longer exists in 2006-07-17 09:07:02 +00:00
kern_malloc.c Remove old kern.malloc sysctl, which generated a text representation of 2006-07-23 19:55:41 +00:00
kern_mbuf.c Move some functions and definitions from uipc_socket2.c to uipc_socket.c: 2006-06-10 14:34:07 +00:00
kern_mib.c mp_ncpus is always (properly) initialized, even on UP kernels, so just use it. 2005-08-21 18:03:31 +00:00
kern_module.c Address a problem I missed in removing Giant from the kernel linker. Not 2006-06-26 18:34:45 +00:00
kern_mtxpool.c
kern_mutex.c - When spinning on a spin lock, if the debugger is active or we are in a 2006-08-15 18:26:12 +00:00
kern_ntptime.c Explicitly acquire Giant around the ntp_gettime() and assert it in the 2005-05-28 14:34:41 +00:00
kern_physio.c
kern_pmc.c Fix -Wundef. 2005-12-04 02:12:43 +00:00
kern_poll.c Change msleep() and tsleep() to not alter the calling thread's priority 2006-04-17 18:20:38 +00:00
kern_proc.c CPU time accounting speedup (step 2) 2006-02-11 09:33:07 +00:00
kern_prot.c Add kern_setgroups() and kern_getgroups() and use them to implement 2006-07-06 21:32:20 +00:00
kern_resource.c Commit the results of the typo hunt by Darren Pilgrim. 2006-08-04 07:56:35 +00:00
kern_rwlock.c Adjust td_locks for non-spin mutexes, rwlocks, and sx locks so that it is 2006-07-27 21:45:55 +00:00
kern_sema.c
kern_shutdown.c On shutdown try to turn off all swap devices. This way GEOM providers are 2006-04-10 10:03:41 +00:00
kern_sig.c Remove various bits of conditional Alpha code and fixup a few comments. 2006-05-12 05:04:46 +00:00
kern_subr.c Reduce the scope of the page queues lock in vm_pgmoveco() now that 2006-08-12 19:47:49 +00:00
kern_switch.c Add scheduler CORE, the work I have done half a year ago, recent, 2006-06-13 13:12:56 +00:00
kern_sx.c Add a new 'show sleepchain' ddb command similar to 'show lockchain' except 2006-08-15 18:29:01 +00:00
kern_synch.c Use scheduler API sched_relinquish() to implement yield() syscall. 2006-06-15 06:41:57 +00:00
kern_syscalls.c Make system call modules a bit more robust: 2006-08-01 16:32:20 +00:00
kern_sysctl.c Kill an XXX remark that has been untrue since rev. 1.150 of this file. 2006-06-16 07:36:18 +00:00
kern_tc.c Commit the results of the typo hunt by Darren Pilgrim. 2006-08-04 07:56:35 +00:00
kern_thr.c Same as previous change, the user provided priority should be reversed 2006-08-25 10:05:30 +00:00
kern_thread.c This is initial version of POSIX priority mutex support, a new userland 2006-08-28 04:24:51 +00:00
kern_time.c - Change process_exec function handlers prototype to include struct 2006-08-15 12:10:57 +00:00
kern_timeout.c Use the recently added msleep_spin() function to simplify the 2006-02-23 19:13:12 +00:00
kern_umtx.c This is initial version of POSIX priority mutex support, a new userland 2006-08-28 04:24:51 +00:00
kern_uuid.c Separate functions with a newline. 2006-07-17 21:00:42 +00:00
kern_xxx.c
ksched.c Return priority range 0..PRI_MAX_TIMESHARE-PRI_MIN_TIMESHARE for 2006-07-12 05:54:17 +00:00
link_elf_obj.c Replace the kld_mtx mutex with a kld_sx sx lock and expand it's scope to 2006-06-21 20:42:08 +00:00
link_elf.c Let native elf class be registered earlier. 2006-07-14 22:39:18 +00:00
linker_if.m
Make.tags.inc
Makefile Add support for the generated file systrace_args.c. 2006-08-05 19:25:14 +00:00
makesyscalls.sh Add a new set of macros <prefix>_AUE_<syscallname> to sysproto.h that 2006-08-15 17:09:32 +00:00
md4c.c
md5c.c Fix a panic on sparc64 related to inproper aligment - we cannot assume, 2006-03-30 18:45:50 +00:00
p1003_1b.c Backout the feature which can change thread's scheduling option, I really 2006-07-13 06:41:26 +00:00
posix4_mib.c
sched_4bsd.c Add user priority loaning code to support priority propagation for 2006-08-25 06:12:53 +00:00
sched_core.c Add user priority loaning code to support priority propagation for 2006-08-25 06:12:53 +00:00
sched_ule.c Add user priority loaning code to support priority propagation for 2006-08-25 06:12:53 +00:00
serdev_if.m MFp4: Add the ipend() method to the serdev I/F to allow umbrella 2006-04-23 22:12:39 +00:00
subr_acl_posix1e.c Update and reformat comments for POSIX.1e ACL utility routines. 2006-07-23 19:35:10 +00:00
subr_autoconf.c Add a mutex to protect the list of interrupt config hooks. We do assume 2006-07-19 18:53:56 +00:00
subr_blist.c
subr_bus.c Commit the results of the typo hunt by Darren Pilgrim. 2006-08-04 07:56:35 +00:00
subr_clist.c
subr_clock.c Remove more straggling CPU_ macro references 2006-05-11 17:53:26 +00:00
subr_devstat.c - Remove two mtx_asserts that can incorrectly trigger if 2005-05-03 10:58:05 +00:00
subr_disk.c Unexpand TAILQ_FIRST(foo) == NULL to TAILQ_EMPTY(foo). 2006-05-29 05:43:26 +00:00
subr_eventhandler.c eliminate potential null deref 2005-02-23 19:32:29 +00:00
subr_firmware.c If linker_release_module() fails then we still hold a reference on 2006-06-25 12:36:21 +00:00
subr_hints.c Use a sleep mutex instead of an sx lock for the kernel environment. This 2006-07-09 21:42:58 +00:00
subr_kdb.c Add a funny sysctl: debug.kdb.trap_code . 2006-06-18 12:27:59 +00:00
subr_kobj.c Increment kobj_lookup_misses on a miss rather than decrementing it. 2005-12-29 18:00:42 +00:00
subr_lock.c Add a basic reader/writer lock implementation to the kernel. This 2006-01-27 23:13:26 +00:00
subr_log.c Use dynamic major number allocation. 2005-02-27 22:02:03 +00:00
subr_mbpool.c
subr_mchain.c Change API of mb_copy_t in libmchain so that netsmb can handle 2005-07-29 13:22:37 +00:00
subr_module.c
subr_msgbuf.c
subr_param.c Partially revert revision 1.66, which contained a change that did not 2005-10-14 19:15:10 +00:00
subr_pcpu.c Fix 'show allpcpu' ddb command on non-x86. CPU IDs are in the range 0 .. 2005-11-03 21:06:29 +00:00
subr_power.c General consensus is that it would be even better to run this in a 2005-11-09 16:22:56 +00:00
subr_prf.c Simplify the pager support in DDB. Allowing different db commands to 2006-07-12 21:22:44 +00:00
subr_prof.c Change the addupc_*() functions to use the uintfptr_t type for pc rather 2005-12-16 22:08:32 +00:00
subr_rman.c Report the correct function name in a DPRINTF. 2006-08-03 21:19:13 +00:00
subr_rtc.c Remove more straggling CPU_ macro references 2006-05-11 17:53:26 +00:00
subr_sbuf.c Make sbuf_copyin() return the number of bytes copied on success. 2005-12-23 11:49:53 +00:00
subr_scanf.c
subr_sleepqueue.c Print td_name instead of p_comm if td_name is non-empty for 2006-04-21 20:40:43 +00:00
subr_smp.c Rename the KDB_STOP_NMI kernel option to STOP_NMI and make it apply to all 2005-10-24 21:04:19 +00:00
subr_stack.c Correct typos 2006-05-28 22:15:28 +00:00
subr_taskqueue.c When starting up threads in taskqueue_start_threads create them 2006-05-24 22:11:07 +00:00
subr_trap.c Test before modifying p_sflag to avoid unconditionally cache line 2006-02-10 14:59:16 +00:00
subr_turnstile.c Add a new 'show sleepchain' ddb command similar to 'show lockchain' except 2006-08-15 18:29:01 +00:00
subr_unit.c Remove debugging printfs. 2005-03-14 06:51:29 +00:00
subr_witness.c The "taskqueue_fast" spinlocks were renamed to "fast_taskqueue" in 2006-08-26 11:21:25 +00:00
sys_generic.c - Split ioctl() up into ioctl() and kern_ioctl(). The kern_ioctl() assumes 2006-07-08 20:12:14 +00:00
sys_pipe.c Move some functions and definitions from uipc_socket2.c to uipc_socket.c: 2006-06-10 14:34:07 +00:00
sys_process.c Fix a signedness bug. 2006-08-20 10:29:08 +00:00
sys_socket.c soreceive_generic(), and sopoll_generic(). Add new functions sosend(), 2006-07-24 15:20:08 +00:00
syscalls.c Regen to propogate <prefix>_AUE_<mumble> changes as well as the earlier 2006-08-15 17:37:01 +00:00
syscalls.master This is initial version of POSIX priority mutex support, a new userland 2006-08-28 04:24:51 +00:00
systrace_args.c Regen. 2006-08-03 05:32:43 +00:00
sysv_ipc.c
sysv_msg.c Move some functions and definitions from uipc_socket2.c to uipc_socket.c: 2006-06-10 14:34:07 +00:00
sysv_sem.c Use proper format specifier for pointers in debug printfs (turned off 2006-07-12 11:41:53 +00:00
sysv_shm.c Move some functions and definitions from uipc_socket2.c to uipc_socket.c: 2006-06-10 14:34:07 +00:00
tty_compat.c Move the old BSD4.3 tty compatibility from (!BURN_BRIDGES && COMPAT_43) 2006-01-10 09:19:10 +00:00
tty_conf.c
tty_cons.c If the console has no cncheckc method, use cngetc instead. 2006-05-26 11:00:20 +00:00
tty_pts.c Also check use_pty in the ptmx clone lookup; this means that when ptmx 2006-04-28 21:39:57 +00:00
tty_pty.c Don't destroy the slave /dev entry until someone figures out why devfs seems 2006-02-02 20:35:45 +00:00
tty_subr.c
tty_tty.c Merge the dev_clone and dev_clone_cred event handlers into a single 2005-08-08 19:55:32 +00:00
tty.c Move the old BSD4.3 tty compatibility from (!BURN_BRIDGES && COMPAT_43) 2006-01-10 09:19:10 +00:00
uipc_accf.c o setsockopt(2) cannot remove accept filter. [1] 2005-06-11 11:59:48 +00:00
uipc_cow.c Previously, nothing prevented the page that was returned by pmap_extract() 2005-10-23 07:41:56 +00:00
uipc_domain.c soreceive_generic(), and sopoll_generic(). Add new functions sosend(), 2006-07-24 15:20:08 +00:00
uipc_mbuf2.c Define four constants, MBUF_{,MEM,CLUSTER,PACKET,TAG}_MEM_NAME, which 2005-07-17 14:04:03 +00:00
uipc_mbuf.c Move some functions and definitions from uipc_socket2.c to uipc_socket.c: 2006-06-10 14:34:07 +00:00
uipc_mqueue.c Change msleep() and tsleep() to not alter the calling thread's priority 2006-04-17 18:20:38 +00:00
uipc_sem.c Swap the names "sem_exithook" and "sem_exechook" in the previous commit to 2006-08-16 08:25:40 +00:00
uipc_sockbuf.c Remove 'register'. 2006-08-02 13:01:58 +00:00
uipc_socket2.c Change two XXX's to two notes: the fact that SOCK_LOCK(so) == 2006-08-02 16:23:52 +00:00
uipc_socket.c Fix a kernel panic based on receiving an ICMPv6 Packet too Big message. 2006-08-18 14:05:13 +00:00
uipc_syscalls.c Introduce a field to struct vm_page for storing flags that are 2006-08-09 17:43:27 +00:00
uipc_usrreq.c Minor white space tweaks. 2006-08-13 23:16:59 +00:00
vfs_acl.c Move POSIX.1e-specific utility routines from kern_acl.c to 2006-07-06 23:37:39 +00:00
vfs_aio.c - Change process_exec function handlers prototype to include struct 2006-08-15 12:10:57 +00:00
vfs_bio.c Introduce a field to struct vm_page for storing flags that are 2006-08-09 17:43:27 +00:00
vfs_cache.c Axe Giant from vn_fullpath(9). The vnode -> pathname lookup should be 2006-06-16 05:09:28 +00:00
vfs_cluster.c Remove unused leaked debug function prototype. 2006-03-21 01:04:24 +00:00
vfs_default.c - GETWRITEMOUNT now returns a referenced mountpoint to prevent its 2006-03-31 03:52:24 +00:00
vfs_export.c Normalize a significant number of kernel malloc type names: 2005-10-31 15:41:29 +00:00
vfs_extattr.c Fix some bugs in the previous revision (1.419). Don't perform extra 2006-08-02 15:27:48 +00:00
vfs_hash.c In vfs_hash_get(): mount point should never be changed 2006-04-18 08:05:08 +00:00
vfs_init.c Remove duplicate security checks already performed in kern_kldload(). 2006-06-26 18:33:32 +00:00
vfs_lookup.c Remove register, use ANSI function headers. 2006-08-05 21:40:59 +00:00
vfs_mount.c Fix another bug introduced with rev. 1.204; in vfs_donmount() if 2006-08-26 16:28:19 +00:00
vfs_subr.c getnewvnode() can be called with NULL mp. 2006-08-10 08:56:03 +00:00
vfs_syscalls.c Fix some bugs in the previous revision (1.419). Don't perform extra 2006-08-02 15:27:48 +00:00
vfs_vnops.c Simplify the code and remove two mutex operations. 2006-06-24 22:55:43 +00:00
vnode_if.src Remove two locking assertion entries that: 2006-05-31 14:06:06 +00:00