From 3b58baa08e90423aaedb828f9579438d9c51a0cd Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Sat, 12 Nov 2011 11:25:38 -0800 Subject: [PATCH] kernel - Expose nanosleep1() to other kernel source files * Expose nanosleep1() to other kernel source files * Add additional sysctls to control behavior. --- sys/kern/kern_time.c | 23 +++++++++++++++++++---- sys/sys/time.h | 1 + 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index d77f93d98d..abbd5db2cd 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -68,12 +68,24 @@ struct timezone tz; * timers when they expire. */ -int nanosleep1(struct timespec *rqt, struct timespec *rmt); static int settime(struct timeval *); static void timevalfix(struct timeval *); -static int sleep_hard_us = 100; -SYSCTL_INT(_kern, OID_AUTO, sleep_hard_us, CTLFLAG_RW, &sleep_hard_us, 0, "") +/* + * Nanosleep tries very hard to sleep for a precisely requested time + * interval, down to 1uS. The administrator can impose a minimum delay + * and a delay below which we hard-loop instead of initiate a timer + * interrupt and sleep. + * + * For machines under high loads it might be beneficial to increase min_us + * to e.g. 1000uS (1ms) so spining processes sleep meaningfully. + */ +static int nanosleep_min_us = 10; +static int nanosleep_hard_us = 100; +SYSCTL_INT(_kern, OID_AUTO, nanosleep_min_us, CTLFLAG_RW, + &nanosleep_min_us, 0, "") +SYSCTL_INT(_kern, OID_AUTO, nanosleep_hard_us, CTLFLAG_RW, + &nanosleep_hard_us, 0, "") static int settime(struct timeval *tv) @@ -313,8 +325,11 @@ nanosleep1(struct timespec *rqt, struct timespec *rmt) if (tv.tv_sec == 0 && ticks == 0) { thread_t td = curthread; - if (tv.tv_usec < sleep_hard_us) { + if (tv.tv_usec > 0 && tv.tv_usec < nanosleep_min_us) + tv.tv_usec = nanosleep_min_us; + if (tv.tv_usec < nanosleep_hard_us) { lwkt_user_yield(); + cpu_pause(); } else { crit_enter_quick(td); systimer_init_oneshot(&info, ns1_systimer, diff --git a/sys/sys/time.h b/sys/sys/time.h index ae2f107d9a..cd54de1791 100644 --- a/sys/sys/time.h +++ b/sys/sys/time.h @@ -216,6 +216,7 @@ int tstohz_low (struct timespec *); int64_t tsc_get_target(int ns); int tsc_test_target(int64_t target); void tsc_delay(int ns); +int nanosleep1(struct timespec *rqt, struct timespec *rmt); #else /* !_KERNEL */ -- 2.41.0