kernel - Fix cpu/token starvation, vfs_busy deadlocks. incls sysctl
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 21 Feb 2013 02:38:33 +0000 (18:38 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 21 Feb 2013 02:38:33 +0000 (18:38 -0800)
commitace53c28c58d56456136ef9cb4c6e97495d965fb
treec74000132c5590f7469e9e5cef9e748813c74c1a
parent171a58df0b0ea4dd01534e5ec59b0e257f035e1a
kernel - Fix cpu/token starvation, vfs_busy deadlocks. incls sysctl

* Remove the mplock around the userland sysctl system call, it should no
  longer be needed.

* Remove the mplock around getcwd(), it should no longer be needed.

* Change the vfs_busy(), sys_mount(), and related mount code to use the
  per-mount token instead of the mp lock.

* Fix a race in vfs_busy() which could cause it to never get woken up.

* Fix a deadlock in nlookup() when the lookup is racing an unmount.  When
  the mp is flagged MNTK_UNMOUNT, the unmount is in progress and the lookup
  must fail instead of loop.

* per-mount token now protects mp->mnt_kern_flag.

* unmount code now waits for final mnt_refs to return to the proper value,
  fixing races with other code that might temporarily ref the mount point.

* Add lwkt_yield()'s in nvtruncbuf*() and nvnode_pager_setsize(), reducing
  cpu stalls due to large file-extending I/O's.  Also in tmpfs.

* Use a marker in the vm_meter code and check for vmobj_token collisions.
  When a collision is detected, give other threads a chance to take the
  token.  This prevents hogging of this very important token.

Testing-by: dillon, vsrinivas, ftigeot
sys/kern/kern_sysctl.c
sys/kern/vfs_cache.c
sys/kern/vfs_mount.c
sys/kern/vfs_nlookup.c
sys/kern/vfs_syscalls.c
sys/kern/vfs_vm.c
sys/vfs/tmpfs/tmpfs_vfsops.c
sys/vm/vm_meter.c