From: Ingo Molnar <mingo@kernel.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: Robin Holt <holt@sgi.com>, Nathan Zimmer <nzimmer@sgi.com>,
Yinghai Lu <yinghai@kernel.org>,
Linux Kernel <linux-kernel@vger.kernel.org>,
Linux MM <linux-mm@kvack.org>, Rob Landley <rob@landley.net>,
Mike Travis <travis@sgi.com>,
Daniel J Blueman <daniel@numascale-asia.com>,
Andrew Morton <akpm@linux-foundation.org>,
Greg KH <gregkh@linuxfoundation.org>,
Mel Gorman <mgorman@suse.de>
Subject: Re: [RFC 4/4] Sparse initialization of struct page array.
Date: Tue, 23 Jul 2013 10:32:11 +0200 [thread overview]
Message-ID: <20130723083211.GE16088@gmail.com> (raw)
In-Reply-To: <51E43F91.1040906@zytor.com>
* H. Peter Anvin <hpa@zytor.com> wrote:
> On 07/15/2013 11:26 AM, Robin Holt wrote:
>
> > Is there a fairly cheap way to determine definitively that the struct
> > page is not initialized?
>
> By definition I would assume no. The only way I can think of would be
> to unmap the memory associated with the struct page in the TLB and
> initialize the struct pages at trap time.
But ... the only fastpath impact I can see of delayed initialization right
now is this piece of logic in prep_new_page():
@@ -903,6 +964,10 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
for (i = 0; i < (1 << order); i++) {
struct page *p = page + i;
+
+ if (PageUninitialized2Mib(p))
+ expand_page_initialization(page);
+
if (unlikely(check_new_page(p)))
return 1;
That is where I think it can be made zero overhead in the
already-initialized case, because page-flags are already used in
check_new_page():
static inline int check_new_page(struct page *page)
{
if (unlikely(page_mapcount(page) |
(page->mapping != NULL) |
(atomic_read(&page->_count) != 0) |
(page->flags & PAGE_FLAGS_CHECK_AT_PREP) |
(mem_cgroup_bad_page_check(page)))) {
bad_page(page);
return 1;
see that PAGE_FLAGS_CHECK_AT_PREP flag? That always gets checked for every
struct page on allocation.
We can micro-optimize that low overhead to zero-overhead, by integrating
the PageUninitialized2Mib() check into check_new_page(). This can be done
by adding PG_uninitialized2mib to PAGE_FLAGS_CHECK_AT_PREP and doing:
if (unlikely(page->flags & PAGE_FLAGS_CHECK_AT_PREP)) {
if (PageUninitialized2Mib(p))
expand_page_initialization(page);
...
}
if (unlikely(page_mapcount(page) |
(page->mapping != NULL) |
(atomic_read(&page->_count) != 0) |
(mem_cgroup_bad_page_check(page)))) {
bad_page(page);
return 1;
this will result in making it essentially zero-overhead, the
expand_page_initialization() logic is now in a slowpath.
Am I missing anything here?
Thanks,
Ingo
--
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>
WARNING: multiple messages have this Message-ID (diff)
From: Ingo Molnar <mingo@kernel.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: Robin Holt <holt@sgi.com>, Nathan Zimmer <nzimmer@sgi.com>,
Yinghai Lu <yinghai@kernel.org>,
Linux Kernel <linux-kernel@vger.kernel.org>,
Linux MM <linux-mm@kvack.org>, Rob Landley <rob@landley.net>,
Mike Travis <travis@sgi.com>,
Daniel J Blueman <daniel@numascale-asia.com>,
Andrew Morton <akpm@linux-foundation.org>,
Greg KH <gregkh@linuxfoundation.org>,
Mel Gorman <mgorman@suse.de>
Subject: Re: [RFC 4/4] Sparse initialization of struct page array.
Date: Tue, 23 Jul 2013 10:32:11 +0200 [thread overview]
Message-ID: <20130723083211.GE16088@gmail.com> (raw)
In-Reply-To: <51E43F91.1040906@zytor.com>
* H. Peter Anvin <hpa@zytor.com> wrote:
> On 07/15/2013 11:26 AM, Robin Holt wrote:
>
> > Is there a fairly cheap way to determine definitively that the struct
> > page is not initialized?
>
> By definition I would assume no. The only way I can think of would be
> to unmap the memory associated with the struct page in the TLB and
> initialize the struct pages at trap time.
But ... the only fastpath impact I can see of delayed initialization right
now is this piece of logic in prep_new_page():
@@ -903,6 +964,10 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
for (i = 0; i < (1 << order); i++) {
struct page *p = page + i;
+
+ if (PageUninitialized2Mib(p))
+ expand_page_initialization(page);
+
if (unlikely(check_new_page(p)))
return 1;
That is where I think it can be made zero overhead in the
already-initialized case, because page-flags are already used in
check_new_page():
static inline int check_new_page(struct page *page)
{
if (unlikely(page_mapcount(page) |
(page->mapping != NULL) |
(atomic_read(&page->_count) != 0) |
(page->flags & PAGE_FLAGS_CHECK_AT_PREP) |
(mem_cgroup_bad_page_check(page)))) {
bad_page(page);
return 1;
see that PAGE_FLAGS_CHECK_AT_PREP flag? That always gets checked for every
struct page on allocation.
We can micro-optimize that low overhead to zero-overhead, by integrating
the PageUninitialized2Mib() check into check_new_page(). This can be done
by adding PG_uninitialized2mib to PAGE_FLAGS_CHECK_AT_PREP and doing:
if (unlikely(page->flags & PAGE_FLAGS_CHECK_AT_PREP)) {
if (PageUninitialized2Mib(p))
expand_page_initialization(page);
...
}
if (unlikely(page_mapcount(page) |
(page->mapping != NULL) |
(atomic_read(&page->_count) != 0) |
(mem_cgroup_bad_page_check(page)))) {
bad_page(page);
return 1;
this will result in making it essentially zero-overhead, the
expand_page_initialization() logic is now in a slowpath.
Am I missing anything here?
Thanks,
Ingo
next prev parent reply other threads:[~2013-07-23 8:32 UTC|newest]
Thread overview: 153+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-12 2:03 [RFC 0/4] Transparent on-demand struct page initialization embedded in the buddy allocator Robin Holt
2013-07-12 2:03 ` Robin Holt
2013-07-12 2:03 ` [RFC 1/4] memblock: Introduce a for_each_reserved_mem_region iterator Robin Holt
2013-07-12 2:03 ` Robin Holt
2013-07-12 2:03 ` [RFC 2/4] Have __free_pages_memory() free in larger chunks Robin Holt
2013-07-12 2:03 ` Robin Holt
2013-07-12 7:45 ` Robin Holt
2013-07-12 7:45 ` Robin Holt
2013-07-13 3:08 ` Yinghai Lu
2013-07-13 3:08 ` Yinghai Lu
2013-07-16 13:02 ` Sam Ben
2013-07-16 13:02 ` Sam Ben
2013-07-23 15:32 ` Johannes Weiner
2013-07-23 15:32 ` Johannes Weiner
2013-07-12 2:03 ` [RFC 3/4] Seperate page initialization into a separate function Robin Holt
2013-07-12 2:03 ` Robin Holt
2013-07-13 3:06 ` Yinghai Lu
2013-07-13 3:06 ` Yinghai Lu
2013-07-15 3:19 ` Robin Holt
2013-07-15 3:19 ` Robin Holt
2013-07-12 2:03 ` [RFC 4/4] Sparse initialization of struct page array Robin Holt
2013-07-12 2:03 ` Robin Holt
2013-07-13 4:19 ` Yinghai Lu
2013-07-13 4:19 ` Yinghai Lu
2013-07-13 4:39 ` H. Peter Anvin
2013-07-13 4:39 ` H. Peter Anvin
2013-07-13 5:31 ` Yinghai Lu
2013-07-13 5:31 ` Yinghai Lu
2013-07-13 5:38 ` H. Peter Anvin
2013-07-13 5:38 ` H. Peter Anvin
2013-07-15 14:08 ` Nathan Zimmer
2013-07-15 14:08 ` Nathan Zimmer
2013-07-15 17:45 ` Nathan Zimmer
2013-07-15 17:45 ` Nathan Zimmer
2013-07-15 17:54 ` H. Peter Anvin
2013-07-15 17:54 ` H. Peter Anvin
2013-07-15 18:26 ` Robin Holt
2013-07-15 18:26 ` Robin Holt
2013-07-15 18:29 ` H. Peter Anvin
2013-07-15 18:29 ` H. Peter Anvin
2013-07-23 8:32 ` Ingo Molnar [this message]
2013-07-23 8:32 ` Ingo Molnar
2013-07-23 11:09 ` Robin Holt
2013-07-23 11:09 ` Robin Holt
2013-07-23 11:15 ` Robin Holt
2013-07-23 11:15 ` Robin Holt
2013-07-23 11:41 ` Robin Holt
2013-07-23 11:41 ` Robin Holt
2013-07-23 11:50 ` Robin Holt
2013-07-23 11:50 ` Robin Holt
2013-07-16 10:26 ` Robin Holt
2013-07-16 10:26 ` Robin Holt
2013-07-25 2:25 ` Robin Holt
2013-07-25 2:25 ` Robin Holt
2013-07-25 12:50 ` Yinghai Lu
2013-07-25 12:50 ` Yinghai Lu
2013-07-25 13:42 ` Robin Holt
2013-07-25 13:42 ` Robin Holt
2013-07-25 13:52 ` Yinghai Lu
2013-07-25 13:52 ` Yinghai Lu
2013-07-15 21:30 ` Andrew Morton
2013-07-15 21:30 ` Andrew Morton
2013-07-16 10:38 ` Robin Holt
2013-07-16 10:38 ` Robin Holt
2013-07-12 8:27 ` [RFC 0/4] Transparent on-demand struct page initialization embedded in the buddy allocator Ingo Molnar
2013-07-12 8:27 ` Ingo Molnar
2013-07-12 8:47 ` boot tracing Borislav Petkov
2013-07-12 8:47 ` Borislav Petkov
2013-07-12 8:53 ` Ingo Molnar
2013-07-12 8:53 ` Ingo Molnar
2013-07-15 1:38 ` Sam Ben
2013-07-15 1:38 ` Sam Ben
2013-07-23 8:18 ` Ingo Molnar
2013-07-23 8:18 ` Ingo Molnar
2013-07-12 9:19 ` [RFC 0/4] Transparent on-demand struct page initialization embedded in the buddy allocator Robert Richter
2013-07-12 9:19 ` Robert Richter
2013-07-15 15:16 ` Robin Holt
2013-07-15 15:16 ` Robin Holt
2013-07-16 8:55 ` Joonsoo Kim
2013-07-16 8:55 ` Joonsoo Kim
2013-07-16 9:08 ` Borislav Petkov
2013-07-16 9:08 ` Borislav Petkov
2013-07-23 8:20 ` Ingo Molnar
2013-07-23 8:20 ` Ingo Molnar
2013-07-15 15:00 ` Robin Holt
2013-07-15 15:00 ` Robin Holt
2013-07-17 5:17 ` Sam Ben
2013-07-17 5:17 ` Sam Ben
2013-07-17 9:30 ` Robin Holt
2013-07-17 9:30 ` Robin Holt
2013-07-19 23:51 ` Yinghai Lu
2013-07-22 6:13 ` Robin Holt
2013-07-22 6:13 ` Robin Holt
2013-08-02 17:44 ` [RFC v2 0/5] " Nathan Zimmer
2013-08-02 17:44 ` Nathan Zimmer
2013-08-02 17:44 ` [RFC v2 1/5] memblock: Introduce a for_each_reserved_mem_region iterator Nathan Zimmer
2013-08-02 17:44 ` Nathan Zimmer
2013-08-02 17:44 ` [RFC v2 2/5] Have __free_pages_memory() free in larger chunks Nathan Zimmer
2013-08-02 17:44 ` Nathan Zimmer
2013-08-02 17:44 ` [RFC v2 3/5] Move page initialization into a separate function Nathan Zimmer
2013-08-02 17:44 ` Nathan Zimmer
2013-08-02 17:44 ` [RFC v2 4/5] Only set page reserved in the memblock region Nathan Zimmer
2013-08-02 17:44 ` Nathan Zimmer
2013-08-03 20:04 ` Nathan Zimmer
2013-08-03 20:04 ` Nathan Zimmer
2013-08-02 17:44 ` [RFC v2 5/5] Sparse initialization of struct page array Nathan Zimmer
2013-08-02 17:44 ` Nathan Zimmer
2013-08-05 9:58 ` [RFC v2 0/5] Transparent on-demand struct page initialization embedded in the buddy allocator Ingo Molnar
2013-08-05 9:58 ` Ingo Molnar
2013-08-12 21:54 ` [RFC v3 " Nathan Zimmer
2013-08-12 21:54 ` Nathan Zimmer
2013-08-12 21:54 ` [RFC v3 1/5] memblock: Introduce a for_each_reserved_mem_region iterator Nathan Zimmer
2013-08-12 21:54 ` Nathan Zimmer
2013-08-12 21:54 ` [RFC v3 2/5] Have __free_pages_memory() free in larger chunks Nathan Zimmer
2013-08-12 21:54 ` Nathan Zimmer
2013-08-12 21:54 ` [RFC v3 3/5] Move page initialization into a separate function Nathan Zimmer
2013-08-12 21:54 ` Nathan Zimmer
2013-08-12 21:54 ` [RFC v3 4/5] Only set page reserved in the memblock region Nathan Zimmer
2013-08-12 21:54 ` Nathan Zimmer
2013-08-12 21:54 ` [RFC v3 5/5] Sparse initialization of struct page array Nathan Zimmer
2013-08-12 21:54 ` Nathan Zimmer
2013-08-13 10:58 ` [RFC v3 0/5] Transparent on-demand struct page initialization embedded in the buddy allocator Ingo Molnar
2013-08-13 10:58 ` Ingo Molnar
2013-08-13 17:09 ` Linus Torvalds
2013-08-13 17:09 ` Linus Torvalds
2013-08-13 17:23 ` H. Peter Anvin
2013-08-13 17:23 ` H. Peter Anvin
2013-08-13 17:33 ` Mike Travis
2013-08-13 17:33 ` Mike Travis
2013-08-13 17:51 ` Linus Torvalds
2013-08-13 17:51 ` Linus Torvalds
2013-08-13 18:04 ` Mike Travis
2013-08-13 18:04 ` Mike Travis
2013-08-13 19:06 ` Mike Travis
2013-08-13 19:06 ` Mike Travis
2013-08-13 20:24 ` Yinghai Lu
2013-08-13 20:24 ` Yinghai Lu
2013-08-13 20:37 ` Mike Travis
2013-08-13 20:37 ` Mike Travis
2013-08-13 21:35 ` Nathan Zimmer
2013-08-13 21:35 ` Nathan Zimmer
2013-08-13 23:10 ` Nathan Zimmer
2013-08-13 23:10 ` Nathan Zimmer
2013-08-13 23:55 ` Linus Torvalds
2013-08-13 23:55 ` Linus Torvalds
2013-08-14 11:27 ` Ingo Molnar
2013-08-14 11:27 ` Ingo Molnar
2013-08-14 11:05 ` Ingo Molnar
2013-08-14 11:05 ` Ingo Molnar
2013-08-14 22:15 ` Nathan Zimmer
2013-08-14 22:15 ` Nathan Zimmer
2013-08-16 16:36 ` Dave Hansen
2013-08-16 16:36 ` Dave Hansen
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=20130723083211.GE16088@gmail.com \
--to=mingo@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=daniel@numascale-asia.com \
--cc=gregkh@linuxfoundation.org \
--cc=holt@sgi.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mgorman@suse.de \
--cc=nzimmer@sgi.com \
--cc=rob@landley.net \
--cc=travis@sgi.com \
--cc=yinghai@kernel.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.