svn commit: r363451 - in head/sys: kern sys
Mateusz Guzik
mjg at FreeBSD.org
Thu Jul 23 17:26:54 UTC 2020
Author: mjg
Date: Thu Jul 23 17:26:53 2020
New Revision: 363451
URL: https://svnweb.freebsd.org/changeset/base/363451
Log:
locks: fix a long standing bug for primitives with kdtrace but without spinning
In such a case the second argument to lock_delay_arg_init was NULL which was
immediately causing a null pointer deref.
Since the sructure is only used for spin count, provide a dedicate routine
initializing it.
Reported by: andrew
Modified:
head/sys/kern/kern_mutex.c
head/sys/kern/kern_rwlock.c
head/sys/kern/kern_sx.c
head/sys/sys/lock.h
Modified: head/sys/kern/kern_mutex.c
==============================================================================
--- head/sys/kern/kern_mutex.c Thu Jul 23 17:16:20 2020 (r363450)
+++ head/sys/kern/kern_mutex.c Thu Jul 23 17:26:53 2020 (r363451)
@@ -538,7 +538,7 @@ __mtx_lock_sleep(volatile uintptr_t *c, uintptr_t v)
#if defined(ADAPTIVE_MUTEXES)
lock_delay_arg_init(&lda, &mtx_delay);
#elif defined(KDTRACE_HOOKS)
- lock_delay_arg_init(&lda, NULL);
+ lock_delay_arg_init_noadapt(&lda);
#endif
if (__predict_false(v == MTX_UNOWNED))
Modified: head/sys/kern/kern_rwlock.c
==============================================================================
--- head/sys/kern/kern_rwlock.c Thu Jul 23 17:16:20 2020 (r363450)
+++ head/sys/kern/kern_rwlock.c Thu Jul 23 17:26:53 2020 (r363451)
@@ -475,7 +475,7 @@ __rw_rlock_hard(struct rwlock *rw, struct thread *td,
#if defined(ADAPTIVE_RWLOCKS)
lock_delay_arg_init(&lda, &rw_delay);
#elif defined(KDTRACE_HOOKS)
- lock_delay_arg_init(&lda, NULL);
+ lock_delay_arg_init_noadapt(&lda);
#endif
#ifdef HWPMC_HOOKS
@@ -951,7 +951,7 @@ __rw_wlock_hard(volatile uintptr_t *c, uintptr_t v LOC
#if defined(ADAPTIVE_RWLOCKS)
lock_delay_arg_init(&lda, &rw_delay);
#elif defined(KDTRACE_HOOKS)
- lock_delay_arg_init(&lda, NULL);
+ lock_delay_arg_init_noadapt(&lda);
#endif
if (__predict_false(v == RW_UNLOCKED))
v = RW_READ_VALUE(rw);
Modified: head/sys/kern/kern_sx.c
==============================================================================
--- head/sys/kern/kern_sx.c Thu Jul 23 17:16:20 2020 (r363450)
+++ head/sys/kern/kern_sx.c Thu Jul 23 17:26:53 2020 (r363451)
@@ -623,7 +623,7 @@ _sx_xlock_hard(struct sx *sx, uintptr_t x, int opts LO
#if defined(ADAPTIVE_SX)
lock_delay_arg_init(&lda, &sx_delay);
#elif defined(KDTRACE_HOOKS)
- lock_delay_arg_init(&lda, NULL);
+ lock_delay_arg_init_noadapt(&lda);
#endif
if (__predict_false(x == SX_LOCK_UNLOCKED))
@@ -1063,7 +1063,7 @@ _sx_slock_hard(struct sx *sx, int opts, uintptr_t x LO
#if defined(ADAPTIVE_SX)
lock_delay_arg_init(&lda, &sx_delay);
#elif defined(KDTRACE_HOOKS)
- lock_delay_arg_init(&lda, NULL);
+ lock_delay_arg_init_noadapt(&lda);
#endif
#ifdef HWPMC_HOOKS
Modified: head/sys/sys/lock.h
==============================================================================
--- head/sys/sys/lock.h Thu Jul 23 17:16:20 2020 (r363450)
+++ head/sys/sys/lock.h Thu Jul 23 17:26:53 2020 (r363451)
@@ -195,6 +195,13 @@ lock_delay_arg_init(struct lock_delay_arg *la, struct
la->spin_cnt = 0;
}
+static inline void
+lock_delay_arg_init_noadapt(struct lock_delay_arg *la)
+{
+ la->delay = 0;
+ la->spin_cnt = 0;
+}
+
#define lock_delay_spin(n) do { \
u_int _i; \
\
More information about the svn-src-head
mailing list