linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH] Subtract min_free_kbytes from dirtyable memory
@ 2013-01-25  9:53 paul.szabo
  2013-01-25 13:01 ` Bug#695182: " Ben Hutchings
  2013-01-28  6:23 ` Minchan Kim
  0 siblings, 2 replies; 12+ messages in thread
From: paul.szabo @ 2013-01-25  9:53 UTC (permalink / raw)
  To: minchan, psz; +Cc: 695182, linux-kernel, linux-mm

Dear Minchan,

> So what's the effect for user?
> ...
> It seems you saw old kernel.
> ...
> Current kernel includes ...
> So I think we don't need this patch.

As I understand now, my patch is "right" and needed for older kernels;
for newer kernels, the issue has been fixed in equivalent ways; it was
an oversight that the change was not backported; and any justification
you need, you can get from those "later better" patches.

I asked:

  A question: what is the use or significance of vm_highmem_is_dirtyable?
  It seems odd that it would be used in setting limits or threshholds, but
  not used in decisions where to put dirty things. Is that so, is that as
  should be? What is the recommended setting of highmem_is_dirtyable?

The silence is deafening. I guess highmem_is_dirtyable is an aberration.

Thanks, Paul

Paul Szabo   psz@maths.usyd.edu.au   http://www.maths.usyd.edu.au/u/psz/
School of Mathematics and Statistics   University of Sydney    Australia

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Bug#695182: [PATCH] Subtract min_free_kbytes from dirtyable memory
  2013-01-25  9:53 [PATCH] Subtract min_free_kbytes from dirtyable memory paul.szabo
@ 2013-01-25 13:01 ` Ben Hutchings
  2013-01-25 23:49   ` paul.szabo
  2013-01-26  7:44   ` Bug#695182: " Jonathan Nieder
  2013-01-28  6:23 ` Minchan Kim
  1 sibling, 2 replies; 12+ messages in thread
From: Ben Hutchings @ 2013-01-25 13:01 UTC (permalink / raw)
  To: paul.szabo, 695182; +Cc: minchan, psz, linux-kernel, linux-mm

