|
@@ -205,11 +205,25 @@ struct ustat {
|
|
|
* struct callback_head - callback structure for use with RCU and task_work
|
|
|
* @next: next update requests in a list
|
|
|
* @func: actual update function to call after the grace period.
|
|
|
+ *
|
|
|
+ * The struct is aligned to size of pointer. On most architectures it happens
|
|
|
+ * naturally due ABI requirements, but some architectures (like CRIS) have
|
|
|
+ * weird ABI and we need to ask it explicitly.
|
|
|
+ *
|
|
|
+ * The alignment is required to guarantee that bits 0 and 1 of @next will be
|
|
|
+ * clear under normal conditions -- as long as we use call_rcu(),
|
|
|
+ * call_rcu_bh(), call_rcu_sched(), or call_srcu() to queue callback.
|
|
|
+ *
|
|
|
+ * This guarantee is important for few reasons:
|
|
|
+ * - future call_rcu_lazy() will make use of lower bits in the pointer;
|
|
|
+ * - the structure shares storage spacer in struct page with @compound_head,
|
|
|
+ * which encode PageTail() in bit 0. The guarantee is needed to avoid
|
|
|
+ * false-positive PageTail().
|
|
|
*/
|
|
|
struct callback_head {
|
|
|
struct callback_head *next;
|
|
|
void (*func)(struct callback_head *head);
|
|
|
-};
|
|
|
+} __attribute__((aligned(sizeof(void *))));
|
|
|
#define rcu_head callback_head
|
|
|
|
|
|
typedef void (*rcu_callback_t)(struct rcu_head *head);
|