diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -151,6 +151,26 @@ &umtx_max_rb, 0, "Maximum number of robust mutexes allowed for each thread"); +static sbintime_t umtx_min_timeout; +static int +sysctl_umtx_min_timeout(SYSCTL_HANDLER_ARGS) +{ + int error, val; + + val = sbttons(umtx_min_timeout); + error = sysctl_handle_int(oidp, &val, 0, req); + if (error != 0 || req->newptr == NULL) + return (error); + if (val < 0) + return (EINVAL); + umtx_min_timeout = nstosbt(val); + return (0); +} +SYSCTL_PROC(_kern_ipc, OID_AUTO, umtx_min_timeout, + CTLFLAG_RW | CTLTYPE_UINT | CTLFLAG_MPSAFE, NULL, 0, + sysctl_umtx_min_timeout, "U", + "Minimal timeout for umtx in nanoseconds"); + static uma_zone_t umtx_pi_zone; static struct umtxq_chain umtxq_chains[2][UMTX_CHAINS]; static MALLOC_DEFINE(M_UMTX, "umtx", "UMTX queue memory"); @@ -759,6 +779,15 @@ *sbt += SBT_1S - rem; break; } + if (umtx_min_timeout != 0) { + struct bintime now; + sbintime_t when; + + getbintime(&now); + when = bttosbt(now) + umtx_min_timeout; + if (*sbt < when) + *sbt = when; + } *flags = C_ABSOLUTE; return (0);