lkml.org 
[lkml]   [2015]   [Jun]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 3/3] cpu-hotplug: convert cpu_hotplug_disabled to a counter
    Date
    As cpu_hotplug_enable/cpu_hotplug_disable functions are now available to
    modules we need to convert cpu_hotplug_disabled to a counter to properly
    support disable -> disable -> enable call sequences. E.g. after Hyper-V
    vmbus module did cpu_hotplug_disable() hibernate path calls
    disable_nonboot_cpus() and if we hit an error in _cpu_down()
    enable_nonboot_cpus() will be called on the failure path (thus making
    cpu_hotplug_disabled = 0 and leaving cpu hotplug in 'enabled' state).
    Same problem is possible if more than 1 module use cpu_hotplug_disable/
    cpu_hotplug_enable on their load/unload paths. When one of these modules
    is been unloaded it is logical to leave cpu hotplug in 'disabled' state.

    To support the change we need to increse cpu_hotplug_disabled counter
    in disable_nonboot_cpus() unconditionally as all users of
    disable_nonboot_cpus() are supposed to do enable_nonboot_cpus() in case
    an error was returned.

    Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    ---
    Documentation/power/suspend-and-cpuhotplug.txt | 6 +++---
    kernel/cpu.c | 21 +++++++++++++--------
    2 files changed, 16 insertions(+), 11 deletions(-)

    diff --git a/Documentation/power/suspend-and-cpuhotplug.txt b/Documentation/power/suspend-and-cpuhotplug.txt
    index 2850df3..2fc9095 100644
    --- a/Documentation/power/suspend-and-cpuhotplug.txt
    +++ b/Documentation/power/suspend-and-cpuhotplug.txt
    @@ -72,7 +72,7 @@ More details follow:
    |
    v
    Disable regular cpu hotplug
    - by setting cpu_hotplug_disabled=1
    + by increasing cpu_hotplug_disabled
    |
    v
    Release cpu_add_remove_lock
    @@ -89,7 +89,7 @@ Resuming back is likewise, with the counterparts being (in the order of
    execution during resume):
    * enable_nonboot_cpus() which involves:
    | Acquire cpu_add_remove_lock
    - | Reset cpu_hotplug_disabled to 0, thereby enabling regular cpu hotplug
    + | Decrease cpu_hotplug_disabled, thereby enabling regular cpu hotplug
    | Call _cpu_up() [for all those cpus in the frozen_cpus mask, in a loop]
    | Release cpu_add_remove_lock
    v
    @@ -120,7 +120,7 @@ after the entire cycle is complete (i.e., suspend + resume).
    Acquire cpu_add_remove_lock
    |
    v
    - If cpu_hotplug_disabled is 1
    + If cpu_hotplug_disabled > 0
    return gracefully
    |
    |
    diff --git a/kernel/cpu.c b/kernel/cpu.c
    index dc005e7..cab3c92 100644
    --- a/kernel/cpu.c
    +++ b/kernel/cpu.c
    @@ -190,7 +190,7 @@ void cpu_hotplug_done(void)
    void cpu_hotplug_disable(void)
    {
    cpu_maps_update_begin();
    - cpu_hotplug_disabled = 1;
    + cpu_hotplug_disabled++;
    cpu_maps_update_done();
    }
    EXPORT_SYMBOL_GPL(cpu_hotplug_disable);
    @@ -198,7 +198,7 @@ EXPORT_SYMBOL_GPL(cpu_hotplug_disable);
    void cpu_hotplug_enable(void)
    {
    cpu_maps_update_begin();
    - cpu_hotplug_disabled = 0;
    + WARN_ON(--cpu_hotplug_disabled < 0);
    cpu_maps_update_done();
    }
    EXPORT_SYMBOL_GPL(cpu_hotplug_enable);
    @@ -598,13 +598,18 @@ int disable_nonboot_cpus(void)
    }
    }

    - if (!error) {
    + if (!error)
    BUG_ON(num_online_cpus() > 1);
    - /* Make sure the CPUs won't be enabled by someone else */
    - cpu_hotplug_disabled = 1;
    - } else {
    + else
    pr_err("Non-boot CPUs are not disabled\n");
    - }
    +
    + /*
    + * Make sure the CPUs won't be enabled by someone else. We need to do
    + * this even in case of failure as all disable_nonboot_cpus() users are
    + * supposed to do enable_nonboot_cpus() on the failure path.
    + */
    + cpu_hotplug_disabled++;
    +
    cpu_maps_update_done();
    return error;
    }
    @@ -623,7 +628,7 @@ void __ref enable_nonboot_cpus(void)

    /* Allow everyone to use the CPU hotplug again */
    cpu_maps_update_begin();
    - cpu_hotplug_disabled = 0;
    + WARN_ON(--cpu_hotplug_disabled < 0);
    if (cpumask_empty(frozen_cpus))
    goto out;

    --
    2.4.3


    \
     
     \ /
      Last update: 2015-06-26 16:21    [W:3.122 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site