Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Jul 2020 17:26:53 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r363451 - in head/sys: kern sys
Message-ID:  <202007231726.06NHQrZH027174@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;			\
 					\



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007231726.06NHQrZH027174>