From 0c2e4c2e6cccd75f96d08d38ba9a46778277dc5c Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Thu, 19 Apr 2012 11:44:39 -0700 Subject: [PATCH] --- yaml --- r: 302747 b: refs/heads/master c: d8169d4c369e8aa2fda10df705a4957331b5a4db h: refs/heads/master i: 302745: cf61c70a00a2f6d067ecf259bfb4d7e97523a8b4 302743: 37e03ee4b22310fbede12eeb129cde902a4ebb15 v: v3 --- [refs] | 2 +- trunk/include/linux/rcupdate.h | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 5503ab4b0c0b..d3c7b3487917 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c9336643e1440f4dfc89ad4ac6185813619abb8c +refs/heads/master: d8169d4c369e8aa2fda10df705a4957331b5a4db diff --git a/trunk/include/linux/rcupdate.h b/trunk/include/linux/rcupdate.h index 20fb776a1d4a..d5dfb109dfe1 100644 --- a/trunk/include/linux/rcupdate.h +++ b/trunk/include/linux/rcupdate.h @@ -922,6 +922,21 @@ void __kfree_rcu(struct rcu_head *head, unsigned long offset) kfree_call_rcu(head, (rcu_callback)offset); } +/* + * Does the specified offset indicate that the corresponding rcu_head + * structure can be handled by kfree_rcu()? + */ +#define __is_kfree_rcu_offset(offset) ((offset) < 4096) + +/* + * Helper macro for kfree_rcu() to prevent argument-expansion eyestrain. + */ +#define __kfree_rcu(head, offset) \ + do { \ + BUILD_BUG_ON(!__is_kfree_rcu_offset(offset)); \ + call_rcu(head, (void (*)(struct rcu_head *))(unsigned long)(offset)); \ + } while (0) + /** * kfree_rcu() - kfree an object after a grace period. * @ptr: pointer to kfree @@ -944,6 +959,9 @@ void __kfree_rcu(struct rcu_head *head, unsigned long offset) * * Note that the allowable offset might decrease in the future, for example, * to allow something like kmem_cache_free_rcu(). + * + * The BUILD_BUG_ON check must not involve any function calls, hence the + * checks are done in macros here. */ #define kfree_rcu(ptr, rcu_head) \ __kfree_rcu(&((ptr)->rcu_head), offsetof(typeof(*(ptr)), rcu_head))