From: Andrew Morton <akpm@linux-foundation.org>
To: Mikulas Patocka <mpatocka@redhat.com>
Cc: linux-kernel@vger.kernel.org, linux-mm@vger.kernel.org,
agk@redhat.com, mbroz@redhat.com, chris@arachsys.com
Subject: Re: [PATCH 2/3] Memory management livelock
Date: Wed, 1 Oct 2008 22:54:04 -0700 [thread overview]
Message-ID: <20081001225404.4e973465.akpm@linux-foundation.org> (raw)
In-Reply-To: <Pine.LNX.4.64.0809241451320.18811@hs20-bc2-1.build.redhat.com>
> Subject: [PATCH 2/3] Memory management livelock
Please don't send multiple patches with identical titles - think up a
good, unique, meaningful title for each patch.
On Wed, 24 Sep 2008 14:52:18 -0400 (EDT) Mikulas Patocka <mpatocka@redhat.com> wrote:
> Avoid starvation when walking address space.
>
> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
>
Please include a full changelog with each iteration of each patch.
That changelog should explain the reason for playing games with
bitlocks so Linus doesn't have kittens when he sees it.
> include/linux/pagemap.h | 1 +
> mm/filemap.c | 20 ++++++++++++++++++++
> mm/page-writeback.c | 37 ++++++++++++++++++++++++++++++++++++-
> mm/truncate.c | 24 +++++++++++++++++++++++-
> 4 files changed, 80 insertions(+), 2 deletions(-)
>
> Index: linux-2.6.27-rc7-devel/include/linux/pagemap.h
> ===================================================================
> --- linux-2.6.27-rc7-devel.orig/include/linux/pagemap.h 2008-09-24 02:57:37.000000000 +0200
> +++ linux-2.6.27-rc7-devel/include/linux/pagemap.h 2008-09-24 02:59:04.000000000 +0200
> @@ -21,6 +21,7 @@
> #define AS_EIO (__GFP_BITS_SHIFT + 0) /* IO error on async write */
> #define AS_ENOSPC (__GFP_BITS_SHIFT + 1) /* ENOSPC on async write */
> #define AS_MM_ALL_LOCKS (__GFP_BITS_SHIFT + 2) /* under mm_take_all_locks() */
> +#define AS_STARVATION (__GFP_BITS_SHIFT + 3) /* an anti-starvation barrier */
>
> static inline void mapping_set_error(struct address_space *mapping, int error)
> {
> Index: linux-2.6.27-rc7-devel/mm/filemap.c
> ===================================================================
> --- linux-2.6.27-rc7-devel.orig/mm/filemap.c 2008-09-24 02:59:33.000000000 +0200
> +++ linux-2.6.27-rc7-devel/mm/filemap.c 2008-09-24 03:13:47.000000000 +0200
> @@ -269,10 +269,19 @@ int wait_on_page_writeback_range(struct
> int nr_pages;
> int ret = 0;
> pgoff_t index;
> + long pages_to_process;
>
> if (end < start)
> return 0;
>
> + /*
> + * Estimate the number of pages to process. If we process significantly
> + * more than this, someone is making writeback pages under us.
> + * We must pull the anti-starvation plug.
> + */
> + pages_to_process = bdi_stat(mapping->backing_dev_info, BDI_WRITEBACK);
> + pages_to_process += (pages_to_process >> 3) + 16;
This sequence appears twice and it would probably be clearer to
implement it in a well-commented function.
> pagevec_init(&pvec, 0);
> index = start;
> while ((index <= end) &&
> @@ -288,6 +297,10 @@ int wait_on_page_writeback_range(struct
> if (page->index > end)
> continue;
>
> + if (pages_to_process >= 0)
> + if (!pages_to_process--)
> + wait_on_bit_lock(&mapping->flags, AS_STARVATION, wait_action_schedule, TASK_UNINTERRUPTIBLE);
This is copied three times and perhaps also should be factored out.
Please note that an effort has been made to make mm/filemap.c look
presentable in an 80-col display.
> wait_on_page_writeback(page);
> if (PageError(page))
> ret = -EIO;
> @@ -296,6 +309,13 @@ int wait_on_page_writeback_range(struct
> cond_resched();
> }
>
> + if (pages_to_process < 0) {
> + smp_mb__before_clear_bit();
> + clear_bit(AS_STARVATION, &mapping->flags);
> + smp_mb__after_clear_bit();
> + wake_up_bit(&mapping->flags, AS_STARVATION);
> + }
This sequence is repeated three or four times and should be pulled out
into a well-commented function. That comment should explain the logic
behind the use of these barriers, please.
next prev parent reply other threads:[~2008-10-02 5:55 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20080911101616.GA24064@agk.fab.redhat.com>
2008-09-22 21:10 ` [PATCH] Memory management livelock Mikulas Patocka
2008-09-23 0:48 ` Andrew Morton
2008-09-23 22:34 ` Mikulas Patocka
2008-09-23 22:49 ` Andrew Morton
2008-09-23 23:11 ` Mikulas Patocka
2008-09-23 23:46 ` Andrew Morton
2008-09-24 18:50 ` Mikulas Patocka
2008-09-24 18:51 ` [PATCH 1/3] " Mikulas Patocka
2008-09-24 18:52 ` [PATCH 2/3] " Mikulas Patocka
2008-10-02 5:54 ` Andrew Morton [this message]
2008-10-05 22:11 ` RFC: one-bit mutexes (was: Re: [PATCH 2/3] Memory management livelock) Mikulas Patocka
2008-10-11 12:06 ` Nick Piggin
2008-10-20 20:14 ` Mikulas Patocka
2008-10-21 1:51 ` Nick Piggin
2008-10-05 22:14 ` [PATCH 1/3] bit mutexes Mikulas Patocka
2008-10-05 22:14 ` [PATCH 2/3] Fix fsync livelock Mikulas Patocka
2008-10-05 22:33 ` Arjan van de Ven
2008-10-05 23:02 ` Mikulas Patocka
2008-10-05 23:07 ` Arjan van de Ven
2008-10-05 23:18 ` Mikulas Patocka
2008-10-05 23:28 ` Arjan van de Ven
2008-10-06 0:01 ` Mikulas Patocka
2008-10-06 0:30 ` Arjan van de Ven
2008-10-06 3:30 ` Mikulas Patocka
2008-10-06 4:20 ` Arjan van de Ven
2008-10-06 13:00 ` Mikulas Patocka
2008-10-06 13:50 ` Arjan van de Ven
2008-10-06 20:44 ` Mikulas Patocka
2008-10-08 10:56 ` Pavel Machek
2008-10-06 2:51 ` Dave Chinner
2008-10-05 22:16 ` [PATCH 3/3] Fix fsync-vs-write misbehavior Mikulas Patocka
2008-10-09 1:12 ` [PATCH] documentation: explain memory barriers Randy Dunlap
2008-10-09 1:17 ` Chris Snook
2008-10-09 1:31 ` Andrew Morton
2008-10-09 5:51 ` Chris Snook
2008-10-09 9:58 ` Ben Hutchings
2008-10-09 21:27 ` Nick Piggin
2008-10-09 17:29 ` Nick Piggin
2008-10-09 1:50 ` Valdis.Kletnieks
2008-10-09 17:35 ` Nick Piggin
2008-10-09 6:52 ` Valdis.Kletnieks
2008-09-24 18:53 ` [PATCH 3/3] Memory management livelock Mikulas Patocka
2008-10-03 2:32 ` [PATCH] " Nick Piggin
2008-10-03 2:40 ` Andrew Morton
2008-10-03 2:59 ` Nick Piggin
2008-10-03 3:14 ` Andrew Morton
2008-10-03 3:47 ` Nick Piggin
2008-10-03 3:56 ` Andrew Morton
2008-10-03 4:07 ` Nick Piggin
2008-10-03 4:17 ` Andrew Morton
2008-10-03 4:29 ` Nick Piggin
2008-10-03 11:43 ` Mikulas Patocka
2008-10-03 12:27 ` Nick Piggin
2008-10-03 13:53 ` Mikulas Patocka
2008-10-03 2:54 ` Nick Piggin
2008-10-03 11:26 ` Mikulas Patocka
2008-10-03 12:31 ` Nick Piggin
2008-10-03 13:50 ` Mikulas Patocka
2008-10-03 14:50 ` Alasdair G Kergon
2008-10-03 14:36 ` Alasdair G Kergon
2008-10-03 15:52 ` application syncing options (was Re: [PATCH] Memory management livelock) david
2008-10-06 0:04 ` Mikulas Patocka
2008-10-06 0:19 ` david
2008-10-06 3:42 ` Mikulas Patocka
2008-10-07 3:37 ` david
2008-10-07 15:44 ` Mikulas Patocka
2008-10-07 17:16 ` david
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081001225404.4e973465.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=agk@redhat.com \
--cc=chris@arachsys.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@vger.kernel.org \
--cc=mbroz@redhat.com \
--cc=mpatocka@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.