As preparation to using write rare on the nodes of various types of
lists, specify that the fields in the basic data structures must be
aligned to sizeof(void *)

It is meant to ensure that any static allocation will not cross a page
boundary, to allow pointers to be updated in one step.

Signed-off-by: Igor Stoppa <[email protected]>
CC: Greg Kroah-Hartman <[email protected]>
CC: Andrew Morton <[email protected]>
CC: Masahiro Yamada <[email protected]>
CC: Alexey Dobriyan <[email protected]>
CC: Pekka Enberg <[email protected]>
CC: "Paul E. McKenney" <[email protected]>
CC: Lihao Liang <[email protected]>
CC: [email protected]
---
 include/linux/types.h | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/include/linux/types.h b/include/linux/types.h
index 9834e90aa010..53609bbdcf0f 100644
--- a/include/linux/types.h
+++ b/include/linux/types.h
@@ -183,17 +183,29 @@ typedef struct {
 } atomic64_t;
 #endif
 
+#ifdef CONFIG_PRMEM
 struct list_head {
-       struct list_head *next, *prev;
-};
+       struct list_head *next __aligned(sizeof(void *));
+       struct list_head *prev __aligned(sizeof(void *));
+} __aligned(sizeof(void *));
 
-struct hlist_head {
-       struct hlist_node *first;
+struct hlist_node {
+       struct hlist_node *next __aligned(sizeof(void *));
+       struct hlist_node **pprev __aligned(sizeof(void *));
+} __aligned(sizeof(void *));
+#else
+struct list_head {
+       struct list_head *next, *prev;
 };
 
 struct hlist_node {
        struct hlist_node *next, **pprev;
 };
+#endif
+
+struct hlist_head {
+       struct hlist_node *first;
+};
 
 struct ustat {
        __kernel_daddr_t        f_tfree;
-- 
2.17.1

Reply via email to