cgroup: fix too early usage of static_branch_disable()
49d1dc4b81("cgroup: implement static_key based cgroup_subsys_enabled() and cgroup_subsys_on_dfl()") converted cgroup enabled test to use static_key; however, cgroup_disable() is called before static_key subsystem itself is initialized and thus leads to the following warning when "cgroup_disable=" parameter is specified. WARNING: CPU: 0 PID: 0 at kernel/jump_label.c:99 static_key_slow_dec+0x44/0x60() static_key_slow_dec used before call to jump_label_init ... Call Trace: [<ffffffff813b18c2>] dump_stack+0x44/0x62 [<ffffffff8108dd52>] warn_slowpath_common+0x82/0xc0 [<ffffffff8108ddec>] warn_slowpath_fmt+0x5c/0x80 [<ffffffff8119c054>] static_key_slow_dec+0x44/0x60 [<ffffffff81d826b6>] cgroup_disable+0xaf/0xd6 [<ffffffff81d5f9de>] unknown_bootoption+0x8c/0x194 [<ffffffff810b0c03>] parse_args+0x273/0x4a0 [<ffffffff81d5fd67>] start_kernel+0x205/0x4b8 ... Fix it by making cgroup_disable() to record the subsystems to disable in cgroup_disable_mask and moving the actual application to cgroup_init() which is late enough and where the enabled state is first used. Signed-off-by: Tejun Heo <tj@kernel.org> Reported-by: Andrey Wagin <avagin@gmail.com> Link: http://lkml.kernel.org/g/CANaxB-yFuS4SA2znSvcKrO9L_CbHciHYW+o9bN8sZJ8eR9FxYA@mail.gmail.com Fixes:49d1dc4b81
This commit is contained in:
		
							parent
							
								
									c0522908d2
								
							
						
					
					
						commit
						a3e72739b7
					
				| @ -5124,6 +5124,8 @@ int __init cgroup_init_early(void) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static unsigned long cgroup_disable_mask __initdata; | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * cgroup_init - cgroup initialization |  * cgroup_init - cgroup initialization | ||||||
|  * |  * | ||||||
| @ -5170,8 +5172,12 @@ int __init cgroup_init(void) | |||||||
| 		 * disabled flag and cftype registration needs kmalloc, | 		 * disabled flag and cftype registration needs kmalloc, | ||||||
| 		 * both of which aren't available during early_init. | 		 * both of which aren't available during early_init. | ||||||
| 		 */ | 		 */ | ||||||
| 		if (!cgroup_ssid_enabled(ssid)) | 		if (cgroup_disable_mask & (1 << ssid)) { | ||||||
|  | 			static_branch_disable(cgroup_subsys_enabled_key[ssid]); | ||||||
|  | 			printk(KERN_INFO "Disabling %s control group subsystem\n", | ||||||
|  | 			       ss->name); | ||||||
| 			continue; | 			continue; | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		cgrp_dfl_root.subsys_mask |= 1 << ss->id; | 		cgrp_dfl_root.subsys_mask |= 1 << ss->id; | ||||||
| 
 | 
 | ||||||
| @ -5595,11 +5601,7 @@ static int __init cgroup_disable(char *str) | |||||||
| 			if (strcmp(token, ss->name) && | 			if (strcmp(token, ss->name) && | ||||||
| 			    strcmp(token, ss->legacy_name)) | 			    strcmp(token, ss->legacy_name)) | ||||||
| 				continue; | 				continue; | ||||||
| 
 | 			cgroup_disable_mask |= 1 << i; | ||||||
| 			static_branch_disable(cgroup_subsys_enabled_key[i]); |  | ||||||
| 			printk(KERN_INFO "Disabling %s control group subsystem\n", |  | ||||||
| 			       ss->name); |  | ||||||
| 			break; |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return 1; | 	return 1; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user