diff options
Diffstat (limited to 'include/linux/rcupdate.h')
| -rw-r--r-- | include/linux/rcupdate.h | 53 | 
1 files changed, 46 insertions, 7 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 659cbfa7581a..d15d46db61f7 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -828,17 +828,17 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)  /*   * Does the specified offset indicate that the corresponding rcu_head - * structure can be handled by kfree_rcu()? + * structure can be handled by kvfree_rcu()?   */ -#define __is_kfree_rcu_offset(offset) ((offset) < 4096) +#define __is_kvfree_rcu_offset(offset) ((offset) < 4096)  /*   * Helper macro for kfree_rcu() to prevent argument-expansion eyestrain.   */ -#define __kfree_rcu(head, offset) \ +#define __kvfree_rcu(head, offset) \  	do { \ -		BUILD_BUG_ON(!__is_kfree_rcu_offset(offset)); \ -		kfree_call_rcu(head, (rcu_callback_t)(unsigned long)(offset)); \ +		BUILD_BUG_ON(!__is_kvfree_rcu_offset(offset)); \ +		kvfree_call_rcu(head, (rcu_callback_t)(unsigned long)(offset)); \  	} while (0)  /** @@ -857,7 +857,7 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)   * Because the functions are not allowed in the low-order 4096 bytes of   * kernel virtual memory, offsets up to 4095 bytes can be accommodated.   * If the offset is larger than 4095 bytes, a compile-time error will - * be generated in __kfree_rcu().  If this error is triggered, you can + * be generated in __kvfree_rcu(). If this error is triggered, you can   * either fall back to use of call_rcu() or rearrange the structure to   * position the rcu_head structure into the first 4096 bytes.   * @@ -872,7 +872,46 @@ do {									\  	typeof (ptr) ___p = (ptr);					\  									\  	if (___p)							\ -		__kfree_rcu(&((___p)->rhf), offsetof(typeof(*(ptr)), rhf)); \ +		__kvfree_rcu(&((___p)->rhf), offsetof(typeof(*(ptr)), rhf)); \ +} while (0) + +/** + * kvfree_rcu() - kvfree an object after a grace period. + * + * This macro consists of one or two arguments and it is + * based on whether an object is head-less or not. If it + * has a head then a semantic stays the same as it used + * to be before: + * + *     kvfree_rcu(ptr, rhf); + * + * where @ptr is a pointer to kvfree(), @rhf is the name + * of the rcu_head structure within the type of @ptr. + * + * When it comes to head-less variant, only one argument + * is passed and that is just a pointer which has to be + * freed after a grace period. Therefore the semantic is + * + *     kvfree_rcu(ptr); + * + * where @ptr is a pointer to kvfree(). + * + * Please note, head-less way of freeing is permitted to + * use from a context that has to follow might_sleep() + * annotation. Otherwise, please switch and embed the + * rcu_head structure within the type of @ptr. + */ +#define kvfree_rcu(...) KVFREE_GET_MACRO(__VA_ARGS__,		\ +	kvfree_rcu_arg_2, kvfree_rcu_arg_1)(__VA_ARGS__) + +#define KVFREE_GET_MACRO(_1, _2, NAME, ...) NAME +#define kvfree_rcu_arg_2(ptr, rhf) kfree_rcu(ptr, rhf) +#define kvfree_rcu_arg_1(ptr)					\ +do {								\ +	typeof(ptr) ___p = (ptr);				\ +								\ +	if (___p)						\ +		kvfree_call_rcu(NULL, (rcu_callback_t) (___p));	\  } while (0)  /*  | 
