diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/time/timer_migration.c | 24 | ||||
| -rw-r--r-- | kernel/time/timer_migration.h | 2 |
2 files changed, 20 insertions, 6 deletions
diff --git a/kernel/time/timer_migration.c b/kernel/time/timer_migration.c index a8ec85f2f5c7..a68b9c746e12 100644 --- a/kernel/time/timer_migration.c +++ b/kernel/time/timer_migration.c @@ -1916,17 +1916,23 @@ static struct tmigr_hierarchy *tmigr_get_hierarchy(void) if (!hierarchy) return ERR_PTR(-ENOMEM); + hierarchy->cpumask = kzalloc(cpumask_size(), GFP_KERNEL); + if (!hierarchy->cpumask) + goto err; + hierarchy->level_list = kzalloc_objs(struct list_head, tmigr_hierarchy_levels); - if (!hierarchy->level_list) { - kfree(hierarchy); - hierarchy = NULL; - return ERR_PTR(-ENOMEM); - } + if (!hierarchy->level_list) + goto err; for (int i = 0; i < tmigr_hierarchy_levels; i++) INIT_LIST_HEAD(&hierarchy->level_list[i]); return hierarchy; +err: + kfree(hierarchy->cpumask); + kfree(hierarchy); + hierarchy = NULL; + return ERR_PTR(-ENOMEM); } static int tmigr_add_cpu(unsigned int cpu) @@ -1946,8 +1952,11 @@ static int tmigr_add_cpu(unsigned int cpu) ret = tmigr_setup_groups(hier, cpu, node, NULL, false); + if (ret < 0) + return ret; + /* Root has changed? Connect the old one to the new */ - if (ret >= 0 && old_root && old_root != hier->root) { + if (old_root && old_root != hier->root) { /* * The target CPU must never do the prepare work, except * on early boot when the boot CPU is the target. Otherwise @@ -1964,6 +1973,9 @@ static int tmigr_add_cpu(unsigned int cpu) ret = tmigr_setup_groups(hier, -1, old_root->numa_node, old_root, true); } + if (ret >= 0) + cpumask_set_cpu(cpu, hier->cpumask); + return ret; } diff --git a/kernel/time/timer_migration.h b/kernel/time/timer_migration.h index 77df422e5f9a..0cfbb8d799a6 100644 --- a/kernel/time/timer_migration.h +++ b/kernel/time/timer_migration.h @@ -8,10 +8,12 @@ /** * struct tmigr_hierarchy - a hierarchy associated to a given CPU capacity. * @level_list: Per level lists of tmigr groups + * @cpumask: CPUs belonging to this hierarchy * @root: The current root of the hierarchy */ struct tmigr_hierarchy { struct list_head *level_list; + struct cpumask *cpumask; struct tmigr_group *root; }; |
