I would suggest instead using the bottom bit to differentiate betweenWe must be careful: rcu_head might be always aligned, but are function pointers always aligned?
these two cases, especially given that your approach makes it impossible
for callback processing to notice a NULL function pointer. In addition,
this approach would allow different types of allocators to be specified
should this later prove to be helpful. You should not have to shift the
offset because the rcu_head offset should always be a multiple of four
(or eight on 64-bit architectures).
And we really are running into bugs that are detected by RCU's seeing aOk.
null function pointer in the rcu_head structure at callback-invocation
time. So, whatever encoding you choose, please leave a function-pointer
value of zero as an invalid value!
The patch was tested against rcutree ;-)--- a/kernel/rcutree.c
+++ b/kernel/rcutree.c
@@ -901,7 +901,7 @@ static void rcu_do_batch(struct rcu_data *rdp)
while (list) {
next = list->next;
prefetch(next);
- list->func(list);
+ rcu_docallback(list);
Good, you got all three of them! ;-)