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;                       \
                                        \
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to