From: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>
To: Aubrey Li <aubreylee@gmail.com>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Linus Torvalds <torvalds@osdl.org>, Andrew Morton <akpm@osdl.org>,
Nick Piggin <nickpiggin@yahoo.com.au>,
"linux-os (Dick Johnson)" <linux-os@analogic.com>,
Robin Getz <rgetz@blackfin.uclinux.org>
Subject: Re: [RPC][PATCH 2.6.20-rc5] limit total vfs page cache
Date: Wed, 24 Jan 2007 11:00:36 +0530 [thread overview]
Message-ID: <45B6EEFC.5050402@linux.vnet.ibm.com> (raw)
In-Reply-To: <6d6a94c50701190740v6da25151kb9ddcf358ab2957@mail.gmail.com>
Aubrey Li wrote:
> On 1/19/07, Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> wrote:
>> Hi Aubrey,
>>
>> I used your patch on my PPC64 box and I do not get expected
>> behavior. As you had requested, I am attaching zoneinfo and meminfo
>> dumps:
>>
>> Please let me know if you need any further data to help me out with
>> the test/experiment.
>>
>
> Although I have no PPC64 box in hand, I think the logic should be the same.
> get_page_from_freelist() is called 5 times in __alloc_pages().
>
> 1) alloc_flags = ALLOC_WMARK_LOW | ALLOC_PAGECACHE;
> 2) alloc_flags = ALLOC_WMARK_MIN | ALLOC_PAGECACHE;
> We should have the same result on the first two times get_page_from_freelist().
>
> 3) if (((p->flags & PF_MEMALLOC) || unlikely(test_thread_flag(TIF_MEMDIE)))
> && !in_interrupt())
> alloc_flags = ALLOC_NO_WATERMARKS
> The case on my platform will never enter this branch. If the branch
> occurs on your side,
> The limit will be omitted. Because NO watermark, zone_watermark_ok()
> will not be checked. memory will be allocated directly.
>
> 4)if (likely(did_some_progress)) {
> alloc_flags should include ALLOC_PAGECACHE.
> So we should have the same result on this call.
>
> 5) } else if ((gfp_mask & __GFP_FS) && !(gfp_mask & __GFP_NORETRY)) {
> alloc_flags = ALLOC_WMARK_HIGH, without ALLOC_PAGECACHE
>
> This branch will not hit on my case. You may need to check it.
>
> If 3) or 5) occurs on your platform, I think you can easily fix it.
> Please confirm it and let me know the result.
None of the above condition was the problem in my PPC64 box. I
added __GFP_PAGECACHE flag in pagecache_alloc_cold() and
grab_cache_page_nowait() routines and the reclaim seemed to work.
--- linux-2.6.20-rc5.orig/include/linux/pagemap.h
+++ linux-2.6.20-rc5/include/linux/pagemap.h
@@ -62,12 +62,12 @@ static inline struct page *__page_cache_
static inline struct page *page_cache_alloc(struct address_space *x)
{
- return __page_cache_alloc(mapping_gfp_mask(x));
+ return __page_cache_alloc(mapping_gfp_mask(x)|__GFP_PAGECACHE);
}
static inline struct page *page_cache_alloc_cold(struct
address_space *x)
{
- return __page_cache_alloc(mapping_gfp_mask(x)|__GFP_COLD);
+ return
__page_cache_alloc(mapping_gfp_mask(x)|__GFP_COLD|__GFP_PAGECACHE);
}
typedef int filler_t(void *, struct page *);
[snip]
--- linux-2.6.20-rc5.orig/mm/filemap.c
+++ linux-2.6.20-rc5/mm/filemap.c
@@ -823,7 +823,7 @@ grab_cache_page_nowait(struct address_sp
page_cache_release(page);
return NULL;
}
- page = __page_cache_alloc(mapping_gfp_mask(mapping) & ~__GFP_FS);
+ page = __page_cache_alloc(mapping_gfp_mask(mapping) & ~__GFP_FS |
__GFP_PAGECACHE);
if (page && add_to_page_cache_lru(page, mapping, index, GFP_KERNEL)) {
page_cache_release(page);
page = NULL;
pagecache_alloc_cold() is used in the read-ahead path which was
being called in my case of large file operations.
--Vaidy
WARNING: multiple messages have this Message-ID (diff)
From: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>
To: Aubrey Li <aubreylee@gmail.com>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Linus Torvalds <torvalds@osdl.org>, Andrew Morton <akpm@osdl.org>,
Nick Piggin <nickpiggin@yahoo.com.au>,
"linux-os (Dick Johnson)" <linux-os@analogic.com>,
Robin Getz <rgetz@blackfin.uclinux.org>
Subject: Re: [RPC][PATCH 2.6.20-rc5] limit total vfs page cache
Date: Wed, 24 Jan 2007 11:00:36 +0530 [thread overview]
Message-ID: <45B6EEFC.5050402@linux.vnet.ibm.com> (raw)
In-Reply-To: <6d6a94c50701190740v6da25151kb9ddcf358ab2957@mail.gmail.com>
Aubrey Li wrote:
> On 1/19/07, Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> wrote:
>> Hi Aubrey,
>>
>> I used your patch on my PPC64 box and I do not get expected
>> behavior. As you had requested, I am attaching zoneinfo and meminfo
>> dumps:
>>
>> Please let me know if you need any further data to help me out with
>> the test/experiment.
>>
>
> Although I have no PPC64 box in hand, I think the logic should be the same.
> get_page_from_freelist() is called 5 times in __alloc_pages().
>
> 1) alloc_flags = ALLOC_WMARK_LOW | ALLOC_PAGECACHE;
> 2) alloc_flags = ALLOC_WMARK_MIN | ALLOC_PAGECACHE;
> We should have the same result on the first two times get_page_from_freelist().
>
> 3) if (((p->flags & PF_MEMALLOC) || unlikely(test_thread_flag(TIF_MEMDIE)))
> && !in_interrupt())
> alloc_flags = ALLOC_NO_WATERMARKS
> The case on my platform will never enter this branch. If the branch
> occurs on your side,
> The limit will be omitted. Because NO watermark, zone_watermark_ok()
> will not be checked. memory will be allocated directly.
>
> 4)if (likely(did_some_progress)) {
> alloc_flags should include ALLOC_PAGECACHE.
> So we should have the same result on this call.
>
> 5) } else if ((gfp_mask & __GFP_FS) && !(gfp_mask & __GFP_NORETRY)) {
> alloc_flags = ALLOC_WMARK_HIGH, without ALLOC_PAGECACHE
>
> This branch will not hit on my case. You may need to check it.
>
> If 3) or 5) occurs on your platform, I think you can easily fix it.
> Please confirm it and let me know the result.
None of the above condition was the problem in my PPC64 box. I
added __GFP_PAGECACHE flag in pagecache_alloc_cold() and
grab_cache_page_nowait() routines and the reclaim seemed to work.
--- linux-2.6.20-rc5.orig/include/linux/pagemap.h
+++ linux-2.6.20-rc5/include/linux/pagemap.h
@@ -62,12 +62,12 @@ static inline struct page *__page_cache_
static inline struct page *page_cache_alloc(struct address_space *x)
{
- return __page_cache_alloc(mapping_gfp_mask(x));
+ return __page_cache_alloc(mapping_gfp_mask(x)|__GFP_PAGECACHE);
}
static inline struct page *page_cache_alloc_cold(struct
address_space *x)
{
- return __page_cache_alloc(mapping_gfp_mask(x)|__GFP_COLD);
+ return
__page_cache_alloc(mapping_gfp_mask(x)|__GFP_COLD|__GFP_PAGECACHE);
}
typedef int filler_t(void *, struct page *);
[snip]
--- linux-2.6.20-rc5.orig/mm/filemap.c
+++ linux-2.6.20-rc5/mm/filemap.c
@@ -823,7 +823,7 @@ grab_cache_page_nowait(struct address_sp
page_cache_release(page);
return NULL;
}
- page = __page_cache_alloc(mapping_gfp_mask(mapping) & ~__GFP_FS);
+ page = __page_cache_alloc(mapping_gfp_mask(mapping) & ~__GFP_FS |
__GFP_PAGECACHE);
if (page && add_to_page_cache_lru(page, mapping, index, GFP_KERNEL)) {
page_cache_release(page);
page = NULL;
pagecache_alloc_cold() is used in the read-ahead path which was
being called in my case of large file operations.
--Vaidy
--
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>
next prev parent reply other threads:[~2007-01-24 5:31 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-18 3:23 [RPC][PATCH 2.6.20-rc5] limit total vfs page cache Aubrey Li
2007-01-18 3:23 ` Aubrey Li
2007-01-19 14:44 ` Vaidyanathan Srinivasan
2007-01-19 14:44 ` Vaidyanathan Srinivasan
2007-01-19 15:40 ` Aubrey Li
2007-01-19 15:40 ` Aubrey Li
2007-01-24 5:30 ` Vaidyanathan Srinivasan [this message]
2007-01-24 5:30 ` Vaidyanathan Srinivasan
2007-01-24 5:53 ` Aubrey Li
2007-01-24 5:53 ` Aubrey Li
2007-01-19 14:52 ` Vaidyanathan Srinivasan
2007-01-19 14:52 ` Vaidyanathan Srinivasan
2007-01-19 16:05 ` Aubrey Li
2007-01-19 16:05 ` Aubrey Li
2007-01-19 18:49 ` Vaidyanathan Srinivasan
2007-01-19 18:49 ` Vaidyanathan Srinivasan
2007-01-19 19:01 ` Christoph Lameter
2007-01-19 19:01 ` Christoph Lameter
2007-01-20 2:04 ` Aubrey Li
2007-01-20 2:04 ` Aubrey Li
2007-01-20 2:24 ` Nick Piggin
2007-01-20 2:24 ` Nick Piggin
2007-01-20 2:35 ` Mike Frysinger
2007-01-20 2:35 ` Mike Frysinger
2007-01-20 2:49 ` Nick Piggin
2007-01-20 2:49 ` Nick Piggin
2007-01-20 3:40 ` Mike Frysinger
2007-01-20 3:40 ` Mike Frysinger
2007-01-20 3:08 ` Aubrey Li
2007-01-20 3:08 ` Aubrey Li
2007-01-20 4:03 ` Nick Piggin
2007-01-20 4:03 ` Nick Piggin
2007-01-20 4:26 ` Aubrey Li
2007-01-20 4:26 ` Aubrey Li
2007-01-22 19:22 ` Christoph Lameter
2007-01-22 19:22 ` Christoph Lameter
2007-01-22 19:15 ` Christoph Lameter
2007-01-22 19:15 ` Christoph Lameter
2007-01-19 18:21 ` Christoph Lameter
2007-01-19 18:21 ` Christoph Lameter
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=45B6EEFC.5050402@linux.vnet.ibm.com \
--to=svaidy@linux.vnet.ibm.com \
--cc=akpm@osdl.org \
--cc=aubreylee@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-os@analogic.com \
--cc=nickpiggin@yahoo.com.au \
--cc=rgetz@blackfin.uclinux.org \
--cc=torvalds@osdl.org \
/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.