On Thu, 8 Oct 2009, Lee Schermerhorn wrote: > From rientjes@xxxxxxxxxx Wed Oct 7 02:25:10 2009 > From: David Rientjes <rientjes@xxxxxxxxxx> > [PATCH 10/12] mm: clear node in N_HIGH_MEMORY and stop kswapd when all memory is offlined > > mm: clear node in N_HIGH_MEMORY and stop kswapd when all memory is offlined > > When memory is hot-removed, its node must be cleared in N_HIGH_MEMORY if > there are no present pages left. > > In such a situation, kswapd must also be stopped since it has nothing > left to do. > > Cc: Christoph Lameter <cl@xxxxxxxxxxxxxxxxxxxx> > Cc: Yasunori Goto <y-goto@xxxxxxxxxxxxxx> > Cc: Mel Gorman <mel@xxxxxxxxx> > Cc: Rafael J. Wysocki <rjw@xxxxxxx> > Cc: Rik van Riel <riel@xxxxxxxxxx> Thanks for adding these, but four of five never got cc'd on the patch :) I've added them. > Signed-off-by: David Rientjes <rientjes@xxxxxxxxxx> > Signed-off-by: Lee Schermerhorn <lee.schermerhorn@xxxxxx> > > --- > > include/linux/swap.h | 1 + > mm/memory_hotplug.c | 4 ++++ > mm/vmscan.c | 28 ++++++++++++++++++++++------ > 3 files changed, 27 insertions(+), 6 deletions(-) > > Index: linux-2.6.31-mmotm-090925-1435/include/linux/swap.h > =================================================================== > --- linux-2.6.31-mmotm-090925-1435.orig/include/linux/swap.h 2009-09-28 10:10:39.000000000 -0400 > +++ linux-2.6.31-mmotm-090925-1435/include/linux/swap.h 2009-10-07 16:24:43.000000000 -0400 > @@ -273,6 +273,7 @@ extern int scan_unevictable_register_nod > extern void scan_unevictable_unregister_node(struct node *node); > > extern int kswapd_run(int nid); > +extern void kswapd_stop(int nid); > > #ifdef CONFIG_MMU > /* linux/mm/shmem.c */ > Index: linux-2.6.31-mmotm-090925-1435/mm/memory_hotplug.c > =================================================================== > --- linux-2.6.31-mmotm-090925-1435.orig/mm/memory_hotplug.c 2009-09-28 10:10:39.000000000 -0400 > +++ linux-2.6.31-mmotm-090925-1435/mm/memory_hotplug.c 2009-10-07 16:24:43.000000000 -0400 > @@ -838,6 +838,10 @@ repeat: > > setup_per_zone_wmarks(); > calculate_zone_inactive_ratio(zone); > + if (!node_present_pages(node)) { > + node_clear_state(node, N_HIGH_MEMORY); > + kswapd_stop(node); > + } > > vm_total_pages = nr_free_pagecache_pages(); > writeback_set_ratelimit(); > Index: linux-2.6.31-mmotm-090925-1435/mm/vmscan.c > =================================================================== > --- linux-2.6.31-mmotm-090925-1435.orig/mm/vmscan.c 2009-09-28 10:10:43.000000000 -0400 > +++ linux-2.6.31-mmotm-090925-1435/mm/vmscan.c 2009-10-07 16:24:43.000000000 -0400 > @@ -2167,6 +2167,7 @@ static int kswapd(void *p) > order = 0; > for ( ; ; ) { > unsigned long new_order; > + int ret; > > prepare_to_wait(&pgdat->kswapd_wait, &wait, TASK_INTERRUPTIBLE); > new_order = pgdat->kswapd_max_order; > @@ -2178,19 +2179,23 @@ static int kswapd(void *p) > */ > order = new_order; > } else { > - if (!freezing(current)) > + if (!freezing(current) && !kthread_should_stop()) > schedule(); > > order = pgdat->kswapd_max_order; > } > finish_wait(&pgdat->kswapd_wait, &wait); > > - if (!try_to_freeze()) { > - /* We can speed up thawing tasks if we don't call > - * balance_pgdat after returning from the refrigerator > - */ > + ret = try_to_freeze(); > + if (kthread_should_stop()) > + break; > + > + /* > + * We can speed up thawing tasks if we don't call balance_pgdat > + * after returning from the refrigerator > + */ > + if (!ret) > balance_pgdat(pgdat, order); > - } > } > return 0; > } > @@ -2445,6 +2450,17 @@ int kswapd_run(int nid) > return ret; > } > > +/* > + * Called by memory hotplug when all memory in a node is offlined. > + */ > +void kswapd_stop(int nid) > +{ > + struct task_struct *kswapd = NODE_DATA(nid)->kswapd; > + > + if (kswapd) > + kthread_stop(kswapd); > +} > + > static int __init kswapd_init(void) > { > int nid; > -- To unsubscribe from this list: send the line "unsubscribe linux-numa" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html