lkml.org 
[lkml]   [2016]   [Nov]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 04/25] lib/percpu_counter: Convert to hotplug state machine
    Date
    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>
    ---
    include/linux/cpuhotplug.h | 1 +
    lib/percpu_counter.c | 25 ++++++++++++++-----------
    2 files changed, 15 insertions(+), 11 deletions(-)

    diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
    index c622ab349af3..04e5f99ffc70 100644
    --- a/include/linux/cpuhotplug.h
    +++ b/include/linux/cpuhotplug.h
    @@ -33,6 +33,7 @@ enum cpuhp_state {
    CPUHP_FS_BUFF_DEAD,
    CPUHP_PRINTK_DEAD,
    CPUHP_MM_MEMCQ_DEAD,
    + CPUHP_PERCPU_CNT_DEAD,
    CPUHP_WORKQUEUE_PREP,
    CPUHP_POWER_NUMA_PREPARE,
    CPUHP_HRTIMERS_PREPARE,
    diff --git a/lib/percpu_counter.c b/lib/percpu_counter.c
    index 72d36113ccaa..c8cebb137076 100644
    --- a/lib/percpu_counter.c
    +++ b/lib/percpu_counter.c
    @@ -158,25 +158,21 @@ EXPORT_SYMBOL(percpu_counter_destroy);
    int percpu_counter_batch __read_mostly = 32;
    EXPORT_SYMBOL(percpu_counter_batch);

    -static void compute_batch_value(void)
    +static int compute_batch_value(unsigned int cpu)
    {
    int nr = num_online_cpus();

    percpu_counter_batch = max(32, nr*2);
    + return 0;
    }

    -static int percpu_counter_hotcpu_callback(struct notifier_block *nb,
    - unsigned long action, void *hcpu)
    +static int percpu_counter_cpu_dead(unsigned int cpu)
    {
    #ifdef CONFIG_HOTPLUG_CPU
    - unsigned int cpu;
    struct percpu_counter *fbc;

    - compute_batch_value();
    - if (action != CPU_DEAD && action != CPU_DEAD_FROZEN)
    - return NOTIFY_OK;
    + compute_batch_value(cpu);

    - cpu = (unsigned long)hcpu;
    spin_lock_irq(&percpu_counters_lock);
    list_for_each_entry(fbc, &percpu_counters, list) {
    s32 *pcount;
    @@ -190,7 +186,7 @@ static int percpu_counter_hotcpu_callback(struct notifier_block *nb,
    }
    spin_unlock_irq(&percpu_counters_lock);
    #endif
    - return NOTIFY_OK;
    + return 0;
    }

    /*
    @@ -222,8 +218,15 @@ EXPORT_SYMBOL(__percpu_counter_compare);

    static int __init percpu_counter_startup(void)
    {
    - compute_batch_value();
    - hotcpu_notifier(percpu_counter_hotcpu_callback, 0);
    + int ret;
    +
    + 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;
    }
    module_init(percpu_counter_startup);
    --
    2.10.2
    \
     
     \ /
      Last update: 2016-11-03 15:57    [W:4.105 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site