diff options
author | mjg <mjg@FreeBSD.org> | 2017-03-16 00:51:24 +0000 |
---|---|---|
committer | mjg <mjg@FreeBSD.org> | 2017-03-16 00:51:24 +0000 |
commit | c6aa24277b7692a13d4c043952b22d5af4aa5c0a (patch) | |
tree | b5f8017692a3cfbbf8d735b96fb6f080d7a1ef72 /sys/sys/lock.h | |
parent | 85833828e40798d937d3be17cffa36cf279c5614 (diff) | |
download | FreeBSD-src-c6aa24277b7692a13d4c043952b22d5af4aa5c0a.zip FreeBSD-src-c6aa24277b7692a13d4c043952b22d5af4aa5c0a.tar.gz |
MFC r312890,r313386,r313390:
Sprinkle __read_mostly on backoff and lock profiling code.
==
locks: change backoff to exponential
Previous implementation would use a random factor to spread readers and
reduce chances of starvation. This visibly reduces effectiveness of the
mechanism.
Switch to the more traditional exponential variant. Try to limit starvation
by imposing an upper limit of spins after which spinning is half of what
other threads get. Note the mechanism is turned off by default.
==
locks: follow up r313386
Unfinished diff was committed by accident. The loop in lock_delay
was changed to decrement, but the loop iterator was still incrementing.
Diffstat (limited to 'sys/sys/lock.h')
-rw-r--r-- | sys/sys/lock.h | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/sys/sys/lock.h b/sys/sys/lock.h index dbe715a..89b61ab 100644 --- a/sys/sys/lock.h +++ b/sys/sys/lock.h @@ -202,9 +202,7 @@ extern struct lock_class lock_class_lockmgr; extern struct lock_class *lock_classes[]; struct lock_delay_config { - u_int initial; - u_int step; - u_int min; + u_int base; u_int max; }; @@ -215,19 +213,25 @@ struct lock_delay_arg { }; static inline void -lock_delay_arg_init(struct lock_delay_arg *la, struct lock_delay_config *lc) { +lock_delay_arg_init(struct lock_delay_arg *la, struct lock_delay_config *lc) +{ la->config = lc; - la->delay = 0; + la->delay = lc->base; la->spin_cnt = 0; } #define LOCK_DELAY_SYSINIT(func) \ SYSINIT(func##_ld, SI_SUB_LOCK, SI_ORDER_ANY, func, NULL) +#define LOCK_DELAY_SYSINIT_DEFAULT(lc) \ + SYSINIT(lock_delay_##lc##_ld, SI_SUB_LOCK, SI_ORDER_ANY, \ + lock_delay_default_init, &lc) + void lock_init(struct lock_object *, struct lock_class *, const char *, const char *, int); void lock_destroy(struct lock_object *); void lock_delay(struct lock_delay_arg *); +void lock_delay_default_init(struct lock_delay_config *); void spinlock_enter(void); void spinlock_exit(void); void witness_init(struct lock_object *, const char *); |