[-- Attachment #1: Type: text/plain, Size: 875 bytes --]

On Fri, 2013-01-25 at 20:53 +1100, paul.szabo@sydney.edu.au wrote:
> Dear Minchan,
> 
> > So what's the effect for user?
> > ...
> > It seems you saw old kernel.
> > ...
> > Current kernel includes ...
> > So I think we don't need this patch.
> 
> As I understand now, my patch is "right" and needed for older kernels;
> for newer kernels, the issue has been fixed in equivalent ways; it was
> an oversight that the change was not backported; and any justification
> you need, you can get from those "later better" patches.
[...]

If you can identify where it was fixed then your patch for older
versions should go to stable with a reference to the upstream fix (see
Documentation/stable_kernel_rules.txt).

Ben.

-- 
Ben Hutchings
Q.  Which is the greater problem in the world today, ignorance or apathy?
A.  I don't know and I couldn't care less.

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Bug#695182: [PATCH] Subtract min_free_kbytes from dirtyable memory
  2013-01-25 13:01 ` Bug#695182: " Ben Hutchings
@ 2013-01-25 23:49   ` paul.szabo
  2013-01-26  0:10     ` Ben Hutchings
  2013-01-26  0:14     ` Jonathan Nieder
  2013-01-26  7:44   ` Bug#695182: " Jonathan Nieder
  1 sibling, 2 replies; 12+ messages in thread
From: paul.szabo @ 2013-01-25 23:49 UTC (permalink / raw)
  To: 695182, ben; +Cc: linux-kernel, linux-mm, minchan

Dear Ben,

> If you can identify where it was fixed then ...

Sorry I cannot do that. I have no idea where kernel changelogs are kept.

I am happy to do some work. Please do not call me lazy.

Cheers, Paul

Paul Szabo   psz@maths.usyd.edu.au   http://www.maths.usyd.edu.au/u/psz/
School of Mathematics and Statistics   University of Sydney    Australia

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Bug#695182: [PATCH] Subtract min_free_kbytes from dirtyable memory
  2013-01-25 23:49   ` paul.szabo
@ 2013-01-26  0:10     ` Ben Hutchings
  2013-01-26  3:05       ` paul.szabo
  2013-01-26  3:07       ` paul.szabo
  2013-01-26  0:14     ` Jonathan Nieder
  1 sibling, 2 replies; 12+ messages in thread
From: Ben Hutchings @ 2013-01-26  0:10 UTC (permalink / raw)
  To: paul.szabo; +Cc: 695182, linux-kernel, linux-mm, minchan

[-- Attachment #1: Type: text/plain, Size: 529 bytes --]

On Sat, 2013-01-26 at 10:49 +1100, paul.szabo@sydney.edu.au wrote:
> Dear Ben,
> 
> > If you can identify where it was fixed then ...
> 
> Sorry I cannot do that. I have no idea where kernel changelogs are kept.
> 
> I am happy to do some work. Please do not call me lazy.

The changelogs are in git repositories.  But the mm maintainers are
probably much better placed to identify which was the upstream fix.

Ben.

-- 
Ben Hutchings
Any smoothly functioning technology is indistinguishable from a rigged demo.

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Subtract min_free_kbytes from dirtyable memory
  2013-01-25 23:49   ` paul.szabo
  2013-01-26  0:10     ` Ben Hutchings
@ 2013-01-26  0:14     ` Jonathan Nieder
  2013-01-26 15:43       ` Theodore Ts'o
  1 sibling, 1 reply; 12+ messages in thread
From: Jonathan Nieder @ 2013-01-26  0:14 UTC (permalink / raw)
  To: paul.szabo; +Cc: 695182, ben, linux-kernel, linux-mm, minchan

Hi Paul,

paul.szabo@sydney.edu.au wrote:
> Dear Ben,

>> If you can identify where it was fixed then ...
>
> Sorry I cannot do that. I have no idea where kernel changelogs are kept.

Here are some tools.

  # prerequisite:
  apt-get install git; # as root

  # to get the kernel history:
  git clone \
    https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux.git
  cd linux

  # to view the changelog:
  git log v3.2..

  # to grep change descriptions:
  git log --grep=min_free_kbytes v3.2..

  # to view the patches corresponding to changes:
  git log --patch v3.2.. -- mm/

  # graphical interface
  apt-get install gitk; # as root
  gitk v3.2.. -- mm

  # web interface:
  w3m http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git

The "exploring git history" section of the git user manual has more
details:

  http://git-htmldocs.googlecode.com/git/user-manual.html#exploring-git-history

Thanks,
Jonathan

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Bug#695182: [PATCH] Subtract min_free_kbytes from dirtyable memory
  2013-01-26  0:10     ` Ben Hutchings
@ 2013-01-26  3:05       ` paul.szabo
  2013-01-26  3:07       ` paul.szabo
  1 sibling, 0 replies; 12+ messages in thread
From: paul.szabo @ 2013-01-26  3:05 UTC (permalink / raw)
  To: ben; +Cc: 695182, linux-kernel, linux-mm, minchan



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Bug#695182: [PATCH] Subtract min_free_kbytes from dirtyable memory
  2013-01-26  0:10     ` Ben Hutchings
  2013-01-26  3:05       ` paul.szabo
@ 2013-01-26  3:07       ` paul.szabo
  2013-01-26  3:17         ` Ben Hutchings
  1 sibling, 1 reply; 12+ messages in thread
From: paul.szabo @ 2013-01-26  3:07 UTC (permalink / raw)
  To: ben; +Cc: 695182, linux-kernel, linux-mm, minchan

Dear Ben,

> ... the mm maintainers are probably much better placed ...

Exactly. Now I wonder: are you one of them?

Thanks, Paul

Paul Szabo   psz@maths.usyd.edu.au   http://www.maths.usyd.edu.au/u/psz/
School of Mathematics and Statistics   University of Sydney    Australia

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Bug#695182: [PATCH] Subtract min_free_kbytes from dirtyable memory
  2013-01-26  3:07       ` paul.szabo
@ 2013-01-26  3:17         ` Ben Hutchings
  0 siblings, 0 replies; 12+ messages in thread
From: Ben Hutchings @ 2013-01-26  3:17 UTC (permalink / raw)
  To: paul.szabo; +Cc: 695182, linux-kernel, linux-mm, minchan

[-- Attachment #1: Type: text/plain, Size: 320 bytes --]

On Sat, 2013-01-26 at 14:07 +1100, paul.szabo@sydney.edu.au wrote:
> Dear Ben,
> 
> > ... the mm maintainers are probably much better placed ...
> 
> Exactly. Now I wonder: are you one of them?

Hah, no.

Ben.

-- 
Ben Hutchings
Any smoothly functioning technology is indistinguishable from a rigged demo.

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Bug#695182: [PATCH] Subtract min_free_kbytes from dirtyable memory
  2013-01-25 13:01 ` Bug#695182: " Ben Hutchings
  2013-01-25 23:49   ` paul.szabo
@ 2013-01-26  7:44   ` Jonathan Nieder
  2013-01-26 20:23     ` paul.szabo
  1 sibling, 1 reply; 12+ messages in thread
From: Jonathan Nieder @ 2013-01-26  7:44 UTC (permalink / raw)
  To: paul.szabo; +Cc: Ben Hutchings, 695182, minchan, psz, linux-kernel, linux-mm

Hi Paul,

Ben Hutchings wrote:

> If you can identify where it was fixed then your patch for older
> versions should go to stable with a reference to the upstream fix (see
> Documentation/stable_kernel_rules.txt).

How about this patch?

It was applied in mainline during the 3.3 merge window, so kernels
newer than 3.2.y shouldn't need it.

-- >8 --
From: Johannes Weiner <jweiner@redhat.com>
Date: Tue, 10 Jan 2012 15:07:42 -0800
Subject: mm: exclude reserved pages from dirtyable memory

commit ab8fabd46f811d5153d8a0cd2fac9a0d41fb593d upstream.

Per-zone dirty limits try to distribute page cache pages allocated for
writing across zones in proportion to the individual zone sizes, to reduce
the likelihood of reclaim having to write back individual pages from the
LRU lists in order to make progress.

This patch:

The amount of dirtyable pages should not include the full number of free
pages: there is a number of reserved pages that the page allocator and
kswapd always try to keep free.

The closer (reclaimable pages - dirty pages) is to the number of reserved
pages, the more likely it becomes for reclaim to run into dirty pages:

       +----------+ ---
       |   anon   |  |
       +----------+  |
       |          |  |
       |          |  -- dirty limit new    -- flusher new
       |   file   |  |                     |
       |          |  |                     |
       |          |  -- dirty limit old    -- flusher old
       |          |                        |
       +----------+                       --- reclaim
       | reserved |
       +----------+
       |  kernel  |
       +----------+

This patch introduces a per-zone dirty reserve that takes both the lowmem
reserve as well as the high watermark of the zone into account, and a
global sum of those per-zone values that is subtracted from the global
amount of dirtyable pages.  The lowmem reserve is unavailable to page
cache allocations and kswapd tries to keep the high watermark free.  We
don't want to end up in a situation where reclaim has to clean pages in
order to balance zones.

Not treating reserved pages as dirtyable on a global level is only a
conceptual fix.  In reality, dirty pages are not distributed equally
across zones and reclaim runs into dirty pages on a regular basis.

But it is important to get this right before tackling the problem on a
per-zone level, where the distance between reclaim and the dirty pages is
mostly much smaller in absolute numbers.

[akpm@linux-foundation.org: fix highmem build]
Signed-off-by: Johannes Weiner <jweiner@redhat.com>
Reviewed-by: Rik van Riel <riel@redhat.com>
Reviewed-by: Michal Hocko <mhocko@suse.cz>
Reviewed-by: Minchan Kim <minchan.kim@gmail.com>
Acked-by: Mel Gorman <mgorman@suse.de>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Wu Fengguang <fengguang.wu@intel.com>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Shaohua Li <shaohua.li@intel.com>
Cc: Chris Mason <chris.mason@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 include/linux/mmzone.h |  6 ++++++
 include/linux/swap.h   |  1 +
 mm/page-writeback.c    |  5 +++--
 mm/page_alloc.c        | 19 +++++++++++++++++++
 4 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 25842b6e72e1..a594af3278bc 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -319,6 +319,12 @@ struct zone {
 	 */
 	unsigned long		lowmem_reserve[MAX_NR_ZONES];
 
+	/*
+	 * This is a per-zone reserve of pages that should not be
+	 * considered dirtyable memory.
+	 */
+	unsigned long		dirty_balance_reserve;
+
 #ifdef CONFIG_NUMA
 	int node;
 	/*
diff --git a/include/linux/swap.h b/include/linux/swap.h
index 67b3fa308988..3e60228e7299 100644
--- a/include/linux/swap.h
+++ b/include/linux/swap.h
@@ -207,6 +207,7 @@ struct swap_list_t {
 /* linux/mm/page_alloc.c */
 extern unsigned long totalram_pages;
 extern unsigned long totalreserve_pages;
+extern unsigned long dirty_balance_reserve;
 extern unsigned int nr_free_buffer_pages(void);
 extern unsigned int nr_free_pagecache_pages(void);
 
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 50f08241f981..f620e7b0dc26 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -320,7 +320,7 @@ static unsigned long highmem_dirtyable_memory(unsigned long total)
 			&NODE_DATA(node)->node_zones[ZONE_HIGHMEM];
 
 		x += zone_page_state(z, NR_FREE_PAGES) +
-		     zone_reclaimable_pages(z);
+		     zone_reclaimable_pages(z) - z->dirty_balance_reserve;
 	}
 	/*
 	 * Make sure that the number of highmem pages is never larger
@@ -344,7 +344,8 @@ unsigned long determine_dirtyable_memory(void)
 {
 	unsigned long x;
 
-	x = global_page_state(NR_FREE_PAGES) + global_reclaimable_pages();
+	x = global_page_state(NR_FREE_PAGES) + global_reclaimable_pages() -
+	    dirty_balance_reserve;
 
 	if (!vm_highmem_is_dirtyable)
 		x -= highmem_dirtyable_memory(x);
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index a88dded37411..e077fa751a9a 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -96,6 +96,14 @@ EXPORT_SYMBOL(node_states);
 
 unsigned long totalram_pages __read_mostly;
 unsigned long totalreserve_pages __read_mostly;
+/*
+ * When calculating the number of globally allowed dirty pages, there
+ * is a certain number of per-zone reserves that should not be
+ * considered dirtyable memory.  This is the sum of those reserves
+ * over all existing zones that contribute dirtyable memory.
+ */
+unsigned long dirty_balance_reserve __read_mostly;
+
 int percpu_pagelist_fraction;
 gfp_t gfp_allowed_mask __read_mostly = GFP_BOOT_MASK;
 
@@ -5125,8 +5133,19 @@ static void calculate_totalreserve_pages(void)
 			if (max > zone->present_pages)
 				max = zone->present_pages;
 			reserve_pages += max;
+			/*
+			 * Lowmem reserves are not available to
+			 * GFP_HIGHUSER page cache allocations and
+			 * kswapd tries to balance zones to their high
+			 * watermark.  As a result, neither should be
+			 * regarded as dirtyable memory, to prevent a
+			 * situation where reclaim has to clean pages
+			 * in order to balance the zones.
+			 */
+			zone->dirty_balance_reserve = max;
 		}
 	}
+	dirty_balance_reserve = reserve_pages;
 	totalreserve_pages = reserve_pages;
 }
 
-- 
1.8.1.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH] Subtract min_free_kbytes from dirtyable memory
  2013-01-26  0:14     ` Jonathan Nieder
@ 2013-01-26 15:43       ` Theodore Ts'o
  0 siblings, 0 replies; 12+ messages in thread
From: Theodore Ts'o @ 2013-01-26 15:43 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: paul.szabo, 695182, ben, linux-kernel, linux-mm, minchan

(In the teach a person to fish category...)

If you know the file and line number where a bug/regression was
introduced, the "git blame" command is a great tool for identifying
the commit which changed a given line of code.  Then use "git tag
--contains <commit it>" to see when a particular commit was introduced
into the mainline kernel.

					- Ted

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: Bug#695182: [PATCH] Subtract min_free_kbytes from dirtyable memory
  2013-01-26  7:44   ` Bug#695182: " Jonathan Nieder
@ 2013-01-26 20:23     ` paul.szabo
  0 siblings, 0 replies; 12+ messages in thread
From: paul.szabo @ 2013-01-26 20:23 UTC (permalink / raw)
  To: jrnieder; +Cc: 695182, ben, linux-kernel, linux-mm, minchan

Dear Jonathan,

>> If you can identify where it was fixed then your patch for older
>> versions should go to stable with a reference to the upstream fix (see
>> Documentation/stable_kernel_rules.txt).
>
> How about this patch?
>
> It was applied in mainline during the 3.3 merge window, so kernels
> newer than 3.2.y shouldn't need it.
>
> ...
> commit ab8fabd46f811d5153d8a0cd2fac9a0d41fb593d upstream.
> ...

Yes, I beleive that is the correct patch, surely better than my simple
subtraction of min_free_kbytes.

Noting, that this does not "solve" all problems, the latest 3.8 kernel
still crashes with OOM:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1098961/comments/18

Thanks, Paul

Paul Szabo   psz@maths.usyd.edu.au   http://www.maths.usyd.edu.au/u/psz/
School of Mathematics and Statistics   University of Sydney    Australia

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Subtract min_free_kbytes from dirtyable memory
  2013-01-25  9:53 [PATCH] Subtract min_free_kbytes from dirtyable memory paul.szabo
  2013-01-25 13:01 ` Bug#695182: " Ben Hutchings
@ 2013-01-28  6:23 ` Minchan Kim
  1 sibling, 0 replies; 12+ messages in thread
From: Minchan Kim @ 2013-01-28  6:23 UTC (permalink / raw)
  To: paul.szabo; +Cc: psz, 695182, linux-kernel, linux-mm

On Fri, Jan 25, 2013 at 08:53:24PM +1100, paul.szabo@sydney.edu.au wrote:
> Dear Minchan,
> 
> > So what's the effect for user?
> > ...
> > It seems you saw old kernel.
> > ...
> > Current kernel includes ...
> > So I think we don't need this patch.
> 
> As I understand now, my patch is "right" and needed for older kernels;
> for newer kernels, the issue has been fixed in equivalent ways; it was
> an oversight that the change was not backported; and any justification
> you need, you can get from those "later better" patches.

I don't know your problem because you didn't write down your problem in
changelog. Anyway, If you want to apply it into older kernel,
please read Documentation/stable_kernel_rules.txt.

In summary,

1. Define your problem.
2. Apply your fix to see the problem goes away in older kernel.
3. If so, write the problem and effect in changelog
4. Send it to stable maintainers and mm maintainer

That's all.

> 
> I asked:
> 
>   A question: what is the use or significance of vm_highmem_is_dirtyable?
>   It seems odd that it would be used in setting limits or threshholds, but
>   not used in decisions where to put dirty things. Is that so, is that as
>   should be? What is the recommended setting of highmem_is_dirtyable?
> 
> The silence is deafening. I guess highmem_is_dirtyable is an aberration.

I hope this helps you find primary reason of your problem.
git show 195cf453


> 
> Thanks, Paul
> 
> Paul Szabo   psz@maths.usyd.edu.au   http://www.maths.usyd.edu.au/u/psz/
> School of Mathematics and Statistics   University of Sydney    Australia
> 
> --
> 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>

-- 
Kind regards,
Minchan Kim

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2013-01-28  6:23 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-01-25  9:53 [PATCH] Subtract min_free_kbytes from dirtyable memory paul.szabo
2013-01-25 13:01 ` Bug#695182: " Ben Hutchings
2013-01-25 23:49   ` paul.szabo
2013-01-26  0:10     ` Ben Hutchings
2013-01-26  3:05       ` paul.szabo
2013-01-26  3:07       ` paul.szabo
2013-01-26  3:17         ` Ben Hutchings
2013-01-26  0:14     ` Jonathan Nieder
2013-01-26 15:43       ` Theodore Ts'o
2013-01-26  7:44   ` Bug#695182: " Jonathan Nieder
2013-01-26 20:23     ` paul.szabo
2013-01-28  6:23 ` Minchan Kim

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).