lkml.org 
[lkml]   [2016]   [Nov]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 14/22] mm/compaction: Convert to hotplug state machine
    Date
    From: Anna-Maria Gleixner <anna-maria@linutronix.de>

    Install the callbacks via the state machine. Should the hotplug init fail then
    no threads are spawned.

    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: linux-mm@kvack.org
    Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    ---
    mm/compaction.c | 31 ++++++++++++++++++-------------
    1 file changed, 18 insertions(+), 13 deletions(-)

    diff --git a/mm/compaction.c b/mm/compaction.c
    index 0409a4ad6ea1..0d37192d9423 100644
    --- a/mm/compaction.c
    +++ b/mm/compaction.c
    @@ -2043,33 +2043,38 @@ void kcompactd_stop(int nid)
    * away, we get changed to run anywhere: as the first one comes back,
    * restore their cpu bindings.
    */
    -static int cpu_callback(struct notifier_block *nfb, unsigned long action,
    - void *hcpu)
    +static int kcompactd_cpu_online(unsigned int cpu)
    {
    int nid;

    - if (action == CPU_ONLINE || action == CPU_ONLINE_FROZEN) {
    - for_each_node_state(nid, N_MEMORY) {
    - pg_data_t *pgdat = NODE_DATA(nid);
    - const struct cpumask *mask;
    + for_each_node_state(nid, N_MEMORY) {
    + pg_data_t *pgdat = NODE_DATA(nid);
    + const struct cpumask *mask;

    - mask = cpumask_of_node(pgdat->node_id);
    + mask = cpumask_of_node(pgdat->node_id);

    - if (cpumask_any_and(cpu_online_mask, mask) < nr_cpu_ids)
    - /* One of our CPUs online: restore mask */
    - set_cpus_allowed_ptr(pgdat->kcompactd, mask);
    - }
    + if (cpumask_any_and(cpu_online_mask, mask) < nr_cpu_ids)
    + /* One of our CPUs online: restore mask */
    + set_cpus_allowed_ptr(pgdat->kcompactd, mask);
    }
    - return NOTIFY_OK;
    + return 0;
    }

    static int __init kcompactd_init(void)
    {
    int nid;
    + int ret;
    +
    + ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
    + "mm/compaction:online",
    + kcompactd_cpu_online, NULL);
    + if (ret < 0) {
    + pr_err("kcompactd: failed to register hotplug callbacks.\n");
    + return ret;
    + }

    for_each_node_state(nid, N_MEMORY)
    kcompactd_run(nid);
    - hotcpu_notifier(cpu_callback, 0);
    return 0;
    }
    subsys_initcall(kcompactd_init)
    --
    2.10.2
    \
     
     \ /
      Last update: 2016-11-27 00:17    [W:2.469 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site