Michal Koutný 674875
From: Michal Koutný <mkoutny@suse.com>
Michal Koutný 674875
Date: Thu, 21 Jul 2022 19:09:50 +0200
Michal Koutný 674875
Subject: KABI: cgroup: Restore KABI of css_set
Michal Koutný 674875
Patch-mainline: Never, SLES KABI fix
Michal Koutný 674875
References: bsc#1201610
Michal Koutný 674875
Michal Koutný 674875
This is precautionary KABI fix. No sane module should look into the layout of
Michal Koutný 674875
struct css_set.
Michal Koutný 674875
No exported symbol relies on the struct css_set layout, the structure is
Michal Koutný 674875
reachable only indirectly via (several) pointers.
Michal Koutný 674875
It is allocated/freed by our kernel code only.
Michal Koutný 674875
Michal Koutný 674875
The only possible issue would be inlined functions that dereference structure's
Michal Koutný 674875
members (task_css_is_root, task_dfl_cgroup). The upstream patch inserts a new
Michal Koutný 674875
member in the middle, however, after members used by these inlined functions.
Michal Koutný 674875
Michal Koutný 674875
For strict KABI compatibility (this KABI patch could be unnecessary with the
Michal Koutný 674875
reasoning above), move the new members to the end:
Michal Koutný 674875
  a) to keep the layout backwards compatible,
Michal Koutný 674875
  b) keep the old mg_preload_node in the middle as a dummy.
Michal Koutný 674875
Michal Koutný 674875
---
Michal Koutný 674875
 include/linux/cgroup-defs.h |    8 ++++++--
Michal Koutný 674875
 kernel/cgroup/cgroup.c      |    6 ++++--
Michal Koutný 674875
 2 files changed, 10 insertions(+), 4 deletions(-)
Michal Koutný 674875
Michal Koutný 674875
--- a/include/linux/cgroup-defs.h
Michal Koutný 674875
+++ b/include/linux/cgroup-defs.h
Michal Koutný 674875
@@ -203,9 +203,9 @@ struct css_set {
Michal Koutný 674875
 	/*
Michal Koutný 674875
 	 * List of csets participating in the on-going migration either as
Michal Koutný 674875
 	 * source or destination.  Protected by cgroup_mutex.
Michal Koutný 674875
+	 * mg_preload_node is unused (kept for KABI, see real nodes at the end)
Michal Koutný 674875
 	 */
Michal Koutný 674875
-	struct list_head mg_src_preload_node;
Michal Koutný 674875
-	struct list_head mg_dst_preload_node;
Michal Koutný 674875
+	struct list_head mg_preload_node;
Michal Koutný 674875
 	struct list_head mg_node;
Michal Koutný 674875
 
Michal Koutný 674875
 	/*
Michal Koutný 674875
@@ -224,6 +224,10 @@ struct css_set {
Michal Koutný 674875
 
Michal Koutný 674875
 	/* For RCU-protected deletion */
Michal Koutný 674875
 	struct rcu_head rcu_head;
Michal Koutný 674875
+#ifndef __GENKSYMS__
Michal Koutný 674875
+	struct list_head mg_src_preload_node;
Michal Koutný 674875
+	struct list_head mg_dst_preload_node;
Michal Koutný 674875
+#endif
Michal Koutný 674875
 };
Michal Koutný 674875
 
Michal Koutný 674875
 struct cgroup {
Michal Koutný 674875
--- a/kernel/cgroup/cgroup.c
Michal Koutný 674875
+++ b/kernel/cgroup/cgroup.c
Michal Koutný 674875
@@ -545,9 +545,10 @@ struct css_set init_css_set = {
Michal Koutný 674875
 	.mg_tasks		= LIST_HEAD_INIT(init_css_set.mg_tasks),
Michal Koutný 674875
 	.task_iters		= LIST_HEAD_INIT(init_css_set.task_iters),
Michal Koutný 674875
 	.cgrp_links		= LIST_HEAD_INIT(init_css_set.cgrp_links),
Michal Koutný 674875
+	.mg_preload_node	= LIST_HEAD_INIT(init_css_set.mg_preload_node),
Michal Koutný 674875
+	.mg_node		= LIST_HEAD_INIT(init_css_set.mg_node),
Michal Koutný 674875
 	.mg_src_preload_node	= LIST_HEAD_INIT(init_css_set.mg_src_preload_node),
Michal Koutný 674875
 	.mg_dst_preload_node	= LIST_HEAD_INIT(init_css_set.mg_dst_preload_node),
Michal Koutný 674875
-	.mg_node		= LIST_HEAD_INIT(init_css_set.mg_node),
Michal Koutný 674875
 };
Michal Koutný 674875
 
Michal Koutný 674875
 static int css_set_count	= 1;	/* 1 for init_css_set */
Michal Koutný 674875
@@ -970,9 +971,10 @@ static struct css_set *find_css_set(stru
Michal Koutný 674875
 	INIT_LIST_HEAD(&cset->task_iters);
Michal Koutný 674875
 	INIT_HLIST_NODE(&cset->hlist);
Michal Koutný 674875
 	INIT_LIST_HEAD(&cset->cgrp_links);
Michal Koutný 674875
+	INIT_LIST_HEAD(&cset->mg_preload_node);
Michal Koutný 674875
+	INIT_LIST_HEAD(&cset->mg_node);
Michal Koutný 674875
 	INIT_LIST_HEAD(&cset->mg_src_preload_node);
Michal Koutný 674875
 	INIT_LIST_HEAD(&cset->mg_dst_preload_node);
Michal Koutný 674875
-	INIT_LIST_HEAD(&cset->mg_node);
Michal Koutný 674875
 
Michal Koutný 674875
 	/* Copy the set of subsystem state objects generated in
Michal Koutný 674875
 	 * find_existing_css_set() */