diff for duplicates of <20100713101821.2835.2568.sendpatchset@danny.redhat> diff --git a/a/1.txt b/N1/1.txt index 46d2589..882910c 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -226,9 +226,3 @@ index 15a14b1..af91d5c 100644 zone->present_pages); -- 1.7.1.1 - --- -To unsubscribe, send a message with 'unsubscribe linux-mm' in -the body to majordomo@kvack.org. For more info on Linux MM, -see: http://www.linux-mm.org/ . -Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> diff --git a/a/content_digest b/N1/content_digest index 1a62e0f..a2613ba 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -243,12 +243,6 @@ " \t\t zone->spanned_pages,\n" " \t\t zone->present_pages);\n" "-- \n" - "1.7.1.1\n" - "\n" - "--\n" - "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" - "the body to majordomo@kvack.org. For more info on Linux MM,\n" - "see: http://www.linux-mm.org/ .\n" - "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" + 1.7.1.1 -8a0001de3ead934d16df99a70cacf98eee27963573c98ec91f4a97972da72883 +800fc09995ccdb974ac0c1f83f09b8305ad7698b0565f26938bd116ae2f0acc7
diff --git a/a/1.txt b/N2/1.txt index 46d2589..8b13789 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -1,234 +1 @@ ->From 973ce2ee797025f055ccb61359180e53c3ecc681 Mon Sep 17 00:00:00 2001 -From: Xiaotian Feng <dfeng@redhat.com> -Date: Tue, 13 Jul 2010 10:45:48 +0800 -Subject: [PATCH 08/30] mm: emergency pool -Provide means to reserve a specific amount of pages. - -The emergency pool is separated from the min watermark because ALLOC_HARDER -and ALLOC_HIGH modify the watermark in a relative way and thus do not ensure -a strict minimum. - -Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> -Signed-off-by: Suresh Jayaraman <sjayaraman@suse.de> -Signed-off-by: Xiaotian Feng <dfeng@redhat.com> ---- - include/linux/mmzone.h | 3 ++ - mm/page_alloc.c | 84 ++++++++++++++++++++++++++++++++++++++++++------ - mm/vmstat.c | 6 ++-- - 3 files changed, 80 insertions(+), 13 deletions(-) - -diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h -index 9ed9c45..75a0871 100644 ---- a/include/linux/mmzone.h -+++ b/include/linux/mmzone.h -@@ -279,6 +279,7 @@ struct zone_reclaim_stat { - - struct zone { - /* Fields commonly accessed by the page allocator */ -+ unsigned long pages_emerg; /* emergency pool */ - - /* zone watermarks, access with *_wmark_pages(zone) macros */ - unsigned long watermark[NR_WMARK]; -@@ -770,6 +771,8 @@ int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *, int, - int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *, int, - void __user *, size_t *, loff_t *); - -+int adjust_memalloc_reserve(int pages); -+ - extern int numa_zonelist_order_handler(struct ctl_table *, int, - void __user *, size_t *, loff_t *); - extern char numa_zonelist_order[]; -diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index 4b1fa10..6c85e9e 100644 ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -167,6 +167,8 @@ static char * const zone_names[MAX_NR_ZONES] = { - - static DEFINE_SPINLOCK(min_free_lock); - int min_free_kbytes = 1024; -+static DEFINE_MUTEX(var_free_mutex); -+int var_free_kbytes; - - static unsigned long __meminitdata nr_kernel_pages; - static unsigned long __meminitdata nr_all_pages; -@@ -1457,7 +1459,7 @@ int zone_watermark_ok(struct zone *z, int order, unsigned long mark, - if (alloc_flags & ALLOC_HARDER) - min -= min / 4; - -- if (free_pages <= min + z->lowmem_reserve[classzone_idx]) -+ if (free_pages <= min+z->lowmem_reserve[classzone_idx]+z->pages_emerg) - return 0; - for (o = 0; o < order; o++) { - /* At the next order, this order's pages become unavailable */ -@@ -1946,7 +1948,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, - { - const gfp_t wait = gfp_mask & __GFP_WAIT; - struct page *page = NULL; -- int alloc_flags; -+ int alloc_flags = 0; - unsigned long pages_reclaimed = 0; - unsigned long did_some_progress; - struct task_struct *p = current; -@@ -2078,8 +2080,8 @@ rebalance: - nopage: - if (!(gfp_mask & __GFP_NOWARN) && printk_ratelimit()) { - printk(KERN_WARNING "%s: page allocation failure." -- " order:%d, mode:0x%x\n", -- p->comm, order, gfp_mask); -+ " order:%d, mode:0x%x, alloc_flags:0x%x, pflags:0x%x\n", -+ p->comm, order, gfp_mask, alloc_flags, p->flags); - dump_stack(); - show_mem(); - } -@@ -2414,9 +2416,9 @@ void show_free_areas(void) - "\n", - zone->name, - K(zone_page_state(zone, NR_FREE_PAGES)), -- K(min_wmark_pages(zone)), -- K(low_wmark_pages(zone)), -- K(high_wmark_pages(zone)), -+ K(zone->pages_emerg + min_wmark_pages(zone)), -+ K(zone->pages_emerg + low_wmark_pages(zone)), -+ K(zone->pages_emerg + high_wmark_pages(zone)), - K(zone_page_state(zone, NR_ACTIVE_ANON)), - K(zone_page_state(zone, NR_INACTIVE_ANON)), - K(zone_page_state(zone, NR_ACTIVE_FILE)), -@@ -4779,7 +4781,7 @@ static void calculate_totalreserve_pages(void) - } - - /* we treat the high watermark as reserved pages. */ -- max += high_wmark_pages(zone); -+ max += high_wmark_pages(zone) + zone->pages_emerg; - - if (max > zone->present_pages) - max = zone->present_pages; -@@ -4837,7 +4839,8 @@ static void setup_per_zone_lowmem_reserve(void) - */ - static void __setup_per_zone_wmarks(void) - { -- unsigned long pages_min = min_free_kbytes >> (PAGE_SHIFT - 10); -+ unsigned pages_min = min_free_kbytes >> (PAGE_SHIFT - 10); -+ unsigned pages_emerg = var_free_kbytes >> (PAGE_SHIFT - 10); - unsigned long lowmem_pages = 0; - struct zone *zone; - unsigned long flags; -@@ -4849,11 +4852,13 @@ static void __setup_per_zone_wmarks(void) - } - - for_each_zone(zone) { -- u64 tmp; -+ u64 tmp, tmp_emerg; - - spin_lock_irqsave(&zone->lock, flags); - tmp = (u64)pages_min * zone->present_pages; - do_div(tmp, lowmem_pages); -+ tmp_emerg = (u64)pages_emerg * zone->present_pages; -+ do_div(tmp_emerg, lowmem_pages); - if (is_highmem(zone)) { - /* - * __GFP_HIGH and PF_MEMALLOC allocations usually don't -@@ -4872,12 +4877,14 @@ static void __setup_per_zone_wmarks(void) - if (min_pages > 128) - min_pages = 128; - zone->watermark[WMARK_MIN] = min_pages; -+ zone->pages_emerg = 0; - } else { - /* - * If it's a lowmem zone, reserve a number of pages - * proportionate to the zone's size. - */ - zone->watermark[WMARK_MIN] = tmp; -+ zone->pages_emerg = tmp_emerg; - } - - zone->watermark[WMARK_LOW] = min_wmark_pages(zone) + (tmp >> 2); -@@ -4942,6 +4949,63 @@ void setup_per_zone_wmarks(void) - spin_unlock_irqrestore(&min_free_lock, flags); - } - -+static void __adjust_memalloc_reserve(int pages) -+{ -+ var_free_kbytes += pages << (PAGE_SHIFT - 10); -+ BUG_ON(var_free_kbytes < 0); -+ setup_per_zone_wmarks(); -+} -+ -+static int test_reserve_limits(void) -+{ -+ struct zone *zone; -+ int node; -+ -+ for_each_zone(zone) -+ wakeup_kswapd(zone, 0); -+ -+ for_each_online_node(node) { -+ struct page *page = alloc_pages_node(node, GFP_KERNEL, 0); -+ if (!page) -+ return -ENOMEM; -+ -+ __free_page(page); -+ } -+ -+ return 0; -+} -+ -+/** -+ * adjust_memalloc_reserve - adjust the memalloc reserve -+ * @pages: number of pages to add -+ * -+ * It adds a number of pages to the memalloc reserve; if -+ * the number was positive it kicks reclaim into action to -+ * satisfy the higher watermarks. -+ * -+ * returns -ENOMEM when it failed to satisfy the watermarks. -+ */ -+int adjust_memalloc_reserve(int pages) -+{ -+ int err = 0; -+ -+ mutex_lock(&var_free_mutex); -+ __adjust_memalloc_reserve(pages); -+ if (pages > 0) { -+ err = test_reserve_limits(); -+ if (err) { -+ __adjust_memalloc_reserve(-pages); -+ goto unlock; -+ } -+ } -+ printk(KERN_DEBUG "Emergency reserve: %d\n", var_free_kbytes); -+ -+unlock: -+ mutex_unlock(&var_free_mutex); -+ return err; -+} -+EXPORT_SYMBOL_GPL(adjust_memalloc_reserve); -+ - /* - * Initialise min_free_kbytes. - * -diff --git a/mm/vmstat.c b/mm/vmstat.c -index 15a14b1..af91d5c 100644 ---- a/mm/vmstat.c -+++ b/mm/vmstat.c -@@ -814,9 +814,9 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat, - "\n spanned %lu" - "\n present %lu", - zone_page_state(zone, NR_FREE_PAGES), -- min_wmark_pages(zone), -- low_wmark_pages(zone), -- high_wmark_pages(zone), -+ zone->pages_emerg + min_wmark_pages(zone), -+ zone->pages_emerg + min_wmark_pages(zone), -+ zone->pages_emerg + high_wmark_pages(zone), - zone->pages_scanned, - zone->spanned_pages, - zone->present_pages); --- -1.7.1.1 - --- -To unsubscribe, send a message with 'unsubscribe linux-mm' in -the body to majordomo@kvack.org. For more info on Linux MM, -see: http://www.linux-mm.org/ . -Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> diff --git a/a/content_digest b/N2/content_digest index 1a62e0f..4bc6321 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -16,239 +16,5 @@ " davem@davemloft.net\0" "\00:1\0" "b\0" - ">From 973ce2ee797025f055ccb61359180e53c3ecc681 Mon Sep 17 00:00:00 2001\n" - "From: Xiaotian Feng <dfeng@redhat.com>\n" - "Date: Tue, 13 Jul 2010 10:45:48 +0800\n" - "Subject: [PATCH 08/30] mm: emergency pool\n" - "\n" - "Provide means to reserve a specific amount of pages.\n" - "\n" - "The emergency pool is separated from the min watermark because ALLOC_HARDER\n" - "and ALLOC_HIGH modify the watermark in a relative way and thus do not ensure\n" - "a strict minimum.\n" - "\n" - "Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>\n" - "Signed-off-by: Suresh Jayaraman <sjayaraman@suse.de>\n" - "Signed-off-by: Xiaotian Feng <dfeng@redhat.com>\n" - "---\n" - " include/linux/mmzone.h | 3 ++\n" - " mm/page_alloc.c | 84 ++++++++++++++++++++++++++++++++++++++++++------\n" - " mm/vmstat.c | 6 ++--\n" - " 3 files changed, 80 insertions(+), 13 deletions(-)\n" - "\n" - "diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h\n" - "index 9ed9c45..75a0871 100644\n" - "--- a/include/linux/mmzone.h\n" - "+++ b/include/linux/mmzone.h\n" - "@@ -279,6 +279,7 @@ struct zone_reclaim_stat {\n" - " \n" - " struct zone {\n" - " \t/* Fields commonly accessed by the page allocator */\n" - "+\tunsigned long pages_emerg; /* emergency pool */\n" - " \n" - " \t/* zone watermarks, access with *_wmark_pages(zone) macros */\n" - " \tunsigned long watermark[NR_WMARK];\n" - "@@ -770,6 +771,8 @@ int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *, int,\n" - " int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *, int,\n" - " \t\t\tvoid __user *, size_t *, loff_t *);\n" - " \n" - "+int adjust_memalloc_reserve(int pages);\n" - "+\n" - " extern int numa_zonelist_order_handler(struct ctl_table *, int,\n" - " \t\t\tvoid __user *, size_t *, loff_t *);\n" - " extern char numa_zonelist_order[];\n" - "diff --git a/mm/page_alloc.c b/mm/page_alloc.c\n" - "index 4b1fa10..6c85e9e 100644\n" - "--- a/mm/page_alloc.c\n" - "+++ b/mm/page_alloc.c\n" - "@@ -167,6 +167,8 @@ static char * const zone_names[MAX_NR_ZONES] = {\n" - " \n" - " static DEFINE_SPINLOCK(min_free_lock);\n" - " int min_free_kbytes = 1024;\n" - "+static DEFINE_MUTEX(var_free_mutex);\n" - "+int var_free_kbytes;\n" - " \n" - " static unsigned long __meminitdata nr_kernel_pages;\n" - " static unsigned long __meminitdata nr_all_pages;\n" - "@@ -1457,7 +1459,7 @@ int zone_watermark_ok(struct zone *z, int order, unsigned long mark,\n" - " \tif (alloc_flags & ALLOC_HARDER)\n" - " \t\tmin -= min / 4;\n" - " \n" - "-\tif (free_pages <= min + z->lowmem_reserve[classzone_idx])\n" - "+\tif (free_pages <= min+z->lowmem_reserve[classzone_idx]+z->pages_emerg)\n" - " \t\treturn 0;\n" - " \tfor (o = 0; o < order; o++) {\n" - " \t\t/* At the next order, this order's pages become unavailable */\n" - "@@ -1946,7 +1948,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,\n" - " {\n" - " \tconst gfp_t wait = gfp_mask & __GFP_WAIT;\n" - " \tstruct page *page = NULL;\n" - "-\tint alloc_flags;\n" - "+\tint alloc_flags = 0;\n" - " \tunsigned long pages_reclaimed = 0;\n" - " \tunsigned long did_some_progress;\n" - " \tstruct task_struct *p = current;\n" - "@@ -2078,8 +2080,8 @@ rebalance:\n" - " nopage:\n" - " \tif (!(gfp_mask & __GFP_NOWARN) && printk_ratelimit()) {\n" - " \t\tprintk(KERN_WARNING \"%s: page allocation failure.\"\n" - "-\t\t\t\" order:%d, mode:0x%x\\n\",\n" - "-\t\t\tp->comm, order, gfp_mask);\n" - "+\t\t\t\" order:%d, mode:0x%x, alloc_flags:0x%x, pflags:0x%x\\n\",\n" - "+\t\t\tp->comm, order, gfp_mask, alloc_flags, p->flags);\n" - " \t\tdump_stack();\n" - " \t\tshow_mem();\n" - " \t}\n" - "@@ -2414,9 +2416,9 @@ void show_free_areas(void)\n" - " \t\t\t\"\\n\",\n" - " \t\t\tzone->name,\n" - " \t\t\tK(zone_page_state(zone, NR_FREE_PAGES)),\n" - "-\t\t\tK(min_wmark_pages(zone)),\n" - "-\t\t\tK(low_wmark_pages(zone)),\n" - "-\t\t\tK(high_wmark_pages(zone)),\n" - "+\t\t\tK(zone->pages_emerg + min_wmark_pages(zone)),\n" - "+\t\t\tK(zone->pages_emerg + low_wmark_pages(zone)),\n" - "+\t\t\tK(zone->pages_emerg + high_wmark_pages(zone)),\n" - " \t\t\tK(zone_page_state(zone, NR_ACTIVE_ANON)),\n" - " \t\t\tK(zone_page_state(zone, NR_INACTIVE_ANON)),\n" - " \t\t\tK(zone_page_state(zone, NR_ACTIVE_FILE)),\n" - "@@ -4779,7 +4781,7 @@ static void calculate_totalreserve_pages(void)\n" - " \t\t\t}\n" - " \n" - " \t\t\t/* we treat the high watermark as reserved pages. */\n" - "-\t\t\tmax += high_wmark_pages(zone);\n" - "+\t\t\tmax += high_wmark_pages(zone) + zone->pages_emerg;\n" - " \n" - " \t\t\tif (max > zone->present_pages)\n" - " \t\t\t\tmax = zone->present_pages;\n" - "@@ -4837,7 +4839,8 @@ static void setup_per_zone_lowmem_reserve(void)\n" - " */\n" - " static void __setup_per_zone_wmarks(void)\n" - " {\n" - "-\tunsigned long pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);\n" - "+\tunsigned pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);\n" - "+\tunsigned pages_emerg = var_free_kbytes >> (PAGE_SHIFT - 10);\n" - " \tunsigned long lowmem_pages = 0;\n" - " \tstruct zone *zone;\n" - " \tunsigned long flags;\n" - "@@ -4849,11 +4852,13 @@ static void __setup_per_zone_wmarks(void)\n" - " \t}\n" - " \n" - " \tfor_each_zone(zone) {\n" - "-\t\tu64 tmp;\n" - "+\t\tu64 tmp, tmp_emerg;\n" - " \n" - " \t\tspin_lock_irqsave(&zone->lock, flags);\n" - " \t\ttmp = (u64)pages_min * zone->present_pages;\n" - " \t\tdo_div(tmp, lowmem_pages);\n" - "+\t\ttmp_emerg = (u64)pages_emerg * zone->present_pages;\n" - "+\t\tdo_div(tmp_emerg, lowmem_pages);\n" - " \t\tif (is_highmem(zone)) {\n" - " \t\t\t/*\n" - " \t\t\t * __GFP_HIGH and PF_MEMALLOC allocations usually don't\n" - "@@ -4872,12 +4877,14 @@ static void __setup_per_zone_wmarks(void)\n" - " \t\t\tif (min_pages > 128)\n" - " \t\t\t\tmin_pages = 128;\n" - " \t\t\tzone->watermark[WMARK_MIN] = min_pages;\n" - "+\t\t\tzone->pages_emerg = 0;\n" - " \t\t} else {\n" - " \t\t\t/*\n" - " \t\t\t * If it's a lowmem zone, reserve a number of pages\n" - " \t\t\t * proportionate to the zone's size.\n" - " \t\t\t */\n" - " \t\t\tzone->watermark[WMARK_MIN] = tmp;\n" - "+\t\t\tzone->pages_emerg = tmp_emerg;\n" - " \t\t}\n" - " \n" - " \t\tzone->watermark[WMARK_LOW] = min_wmark_pages(zone) + (tmp >> 2);\n" - "@@ -4942,6 +4949,63 @@ void setup_per_zone_wmarks(void)\n" - " \tspin_unlock_irqrestore(&min_free_lock, flags);\n" - " }\n" - " \n" - "+static void __adjust_memalloc_reserve(int pages)\n" - "+{\n" - "+\tvar_free_kbytes += pages << (PAGE_SHIFT - 10);\n" - "+\tBUG_ON(var_free_kbytes < 0);\n" - "+\tsetup_per_zone_wmarks();\n" - "+}\n" - "+\n" - "+static int test_reserve_limits(void)\n" - "+{\n" - "+\tstruct zone *zone;\n" - "+\tint node;\n" - "+\n" - "+\tfor_each_zone(zone)\n" - "+\t\twakeup_kswapd(zone, 0);\n" - "+\n" - "+\tfor_each_online_node(node) {\n" - "+\t\tstruct page *page = alloc_pages_node(node, GFP_KERNEL, 0);\n" - "+\t\tif (!page)\n" - "+\t\t\treturn -ENOMEM;\n" - "+\n" - "+\t\t__free_page(page);\n" - "+\t}\n" - "+\n" - "+\treturn 0;\n" - "+}\n" - "+\n" - "+/**\n" - "+ *\tadjust_memalloc_reserve - adjust the memalloc reserve\n" - "+ *\t@pages: number of pages to add\n" - "+ *\n" - "+ *\tIt adds a number of pages to the memalloc reserve; if\n" - "+ *\tthe number was positive it kicks reclaim into action to\n" - "+ *\tsatisfy the higher watermarks.\n" - "+ *\n" - "+ *\treturns -ENOMEM when it failed to satisfy the watermarks.\n" - "+ */\n" - "+int adjust_memalloc_reserve(int pages)\n" - "+{\n" - "+\tint err = 0;\n" - "+\n" - "+\tmutex_lock(&var_free_mutex);\n" - "+\t__adjust_memalloc_reserve(pages);\n" - "+\tif (pages > 0) {\n" - "+\t\terr = test_reserve_limits();\n" - "+\t\tif (err) {\n" - "+\t\t\t__adjust_memalloc_reserve(-pages);\n" - "+\t\t\tgoto unlock;\n" - "+\t\t}\n" - "+\t}\n" - "+\tprintk(KERN_DEBUG \"Emergency reserve: %d\\n\", var_free_kbytes);\n" - "+\n" - "+unlock:\n" - "+\tmutex_unlock(&var_free_mutex);\n" - "+\treturn err;\n" - "+}\n" - "+EXPORT_SYMBOL_GPL(adjust_memalloc_reserve);\n" - "+\n" - " /*\n" - " * Initialise min_free_kbytes.\n" - " *\n" - "diff --git a/mm/vmstat.c b/mm/vmstat.c\n" - "index 15a14b1..af91d5c 100644\n" - "--- a/mm/vmstat.c\n" - "+++ b/mm/vmstat.c\n" - "@@ -814,9 +814,9 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat,\n" - " \t\t \"\\n spanned %lu\"\n" - " \t\t \"\\n present %lu\",\n" - " \t\t zone_page_state(zone, NR_FREE_PAGES),\n" - "-\t\t min_wmark_pages(zone),\n" - "-\t\t low_wmark_pages(zone),\n" - "-\t\t high_wmark_pages(zone),\n" - "+\t\t zone->pages_emerg + min_wmark_pages(zone),\n" - "+\t\t zone->pages_emerg + min_wmark_pages(zone),\n" - "+\t\t zone->pages_emerg + high_wmark_pages(zone),\n" - " \t\t zone->pages_scanned,\n" - " \t\t zone->spanned_pages,\n" - " \t\t zone->present_pages);\n" - "-- \n" - "1.7.1.1\n" - "\n" - "--\n" - "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" - "the body to majordomo@kvack.org. For more info on Linux MM,\n" - "see: http://www.linux-mm.org/ .\n" - "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" -8a0001de3ead934d16df99a70cacf98eee27963573c98ec91f4a97972da72883 +35800e93966bf70effdf01042ee34411b2adc8c8483d095f6bb6ff773b3600bc
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.