On Sun, Jan 26, 2020 at 02:44:31PM -0800, David Rientjes wrote: >On Sun, 26 Jan 2020, Wei Yang wrote: > >> When onlining a cpu, kswapd_cpu_online() is called to adjust kswapd cpu >> affinity. >> >> Current routine does like this: >> >> * Iterate all the numa node >> * Adjust cpu affinity when node has an online cpu >> >> Actually we could improve this by: >> >> * Just adjust the numa node to which current online cpu belongs >> >> Because we know which numa node the cpu belongs to and this cpu would >> not affect other node. >> > >Is there ever a situation where the cpu to be onlined would have appeared >in the cpumask of another node and so a different kswapd's cpumask would >now include an off-node cpu? No, I don't think so. Per my understanding, kswapd_cpu_online() will be invoked when a cpu is onlined. And the particular cpu belongs to a particular numa node. So it is not necessary to iterate on every nodes. And current code use cpumask_and_any() to do the check. If my understanding is correct, the check would return true if this node has any online cpu. This is likely to be true. This is why I want to make the logic clear. > >> Signed-off-by: Wei Yang <richardw.yang@xxxxxxxxxxxxxxx> >> --- >> mm/vmscan.c | 19 ++++++++++--------- >> 1 file changed, 10 insertions(+), 9 deletions(-) >> >> diff --git a/mm/vmscan.c b/mm/vmscan.c >> index 572fb17c6273..19c92d35045c 100644 >> --- a/mm/vmscan.c >> +++ b/mm/vmscan.c >> @@ -4049,18 +4049,19 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim) >> restore their cpu bindings. */ >> static int kswapd_cpu_online(unsigned int cpu) >> { >> - int nid; >> + int nid = cpu_to_node(cpu); >> + pg_data_t *pgdat; >> + const struct cpumask *mask; >> >> - for_each_node_state(nid, N_MEMORY) { >> - pg_data_t *pgdat = NODE_DATA(nid); >> - const struct cpumask *mask; >> + if (!node_state(nid, N_MEMORY)) >> + return 0; >> >> - mask = cpumask_of_node(pgdat->node_id); >> + pgdat = NODE_DATA(nid); >> + mask = cpumask_of_node(nid); >> + >> + /* One of our CPUs online: restore mask */ >> + set_cpus_allowed_ptr(pgdat->kswapd, mask); >> >> - if (cpumask_any_and(cpu_online_mask, mask) < nr_cpu_ids) >> - /* One of our CPUs online: restore mask */ >> - set_cpus_allowed_ptr(pgdat->kswapd, mask); >> - } >> return 0; >> } >> >> -- >> 2.17.1 >> >> >> -- Wei Yang Help you, Help me