diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2023-05-01 15:20:08 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2023-05-01 15:20:08 -0700 | 
| commit | 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e (patch) | |
| tree | d57f3a63479a07b4e0cece029886e76e04feb984 /include/linux/rcupdate.h | |
| parent | 5dc63e56a9cf8df0b59c234a505a1653f1bdf885 (diff) | |
| parent | 53bea86b5712c7491bb3dae12e271666df0a308c (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.4 merge window.
Diffstat (limited to 'include/linux/rcupdate.h')
| -rw-r--r-- | include/linux/rcupdate.h | 19 | 
1 files changed, 15 insertions, 4 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 03abf883a281..094321c17e48 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -238,6 +238,7 @@ void synchronize_rcu_tasks_rude(void);  #define rcu_note_voluntary_context_switch(t) rcu_tasks_qs(t, false)  void exit_tasks_rcu_start(void); +void exit_tasks_rcu_stop(void);  void exit_tasks_rcu_finish(void);  #else /* #ifdef CONFIG_TASKS_RCU_GENERIC */  #define rcu_tasks_classic_qs(t, preempt) do { } while (0) @@ -246,6 +247,7 @@ void exit_tasks_rcu_finish(void);  #define call_rcu_tasks call_rcu  #define synchronize_rcu_tasks synchronize_rcu  static inline void exit_tasks_rcu_start(void) { } +static inline void exit_tasks_rcu_stop(void) { }  static inline void exit_tasks_rcu_finish(void) { }  #endif /* #else #ifdef CONFIG_TASKS_RCU_GENERIC */ @@ -374,11 +376,18 @@ static inline int debug_lockdep_rcu_enabled(void)   * RCU_LOCKDEP_WARN - emit lockdep splat if specified condition is met   * @c: condition to check   * @s: informative message + * + * This checks debug_lockdep_rcu_enabled() before checking (c) to + * prevent early boot splats due to lockdep not yet being initialized, + * and rechecks it after checking (c) to prevent false-positive splats + * due to races with lockdep being disabled.  See commit 3066820034b5dd + * ("rcu: Reject RCU_LOCKDEP_WARN() false positives") for more detail.   */  #define RCU_LOCKDEP_WARN(c, s)						\  	do {								\  		static bool __section(".data.unlikely") __warned;	\ -		if ((c) && debug_lockdep_rcu_enabled() && !__warned) {	\ +		if (debug_lockdep_rcu_enabled() && (c) &&		\ +		    debug_lockdep_rcu_enabled() && !__warned) {		\  			__warned = true;				\  			lockdep_rcu_suspicious(__FILE__, __LINE__, s);	\  		}							\ @@ -1004,6 +1013,9 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)  #define kvfree_rcu(...) KVFREE_GET_MACRO(__VA_ARGS__,		\  	kvfree_rcu_arg_2, kvfree_rcu_arg_1)(__VA_ARGS__) +#define kvfree_rcu_mightsleep(ptr) kvfree_rcu_arg_1(ptr) +#define kfree_rcu_mightsleep(ptr) kvfree_rcu_mightsleep(ptr) +  #define KVFREE_GET_MACRO(_1, _2, NAME, ...) NAME  #define kvfree_rcu_arg_2(ptr, rhf)					\  do {									\ @@ -1011,8 +1023,7 @@ do {									\  									\  	if (___p) {									\  		BUILD_BUG_ON(!__is_kvfree_rcu_offset(offsetof(typeof(*(ptr)), rhf)));	\ -		kvfree_call_rcu(&((___p)->rhf), (rcu_callback_t)(unsigned long)		\ -			(offsetof(typeof(*(ptr)), rhf)));				\ +		kvfree_call_rcu(&((___p)->rhf), (void *) (___p));			\  	}										\  } while (0) @@ -1021,7 +1032,7 @@ do {								\  	typeof(ptr) ___p = (ptr);				\  								\  	if (___p)						\ -		kvfree_call_rcu(NULL, (rcu_callback_t) (___p));	\ +		kvfree_call_rcu(NULL, (void *) (___p));		\  } while (0)  /*  | 
