aboutsummaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2020-11-26 18:00:26 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2020-11-26 18:00:26 +0000
commit3b1f974bfbf4d06aaa3bc4a1601345070ed4a293 (patch)
tree9eca6d5fdee9ffaa966bd0e2a72950420e7bc6dd /sys/kern
parent50696a6e8cbfdbf4a0d00f2f85f1951aa0d8e23d (diff)
Notes
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/subr_param.c5
-rw-r--r--sys/kern/vfs_vnops.c7
2 files changed, 11 insertions, 1 deletions
diff --git a/sys/kern/subr_param.c b/sys/kern/subr_param.c
index feb01f63dffd2..032edd4229e17 100644
--- a/sys/kern/subr_param.c
+++ b/sys/kern/subr_param.c
@@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
#include <sys/msgbuf.h>
#include <sys/sysctl.h>
#include <sys/proc.h>
+#include <sys/vnode.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
@@ -184,6 +185,10 @@ init_param1(void)
*/
ticks = INT_MAX - (hz * 10 * 60);
+ vn_lock_pair_pause_max = hz / 100;
+ if (vn_lock_pair_pause_max == 0)
+ vn_lock_pair_pause_max = 1;
+
#ifdef VM_SWZONE_SIZE_MAX
maxswzone = VM_SWZONE_SIZE_MAX;
#endif
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 19996f268426d..f65d44122af5b 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -3332,11 +3332,16 @@ SYSCTL_ULONG(_debug, OID_AUTO, vn_lock_pair_pause, CTLFLAG_RD,
&vn_lock_pair_pause_cnt, 0,
"Count of vn_lock_pair deadlocks");
+u_int vn_lock_pair_pause_max;
+SYSCTL_UINT(_debug, OID_AUTO, vn_lock_pair_pause_max, CTLFLAG_RW,
+ &vn_lock_pair_pause_max, 0,
+ "Max ticks for vn_lock_pair deadlock avoidance sleep");
+
static void
vn_lock_pair_pause(const char *wmesg)
{
atomic_add_long(&vn_lock_pair_pause_cnt, 1);
- pause(wmesg, prng32_bounded(hz / 10));
+ pause(wmesg, prng32_bounded(vn_lock_pair_pause_max));
}
/*