cgroup: Eliminate cgrp_ancestor_storage in cgroup_root

The cgrp_ancestor_storage has two drawbacks:
- it's not guaranteed that the member immediately follows struct cgrp in
cgroup_root (root cgroup's ancestors[0] might thus point to a padding
and not in cgrp_ancestor_storage proper),
- this idiom raises warnings with -Wflex-array-member-not-at-end.

Instead of relying on the auxiliary member in cgroup_root, define the
0-th level ancestor inside struct cgroup (needed for static allocation
of cgrp_dfl_root), deeper cgroups would allocate flexible
_low_ancestors[]. Unionized alias through ancestors[] will
transparently join the two ranges.

The above change would still leave the flexible array at the end of
struct cgroup inside cgroup_root, so move cgrp also towards the end of
cgroup_root to resolve the -Wflex-array-member-not-at-end.

Link: https://lore.kernel.org/r/5fb74444-2fbb-476e-b1bf-3f3e279d0ced@embeddedor.com/
Reported-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Closes: https://lore.kernel.org/r/b3eb050d-9451-4b60-b06c-ace7dab57497@embeddedor.com/
Cc: David Laight <david.laight.linux@gmail.com>
Acked-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Signed-off-by: Michal Koutný <mkoutny@suse.com>
Signed-off-by: Tejun Heo <tj@kernel.org>

authored by Michal Koutný and committed by Tejun Heo ef565782 aa7d3a56

+15 -12
+14 -11
include/linux/cgroup-defs.h
··· 626 626 #endif 627 627 628 628 /* All ancestors including self */ 629 - struct cgroup *ancestors[]; 629 + union { 630 + DECLARE_FLEX_ARRAY(struct cgroup *, ancestors); 631 + struct { 632 + struct cgroup *_root_ancestor; 633 + DECLARE_FLEX_ARRAY(struct cgroup *, _low_ancestors); 634 + }; 635 + }; 630 636 }; 631 637 632 638 /* ··· 653 647 struct list_head root_list; 654 648 struct rcu_head rcu; /* Must be near the top */ 655 649 656 - /* 657 - * The root cgroup. The containing cgroup_root will be destroyed on its 658 - * release. cgrp->ancestors[0] will be used overflowing into the 659 - * following field. cgrp_ancestor_storage must immediately follow. 660 - */ 661 - struct cgroup cgrp; 662 - 663 - /* must follow cgrp for cgrp->ancestors[0], see above */ 664 - struct cgroup *cgrp_ancestor_storage; 665 - 666 650 /* Number of cgroups in the hierarchy, used only for /proc/cgroups */ 667 651 atomic_t nr_cgrps; 668 652 ··· 664 668 665 669 /* The name for this hierarchy - may be empty */ 666 670 char name[MAX_CGROUP_ROOT_NAMELEN]; 671 + 672 + /* 673 + * The root cgroup. The containing cgroup_root will be destroyed on its 674 + * release. This must be embedded last due to flexible array at the end 675 + * of struct cgroup. 676 + */ 677 + struct cgroup cgrp; 667 678 }; 668 679 669 680 /*
+1 -1
kernel/cgroup/cgroup.c
··· 5847 5847 int ret; 5848 5848 5849 5849 /* allocate the cgroup and its ID, 0 is reserved for the root */ 5850 - cgrp = kzalloc(struct_size(cgrp, ancestors, (level + 1)), GFP_KERNEL); 5850 + cgrp = kzalloc(struct_size(cgrp, _low_ancestors, level), GFP_KERNEL); 5851 5851 if (!cgrp) 5852 5852 return ERR_PTR(-ENOMEM); 5853 5853