|
@@ -516,6 +516,36 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,
|
|
|
return allocated;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_NUMA
|
|
|
+/* Called from the slab reaper to drain remote pagesets */
|
|
|
+void drain_remote_pages(void)
|
|
|
+{
|
|
|
+ struct zone *zone;
|
|
|
+ int i;
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ local_irq_save(flags);
|
|
|
+ for_each_zone(zone) {
|
|
|
+ struct per_cpu_pageset *pset;
|
|
|
+
|
|
|
+ /* Do not drain local pagesets */
|
|
|
+ if (zone->zone_pgdat->node_id == numa_node_id())
|
|
|
+ continue;
|
|
|
+
|
|
|
+ pset = zone->pageset[smp_processor_id()];
|
|
|
+ for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) {
|
|
|
+ struct per_cpu_pages *pcp;
|
|
|
+
|
|
|
+ pcp = &pset->pcp[i];
|
|
|
+ if (pcp->count)
|
|
|
+ pcp->count -= free_pages_bulk(zone, pcp->count,
|
|
|
+ &pcp->list, 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ local_irq_restore(flags);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
#if defined(CONFIG_PM) || defined(CONFIG_HOTPLUG_CPU)
|
|
|
static void __drain_pages(unsigned int cpu)
|
|
|
{
|
|
@@ -1271,12 +1301,13 @@ void show_free_areas(void)
|
|
|
pageset = zone_pcp(zone, cpu);
|
|
|
|
|
|
for (temperature = 0; temperature < 2; temperature++)
|
|
|
- printk("cpu %d %s: low %d, high %d, batch %d\n",
|
|
|
+ printk("cpu %d %s: low %d, high %d, batch %d used:%d\n",
|
|
|
cpu,
|
|
|
temperature ? "cold" : "hot",
|
|
|
pageset->pcp[temperature].low,
|
|
|
pageset->pcp[temperature].high,
|
|
|
- pageset->pcp[temperature].batch);
|
|
|
+ pageset->pcp[temperature].batch,
|
|
|
+ pageset->pcp[temperature].count);
|
|
|
}
|
|
|
}
|
|
|
|