mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-04-11 11:38:20 +07:00
lib/percpu_counter: Convert to hotplug state machine
Install the callbacks via the state machine and let the core invoke the callbacks on the already online CPUs. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: rt@linutronix.de Link: http://lkml.kernel.org/r/20161103145021.28528-5-bigeasy@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
308167fcb3
commit
5588f5afb4
@ -33,6 +33,7 @@ enum cpuhp_state {
|
|||||||
CPUHP_FS_BUFF_DEAD,
|
CPUHP_FS_BUFF_DEAD,
|
||||||
CPUHP_PRINTK_DEAD,
|
CPUHP_PRINTK_DEAD,
|
||||||
CPUHP_MM_MEMCQ_DEAD,
|
CPUHP_MM_MEMCQ_DEAD,
|
||||||
|
CPUHP_PERCPU_CNT_DEAD,
|
||||||
CPUHP_WORKQUEUE_PREP,
|
CPUHP_WORKQUEUE_PREP,
|
||||||
CPUHP_POWER_NUMA_PREPARE,
|
CPUHP_POWER_NUMA_PREPARE,
|
||||||
CPUHP_HRTIMERS_PREPARE,
|
CPUHP_HRTIMERS_PREPARE,
|
||||||
|
@ -158,25 +158,21 @@ EXPORT_SYMBOL(percpu_counter_destroy);
|
|||||||
int percpu_counter_batch __read_mostly = 32;
|
int percpu_counter_batch __read_mostly = 32;
|
||||||
EXPORT_SYMBOL(percpu_counter_batch);
|
EXPORT_SYMBOL(percpu_counter_batch);
|
||||||
|
|
||||||
static void compute_batch_value(void)
|
static int compute_batch_value(unsigned int cpu)
|
||||||
{
|
{
|
||||||
int nr = num_online_cpus();
|
int nr = num_online_cpus();
|
||||||
|
|
||||||
percpu_counter_batch = max(32, nr*2);
|
percpu_counter_batch = max(32, nr*2);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int percpu_counter_hotcpu_callback(struct notifier_block *nb,
|
static int percpu_counter_cpu_dead(unsigned int cpu)
|
||||||
unsigned long action, void *hcpu)
|
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
unsigned int cpu;
|
|
||||||
struct percpu_counter *fbc;
|
struct percpu_counter *fbc;
|
||||||
|
|
||||||
compute_batch_value();
|
compute_batch_value(cpu);
|
||||||
if (action != CPU_DEAD && action != CPU_DEAD_FROZEN)
|
|
||||||
return NOTIFY_OK;
|
|
||||||
|
|
||||||
cpu = (unsigned long)hcpu;
|
|
||||||
spin_lock_irq(&percpu_counters_lock);
|
spin_lock_irq(&percpu_counters_lock);
|
||||||
list_for_each_entry(fbc, &percpu_counters, list) {
|
list_for_each_entry(fbc, &percpu_counters, list) {
|
||||||
s32 *pcount;
|
s32 *pcount;
|
||||||
@ -190,7 +186,7 @@ static int percpu_counter_hotcpu_callback(struct notifier_block *nb,
|
|||||||
}
|
}
|
||||||
spin_unlock_irq(&percpu_counters_lock);
|
spin_unlock_irq(&percpu_counters_lock);
|
||||||
#endif
|
#endif
|
||||||
return NOTIFY_OK;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -222,8 +218,15 @@ EXPORT_SYMBOL(__percpu_counter_compare);
|
|||||||
|
|
||||||
static int __init percpu_counter_startup(void)
|
static int __init percpu_counter_startup(void)
|
||||||
{
|
{
|
||||||
compute_batch_value();
|
int ret;
|
||||||
hotcpu_notifier(percpu_counter_hotcpu_callback, 0);
|
|
||||||
|
ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "lib/percpu_cnt:online",
|
||||||
|
compute_batch_value, NULL);
|
||||||
|
WARN_ON(ret < 0);
|
||||||
|
ret = cpuhp_setup_state_nocalls(CPUHP_PERCPU_CNT_DEAD,
|
||||||
|
"lib/percpu_cnt:dead", NULL,
|
||||||
|
percpu_counter_cpu_dead);
|
||||||
|
WARN_ON(ret < 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
module_init(percpu_counter_startup);
|
module_init(percpu_counter_startup);
|
||||||
|
Loading…
Reference in New Issue
Block a user