From edb0b64b5030f176a79fc6bcbb6f04ef2536a0fb Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 30 Jun 2009 11:06:32 -0700 Subject: [PATCH] another .29 patch --- ...handling-of-pagesets-for-downed-cpus.patch | 62 +++++++++++++++++++ queue-2.6.29/series | 1 + 2 files changed, 63 insertions(+) create mode 100644 queue-2.6.29/mm-fix-handling-of-pagesets-for-downed-cpus.patch diff --git a/queue-2.6.29/mm-fix-handling-of-pagesets-for-downed-cpus.patch b/queue-2.6.29/mm-fix-handling-of-pagesets-for-downed-cpus.patch new file mode 100644 index 00000000000..7bc6990f038 --- /dev/null +++ b/queue-2.6.29/mm-fix-handling-of-pagesets-for-downed-cpus.patch @@ -0,0 +1,62 @@ +From 364df0ebfbbb1330bfc6ca159f4d6020efc15a12 Mon Sep 17 00:00:00 2001 +From: Dimitri Sivanich +Date: Tue, 23 Jun 2009 12:37:04 -0700 +Subject: mm: fix handling of pagesets for downed cpus + +From: Dimitri Sivanich + +commit 364df0ebfbbb1330bfc6ca159f4d6020efc15a12 upstream. + +After downing/upping a cpu, an attempt to set +/proc/sys/vm/percpu_pagelist_fraction results in an oops in +percpu_pagelist_fraction_sysctl_handler(). + +If a processor is downed then we need to set the pageset pointer back to +the boot pageset. + +Updates of the high water marks should not access pagesets of unpopulated +zones (those pointer go to the boot pagesets which would be no longer +functional if their size would be increased beyond zero). + +Signed-off-by: Dimitri Sivanich +Signed-off-by: Christoph Lameter +Reviewed-by: KOSAKI Motohiro +Cc: Nick Piggin +Cc: Mel Gorman +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/page_alloc.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -2804,7 +2804,7 @@ bad: + if (dzone == zone) + break; + kfree(zone_pcp(dzone, cpu)); +- zone_pcp(dzone, cpu) = NULL; ++ zone_pcp(dzone, cpu) = &boot_pageset[cpu]; + } + return -ENOMEM; + } +@@ -2819,7 +2819,7 @@ static inline void free_zone_pagesets(in + /* Free per_cpu_pageset if it is slab allocated */ + if (pset != &boot_pageset[cpu]) + kfree(pset); +- zone_pcp(zone, cpu) = NULL; ++ zone_pcp(zone, cpu) = &boot_pageset[cpu]; + } + } + +@@ -4494,6 +4494,8 @@ int percpu_pagelist_fraction_sysctl_hand + if (!write || (ret == -EINVAL)) + return ret; + for_each_zone(zone) { ++ if (!populated_zone(zone)) ++ continue; + for_each_online_cpu(cpu) { + unsigned long high; + high = zone->present_pages / percpu_pagelist_fraction; diff --git a/queue-2.6.29/series b/queue-2.6.29/series index d17d9e4ccf6..c1b52011417 100644 --- a/queue-2.6.29/series +++ b/queue-2.6.29/series @@ -31,3 +31,4 @@ pci-pm-follow-pci_pm_ctrl_no_soft_reset-during-transitions-from-d3.patch pcmcia-cm4000-fix-lock-imbalance.patch qla2xxx-correct-overflow-during-dump-processing-on-large-memory-isp23xx-parts.patch sound-seq_midi_event-fix-decoding-of-rpn-events.patch +mm-fix-handling-of-pagesets-for-downed-cpus.patch -- 2.47.2