mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 19:43:40 +02:00
cgroup: avoid per-cpu allocation of size zero rstat cpu locks
Subsystem rstat locks are dynamically allocated per-cpu. It was discovered
that a panic can occur during this allocation when the lock size is zero.
This is the case on non-smp systems, since arch_spinlock_t is defined as an
empty struct. Prevent this allocation when !CONFIG_SMP by adding a
pre-processor conditional around the affected block.
Signed-off-by: JP Kobryn <inwardvessel@gmail.com>
Reported-by: Klara Modin <klarasmodin@gmail.com>
Fixes: 748922dcfa ("cgroup: use subsystem-specific rstat locks to avoid contention")
Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
dc9f08bac2
commit
731bdd9746
|
|
@ -510,11 +510,20 @@ int __init ss_rstat_init(struct cgroup_subsys *ss)
|
|||
{
|
||||
int cpu;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/*
|
||||
* On uniprocessor machines, arch_spinlock_t is defined as an empty
|
||||
* struct. Avoid allocating a size of zero by having this block
|
||||
* excluded in this case. It's acceptable to leave the subsystem locks
|
||||
* unitialized since the associated lock functions are no-ops in the
|
||||
* non-smp case.
|
||||
*/
|
||||
if (ss) {
|
||||
ss->rstat_ss_cpu_lock = alloc_percpu(raw_spinlock_t);
|
||||
if (!ss->rstat_ss_cpu_lock)
|
||||
return -ENOMEM;
|
||||
}
|
||||
#endif
|
||||
|
||||
spin_lock_init(ss_rstat_lock(ss));
|
||||
for_each_possible_cpu(cpu)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user