* [PATCH] mm: Split page_type out from _map_count @ 2018-02-07 21:30 Matthew Wilcox 2018-02-09 10:51 ` Kirill A. Shutemov 2018-02-10 5:00 ` [PATCH] " kbuild test robot 0 siblings, 2 replies; 8+ messages in thread From: Matthew Wilcox @ 2018-02-07 21:30 UTC (permalink / raw) To: linux-mm; +Cc: Matthew Wilcox From: Matthew Wilcox <mawilcox@microsoft.com> We're already using a union of many fields here, so stop abusing the _map_count and make page_type its own field. That implies renaming some of the machinery that creates PageBuddy, PageBalloon and PageKmemcg; bring back the PG_buddy, PG_balloon and PG_kmemcg names. Also, the special values don't need to be (and probably shouldn't be) powers of two, so renumber them to just start at -128. Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com> --- include/linux/mm_types.h | 13 ++++++++----- include/linux/page-flags.h | 36 +++++++++++++++++------------------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index fd1af6b9591d..1c5dea402501 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -94,6 +94,14 @@ struct page { }; union { + /* + * If the page is neither PageSlab nor PageAnon, the value + * stored here may help distinguish it from page cache pages. + * See page-flags.h for a list of page types which are + * currently stored here. + */ + unsigned int page_type; + _slub_counter_t counters; unsigned int active; /* SLAB */ struct { /* SLUB */ @@ -107,11 +115,6 @@ struct page { /* * Count of ptes mapped in mms, to show when * page is mapped & limit reverse map searches. - * - * Extra information about page type may be - * stored here for pages that are never mapped, - * in which case the value MUST BE <= -2. - * See page-flags.h for more details. */ atomic_t _mapcount; diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 50c2b8786831..ba6a7e883425 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -630,49 +630,47 @@ PAGEFLAG_FALSE(DoubleMap) #endif /* - * For pages that are never mapped to userspace, page->mapcount may be - * used for storing extra information about page type. Any value used - * for this purpose must be <= -2, but it's better start not too close - * to -2 so that an underflow of the page_mapcount() won't be mistaken - * for a special page. + * For pages that are never mapped to userspace, page_type may be + * used. Values used for this purpose must be <= -2, but we leave a gap + * so that an underflow of page_mapcount() won't be mistaken for a + * special page. */ -#define PAGE_MAPCOUNT_OPS(uname, lname) \ +#define PAGE_TYPE_OPS(uname, lname) \ static __always_inline int Page##uname(struct page *page) \ { \ - return atomic_read(&page->_mapcount) == \ - PAGE_##lname##_MAPCOUNT_VALUE; \ + return page->page_type == PG_##lname; \ } \ static __always_inline void __SetPage##uname(struct page *page) \ { \ - VM_BUG_ON_PAGE(atomic_read(&page->_mapcount) != -1, page); \ - atomic_set(&page->_mapcount, PAGE_##lname##_MAPCOUNT_VALUE); \ + VM_BUG_ON_PAGE(page->page_type != -1, page); \ + page->page_type = PG_##lname; \ } \ static __always_inline void __ClearPage##uname(struct page *page) \ { \ VM_BUG_ON_PAGE(!Page##uname(page), page); \ - atomic_set(&page->_mapcount, -1); \ + page->page_type = -1; \ } /* - * PageBuddy() indicate that the page is free and in the buddy system + * PageBuddy() indicates that the page is free and in the buddy system * (see mm/page_alloc.c). */ -#define PAGE_BUDDY_MAPCOUNT_VALUE (-128) -PAGE_MAPCOUNT_OPS(Buddy, BUDDY) +#define PG_buddy (-128) +PAGE_TYPE_OPS(Buddy, buddy) /* - * PageBalloon() is set on pages that are on the balloon page list + * PageBalloon() is true for pages that are on the balloon page list * (see mm/balloon_compaction.c). */ -#define PAGE_BALLOON_MAPCOUNT_VALUE (-256) -PAGE_MAPCOUNT_OPS(Balloon, BALLOON) +#define PG_balloon (-129) +PAGE_TYPE_OPS(Balloon, balloon) /* * If kmemcg is enabled, the buddy allocator will set PageKmemcg() on * pages allocated with __GFP_ACCOUNT. It gets cleared on page free. */ -#define PAGE_KMEMCG_MAPCOUNT_VALUE (-512) -PAGE_MAPCOUNT_OPS(Kmemcg, KMEMCG) +#define PG_kmemcg (-130) +PAGE_TYPE_OPS(Kmemcg, kmemcg) extern bool is_free_buddy_page(struct page *page); -- 2.15.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> ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] mm: Split page_type out from _map_count 2018-02-07 21:30 [PATCH] mm: Split page_type out from _map_count Matthew Wilcox @ 2018-02-09 10:51 ` Kirill A. Shutemov 2018-02-09 13:49 ` Matthew Wilcox 2018-02-10 5:00 ` [PATCH] " kbuild test robot 1 sibling, 1 reply; 8+ messages in thread From: Kirill A. Shutemov @ 2018-02-09 10:51 UTC (permalink / raw) To: Matthew Wilcox; +Cc: linux-mm, Matthew Wilcox On Wed, Feb 07, 2018 at 01:30:47PM -0800, Matthew Wilcox wrote: > From: Matthew Wilcox <mawilcox@microsoft.com> > > We're already using a union of many fields here, so stop abusing the > _map_count and make page_type its own field. That implies renaming some > of the machinery that creates PageBuddy, PageBalloon and PageKmemcg; > bring back the PG_buddy, PG_balloon and PG_kmemcg names. Sounds reasonable to me. > Also, the special values don't need to be (and probably shouldn't be) powers > of two, so renumber them to just start at -128. Are you sure about this? Is it guarantee that we would not need in the future PG_buddy|PG_kmemcg for instance? I guess we may want to make it a bitfield. In negative space it's kinda interesting. :) -- Kirill A. Shutemov -- 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> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] mm: Split page_type out from _map_count 2018-02-09 10:51 ` Kirill A. Shutemov @ 2018-02-09 13:49 ` Matthew Wilcox 2018-02-09 15:28 ` [PATCH v2] " Matthew Wilcox 0 siblings, 1 reply; 8+ messages in thread From: Matthew Wilcox @ 2018-02-09 13:49 UTC (permalink / raw) To: Kirill A. Shutemov; +Cc: linux-mm, Matthew Wilcox On Fri, Feb 09, 2018 at 01:51:32PM +0300, Kirill A. Shutemov wrote: > On Wed, Feb 07, 2018 at 01:30:47PM -0800, Matthew Wilcox wrote: > > From: Matthew Wilcox <mawilcox@microsoft.com> > > > > We're already using a union of many fields here, so stop abusing the > > _map_count and make page_type its own field. That implies renaming some > > of the machinery that creates PageBuddy, PageBalloon and PageKmemcg; > > bring back the PG_buddy, PG_balloon and PG_kmemcg names. > > Sounds reasonable to me. > > > Also, the special values don't need to be (and probably shouldn't be) powers > > of two, so renumber them to just start at -128. > > Are you sure about this? Is it guarantee that we would not need in the > future PG_buddy|PG_kmemcg for instance? > > I guess we may want to make it a bitfield. In negative space it's kinda > interesting. :) Far too interesting ;-) We still wouldn't want it to be powers of two ... We'd want to do something like: #define PAGE_TYPE_BASE 0xfffff000 #define PG_buddy 0x00000080 #define PG_balloon 0x00000100 #define PG_kmemcg 0x00000200 #define PG_pte 0x00000400 ... etc ... I think that's a worthwhile improvement, particularly since I think PG_kmemcg might want to be a completely independent flag from everything else ("This is a page allocated for userspace PTEs, so it's both a kmemcg page and a PTE page"). I'll respin the patch. Thanks! -- 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> ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2] mm: Split page_type out from _map_count 2018-02-09 13:49 ` Matthew Wilcox @ 2018-02-09 15:28 ` Matthew Wilcox 2018-02-09 18:43 ` Dave Hansen 0 siblings, 1 reply; 8+ messages in thread From: Matthew Wilcox @ 2018-02-09 15:28 UTC (permalink / raw) To: Kirill A. Shutemov; +Cc: linux-mm, Matthew Wilcox From: Matthew Wilcox <mawilcox@microsoft.com> We're already using a union of many fields here, so stop abusing the _map_count and make page_type its own field. That implies renaming some of the machinery that creates PageBuddy, PageBalloon and PageKmemcg; bring back the PG_buddy, PG_balloon and PG_kmemcg names. As Kirill pointed out, it would be nice to be able to set more than one flag in this field, so change the definitions to allow this. Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com> --- v2: Fixed a few places that still referred to the old MAPCOUNT_VALUEs. Incorporated Kirill's suggestion to allow more than one flag. include/linux/mm_types.h | 13 ++++++++----- include/linux/page-flags.h | 44 +++++++++++++++++++++++++------------------- kernel/crash_core.c | 2 +- mm/page_alloc.c | 13 +++++-------- scripts/tags.sh | 6 +++--- 5 files changed, 42 insertions(+), 36 deletions(-) diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index fd1af6b9591d..1c5dea402501 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -94,6 +94,14 @@ struct page { }; union { + /* + * If the page is neither PageSlab nor PageAnon, the value + * stored here may help distinguish it from page cache pages. + * See page-flags.h for a list of page types which are + * currently stored here. + */ + unsigned int page_type; + _slub_counter_t counters; unsigned int active; /* SLAB */ struct { /* SLUB */ @@ -107,11 +115,6 @@ struct page { /* * Count of ptes mapped in mms, to show when * page is mapped & limit reverse map searches. - * - * Extra information about page type may be - * stored here for pages that are never mapped, - * in which case the value MUST BE <= -2. - * See page-flags.h for more details. */ atomic_t _mapcount; diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 50c2b8786831..efe5ebfef5b2 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -630,49 +630,55 @@ PAGEFLAG_FALSE(DoubleMap) #endif /* - * For pages that are never mapped to userspace, page->mapcount may be - * used for storing extra information about page type. Any value used - * for this purpose must be <= -2, but it's better start not too close - * to -2 so that an underflow of the page_mapcount() won't be mistaken - * for a special page. + * For pages that are never mapped to userspace (and aren't PageSlab), + * page_type may be used. Because it is initialised to -1, we invert the + * sense of the bit, so SetPageFoo *clears* the bit used for PageFoo, and + * ClearPageFoo *sets* the bit used for PageFoo. We leave a gap in the bit + * assignments so that an underflow of page_mapcount() won't be mistaken for + * a special page. */ -#define PAGE_MAPCOUNT_OPS(uname, lname) \ + +#define PAGE_TYPE_BASE 0xfffff000 +#define PG_buddy 0x00000080 +#define PG_balloon 0x00000100 +#define PG_kmemcg 0x00000200 + +#define __is_page_type(page, flag) \ + ((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE) + +#define PAGE_TYPE_OPS(uname, lname) \ static __always_inline int Page##uname(struct page *page) \ { \ - return atomic_read(&page->_mapcount) == \ - PAGE_##lname##_MAPCOUNT_VALUE; \ + return __is_page_type(page, PG_##lname); \ } \ static __always_inline void __SetPage##uname(struct page *page) \ { \ - VM_BUG_ON_PAGE(atomic_read(&page->_mapcount) != -1, page); \ - atomic_set(&page->_mapcount, PAGE_##lname##_MAPCOUNT_VALUE); \ + VM_BUG_ON_PAGE(!__is_page_type(page, 0), page); \ + page->page_type &= ~PG_##lname; \ } \ static __always_inline void __ClearPage##uname(struct page *page) \ { \ VM_BUG_ON_PAGE(!Page##uname(page), page); \ - atomic_set(&page->_mapcount, -1); \ + page->page_type |= PG_##lname; \ } /* - * PageBuddy() indicate that the page is free and in the buddy system + * PageBuddy() indicates that the page is free and in the buddy system * (see mm/page_alloc.c). */ -#define PAGE_BUDDY_MAPCOUNT_VALUE (-128) -PAGE_MAPCOUNT_OPS(Buddy, BUDDY) +PAGE_TYPE_OPS(Buddy, buddy) /* - * PageBalloon() is set on pages that are on the balloon page list + * PageBalloon() is true for pages that are on the balloon page list * (see mm/balloon_compaction.c). */ -#define PAGE_BALLOON_MAPCOUNT_VALUE (-256) -PAGE_MAPCOUNT_OPS(Balloon, BALLOON) +PAGE_TYPE_OPS(Balloon, balloon) /* * If kmemcg is enabled, the buddy allocator will set PageKmemcg() on * pages allocated with __GFP_ACCOUNT. It gets cleared on page free. */ -#define PAGE_KMEMCG_MAPCOUNT_VALUE (-512) -PAGE_MAPCOUNT_OPS(Kmemcg, KMEMCG) +PAGE_TYPE_OPS(Kmemcg, kmemcg) extern bool is_free_buddy_page(struct page *page); diff --git a/kernel/crash_core.c b/kernel/crash_core.c index 4f63597c824d..490760ada638 100644 --- a/kernel/crash_core.c +++ b/kernel/crash_core.c @@ -458,7 +458,7 @@ static int __init crash_save_vmcoreinfo_init(void) VMCOREINFO_NUMBER(PG_hwpoison); #endif VMCOREINFO_NUMBER(PG_head_mask); - VMCOREINFO_NUMBER(PAGE_BUDDY_MAPCOUNT_VALUE); + VMCOREINFO_NUMBER(PG_buddy); #ifdef CONFIG_HUGETLB_PAGE VMCOREINFO_NUMBER(HUGETLB_PAGE_DTOR); #endif diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 81e18ceef579..ef9c259db041 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -740,16 +740,14 @@ static inline void rmv_page_order(struct page *page) /* * This function checks whether a page is free && is the buddy - * we can do coalesce a page and its buddy if + * we can coalesce a page and its buddy if * (a) the buddy is not in a hole (check before calling!) && * (b) the buddy is in the buddy system && * (c) a page and its buddy have the same order && * (d) a page and its buddy are in the same zone. * - * For recording whether a page is in the buddy system, we set ->_mapcount - * PAGE_BUDDY_MAPCOUNT_VALUE. - * Setting, clearing, and testing _mapcount PAGE_BUDDY_MAPCOUNT_VALUE is - * serialized by zone->lock. + * For recording whether a page is in the buddy system, we set PG_buddy. + * Setting, clearing, and testing PG_buddy is serialized by zone->lock. * * For recording page's order, we use page_private(page). */ @@ -794,9 +792,8 @@ static inline int page_is_buddy(struct page *page, struct page *buddy, * as necessary, plus some accounting needed to play nicely with other * parts of the VM system. * At each level, we keep a list of pages, which are heads of continuous - * free pages of length of (1 << order) and marked with _mapcount - * PAGE_BUDDY_MAPCOUNT_VALUE. Page's order is recorded in page_private(page) - * field. + * free pages of length of (1 << order) and marked with PageBuddy(). + * Page's order is recorded in page_private(page) field. * So when we are allocating or freeing one, we can derive the state of the * other. That is, if we allocate a small block, and both were * free, the remainder of the region must be split into blocks. diff --git a/scripts/tags.sh b/scripts/tags.sh index 78e546ff689c..8c3ae36d4ea8 100755 --- a/scripts/tags.sh +++ b/scripts/tags.sh @@ -188,9 +188,9 @@ regex_c=( '/\<CLEARPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/ClearPage\1/' '/\<__CLEARPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/__ClearPage\1/' '/\<TESTCLEARFLAG_FALSE(\([[:alnum:]_]*\).*/TestClearPage\1/' - '/^PAGE_MAPCOUNT_OPS(\([[:alnum:]_]*\).*/Page\1/' - '/^PAGE_MAPCOUNT_OPS(\([[:alnum:]_]*\).*/__SetPage\1/' - '/^PAGE_MAPCOUNT_OPS(\([[:alnum:]_]*\).*/__ClearPage\1/' + '/^PAGE_TYPE_OPS(\([[:alnum:]_]*\).*/Page\1/' + '/^PAGE_TYPE_OPS(\([[:alnum:]_]*\).*/__SetPage\1/' + '/^PAGE_TYPE_OPS(\([[:alnum:]_]*\).*/__ClearPage\1/' '/^TASK_PFA_TEST([^,]*, *\([[:alnum:]_]*\))/task_\1/' '/^TASK_PFA_SET([^,]*, *\([[:alnum:]_]*\))/task_set_\1/' '/^TASK_PFA_CLEAR([^,]*, *\([[:alnum:]_]*\))/task_clear_\1/' -- 2.15.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> ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2] mm: Split page_type out from _map_count 2018-02-09 15:28 ` [PATCH v2] " Matthew Wilcox @ 2018-02-09 18:43 ` Dave Hansen 2018-02-09 19:04 ` Christopher Lameter 2018-02-09 19:28 ` Matthew Wilcox 0 siblings, 2 replies; 8+ messages in thread From: Dave Hansen @ 2018-02-09 18:43 UTC (permalink / raw) To: Matthew Wilcox, Kirill A. Shutemov; +Cc: linux-mm, Matthew Wilcox On 02/09/2018 07:28 AM, Matthew Wilcox wrote: > union { > + /* > + * If the page is neither PageSlab nor PageAnon, the value > + * stored here may help distinguish it from page cache pages. > + * See page-flags.h for a list of page types which are > + * currently stored here. > + */ > + unsigned int page_type; > + > _slub_counter_t counters; > unsigned int active; /* SLAB */ > struct { /* SLUB */ > @@ -107,11 +115,6 @@ struct page { > /* > * Count of ptes mapped in mms, to show when > * page is mapped & limit reverse map searches. > - * > - * Extra information about page type may be > - * stored here for pages that are never mapped, > - * in which case the value MUST BE <= -2. > - * See page-flags.h for more details. > */ > atomic_t _mapcount; Are there any straightforward rules that we can enforce here? For instance, if you are using "page_type", you can never have PG_lru set. Not that we have done this at all for 'struct page' historically, it would be really convenient to have a clear definition for when "page_type" is valid vs. "_mapcount". -- 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> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2] mm: Split page_type out from _map_count 2018-02-09 18:43 ` Dave Hansen @ 2018-02-09 19:04 ` Christopher Lameter 2018-02-09 19:28 ` Matthew Wilcox 1 sibling, 0 replies; 8+ messages in thread From: Christopher Lameter @ 2018-02-09 19:04 UTC (permalink / raw) To: Dave Hansen; +Cc: Matthew Wilcox, Kirill A. Shutemov, linux-mm, Matthew Wilcox On Fri, 9 Feb 2018, Dave Hansen wrote: > Are there any straightforward rules that we can enforce here? For > instance, if you are using "page_type", you can never have PG_lru set. > > Not that we have done this at all for 'struct page' historically, it > would be really convenient to have a clear definition for when > "page_type" is valid vs. "_mapcount". Well in general we would like to be able to enforce uses depending on the contents of other fields in struct page. That would require compiler support I guess? What we could do is write a struct page validator that checks contents using some macros? Could be added to the usual places where we check consistency and could also be used for a global sweep over struct pages for validation. SLUB can do that for metadata. If we could express consistency rules for objects in general then it may even have a wider applicability. -- 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> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2] mm: Split page_type out from _map_count 2018-02-09 18:43 ` Dave Hansen 2018-02-09 19:04 ` Christopher Lameter @ 2018-02-09 19:28 ` Matthew Wilcox 1 sibling, 0 replies; 8+ messages in thread From: Matthew Wilcox @ 2018-02-09 19:28 UTC (permalink / raw) To: Dave Hansen; +Cc: Kirill A. Shutemov, linux-mm, Matthew Wilcox On Fri, Feb 09, 2018 at 10:43:19AM -0800, Dave Hansen wrote: > On 02/09/2018 07:28 AM, Matthew Wilcox wrote: > > union { > > + /* > > + * If the page is neither PageSlab nor PageAnon, the value > > + * stored here may help distinguish it from page cache pages. > > + * See page-flags.h for a list of page types which are > > + * currently stored here. > > + */ > > + unsigned int page_type; > > + > > _slub_counter_t counters; > > unsigned int active; /* SLAB */ > > struct { /* SLUB */ > > Are there any straightforward rules that we can enforce here? For > instance, if you are using "page_type", you can never have PG_lru set. > > Not that we have done this at all for 'struct page' historically, it > would be really convenient to have a clear definition for when > "page_type" is valid vs. "_mapcount". I agree, it'd be nice. I think the only invariant we can claim to be true is that if PageSlab is set then page_type is not valid. There are probably any number of bits in the page->flags that aren't currently in use by any of the consumers who actually set page_type, but I don't feel like there's a straightforward rule that we can enforce. Maybe they'll want to start using them in the future for their own purposes. -- 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> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] mm: Split page_type out from _map_count 2018-02-07 21:30 [PATCH] mm: Split page_type out from _map_count Matthew Wilcox 2018-02-09 10:51 ` Kirill A. Shutemov @ 2018-02-10 5:00 ` kbuild test robot 1 sibling, 0 replies; 8+ messages in thread From: kbuild test robot @ 2018-02-10 5:00 UTC (permalink / raw) To: Matthew Wilcox; +Cc: kbuild-all, linux-mm, Matthew Wilcox [-- Attachment #1: Type: text/plain, Size: 9090 bytes --] Hi Matthew, I love your patch! Yet something to improve: [auto build test ERROR on linus/master] [also build test ERROR on next-20180209] [cannot apply to v4.15] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Matthew-Wilcox/mm-Split-page_type-out-from-_map_count/20180210-114226 config: i386-randconfig-s1-201805 (attached as .config) compiler: gcc-6 (Debian 6.4.0-9) 6.4.0 20171026 reproduce: # save the attached .config to linux build tree make ARCH=i386 All errors (new ones prefixed by >>): In file included from kernel/crash_core.c:9:0: kernel/crash_core.c: In function 'crash_save_vmcoreinfo_init': >> kernel/crash_core.c:461:20: error: 'PAGE_BUDDY_MAPCOUNT_VALUE' undeclared (first use in this function) VMCOREINFO_NUMBER(PAGE_BUDDY_MAPCOUNT_VALUE); ^ include/linux/crash_core.h:59:57: note: in definition of macro 'VMCOREINFO_NUMBER' vmcoreinfo_append_str("NUMBER(%s)=%ld\n", #name, (long)name) ^~~~ kernel/crash_core.c:461:20: note: each undeclared identifier is reported only once for each function it appears in VMCOREINFO_NUMBER(PAGE_BUDDY_MAPCOUNT_VALUE); ^ include/linux/crash_core.h:59:57: note: in definition of macro 'VMCOREINFO_NUMBER' vmcoreinfo_append_str("NUMBER(%s)=%ld\n", #name, (long)name) ^~~~ vim +/PAGE_BUDDY_MAPCOUNT_VALUE +461 kernel/crash_core.c 692f66f2 Hari Bathini 2017-05-08 379 692f66f2 Hari Bathini 2017-05-08 380 static int __init crash_save_vmcoreinfo_init(void) 692f66f2 Hari Bathini 2017-05-08 381 { 203e9e41 Xunlei Pang 2017-07-12 382 vmcoreinfo_data = (unsigned char *)get_zeroed_page(GFP_KERNEL); 203e9e41 Xunlei Pang 2017-07-12 383 if (!vmcoreinfo_data) { 203e9e41 Xunlei Pang 2017-07-12 384 pr_warn("Memory allocation for vmcoreinfo_data failed\n"); 203e9e41 Xunlei Pang 2017-07-12 385 return -ENOMEM; 203e9e41 Xunlei Pang 2017-07-12 386 } 203e9e41 Xunlei Pang 2017-07-12 387 203e9e41 Xunlei Pang 2017-07-12 388 vmcoreinfo_note = alloc_pages_exact(VMCOREINFO_NOTE_SIZE, 203e9e41 Xunlei Pang 2017-07-12 389 GFP_KERNEL | __GFP_ZERO); 203e9e41 Xunlei Pang 2017-07-12 390 if (!vmcoreinfo_note) { 203e9e41 Xunlei Pang 2017-07-12 391 free_page((unsigned long)vmcoreinfo_data); 203e9e41 Xunlei Pang 2017-07-12 392 vmcoreinfo_data = NULL; 203e9e41 Xunlei Pang 2017-07-12 393 pr_warn("Memory allocation for vmcoreinfo_note failed\n"); 203e9e41 Xunlei Pang 2017-07-12 394 return -ENOMEM; 203e9e41 Xunlei Pang 2017-07-12 395 } 203e9e41 Xunlei Pang 2017-07-12 396 692f66f2 Hari Bathini 2017-05-08 397 VMCOREINFO_OSRELEASE(init_uts_ns.name.release); 692f66f2 Hari Bathini 2017-05-08 398 VMCOREINFO_PAGESIZE(PAGE_SIZE); 692f66f2 Hari Bathini 2017-05-08 399 692f66f2 Hari Bathini 2017-05-08 400 VMCOREINFO_SYMBOL(init_uts_ns); 692f66f2 Hari Bathini 2017-05-08 401 VMCOREINFO_SYMBOL(node_online_map); 692f66f2 Hari Bathini 2017-05-08 402 #ifdef CONFIG_MMU 692f66f2 Hari Bathini 2017-05-08 403 VMCOREINFO_SYMBOL(swapper_pg_dir); 692f66f2 Hari Bathini 2017-05-08 404 #endif 692f66f2 Hari Bathini 2017-05-08 405 VMCOREINFO_SYMBOL(_stext); 692f66f2 Hari Bathini 2017-05-08 406 VMCOREINFO_SYMBOL(vmap_area_list); 692f66f2 Hari Bathini 2017-05-08 407 692f66f2 Hari Bathini 2017-05-08 408 #ifndef CONFIG_NEED_MULTIPLE_NODES 692f66f2 Hari Bathini 2017-05-08 409 VMCOREINFO_SYMBOL(mem_map); 692f66f2 Hari Bathini 2017-05-08 410 VMCOREINFO_SYMBOL(contig_page_data); 692f66f2 Hari Bathini 2017-05-08 411 #endif 692f66f2 Hari Bathini 2017-05-08 412 #ifdef CONFIG_SPARSEMEM a0b12803 Kirill A. Shutemov 2018-01-12 413 VMCOREINFO_SYMBOL_ARRAY(mem_section); 692f66f2 Hari Bathini 2017-05-08 414 VMCOREINFO_LENGTH(mem_section, NR_SECTION_ROOTS); 692f66f2 Hari Bathini 2017-05-08 415 VMCOREINFO_STRUCT_SIZE(mem_section); 692f66f2 Hari Bathini 2017-05-08 416 VMCOREINFO_OFFSET(mem_section, section_mem_map); 692f66f2 Hari Bathini 2017-05-08 417 #endif 692f66f2 Hari Bathini 2017-05-08 418 VMCOREINFO_STRUCT_SIZE(page); 692f66f2 Hari Bathini 2017-05-08 419 VMCOREINFO_STRUCT_SIZE(pglist_data); 692f66f2 Hari Bathini 2017-05-08 420 VMCOREINFO_STRUCT_SIZE(zone); 692f66f2 Hari Bathini 2017-05-08 421 VMCOREINFO_STRUCT_SIZE(free_area); 692f66f2 Hari Bathini 2017-05-08 422 VMCOREINFO_STRUCT_SIZE(list_head); 692f66f2 Hari Bathini 2017-05-08 423 VMCOREINFO_SIZE(nodemask_t); 692f66f2 Hari Bathini 2017-05-08 424 VMCOREINFO_OFFSET(page, flags); 692f66f2 Hari Bathini 2017-05-08 425 VMCOREINFO_OFFSET(page, _refcount); 692f66f2 Hari Bathini 2017-05-08 426 VMCOREINFO_OFFSET(page, mapping); 692f66f2 Hari Bathini 2017-05-08 427 VMCOREINFO_OFFSET(page, lru); 692f66f2 Hari Bathini 2017-05-08 428 VMCOREINFO_OFFSET(page, _mapcount); 692f66f2 Hari Bathini 2017-05-08 429 VMCOREINFO_OFFSET(page, private); 692f66f2 Hari Bathini 2017-05-08 430 VMCOREINFO_OFFSET(page, compound_dtor); 692f66f2 Hari Bathini 2017-05-08 431 VMCOREINFO_OFFSET(page, compound_order); 692f66f2 Hari Bathini 2017-05-08 432 VMCOREINFO_OFFSET(page, compound_head); 692f66f2 Hari Bathini 2017-05-08 433 VMCOREINFO_OFFSET(pglist_data, node_zones); 692f66f2 Hari Bathini 2017-05-08 434 VMCOREINFO_OFFSET(pglist_data, nr_zones); 692f66f2 Hari Bathini 2017-05-08 435 #ifdef CONFIG_FLAT_NODE_MEM_MAP 692f66f2 Hari Bathini 2017-05-08 436 VMCOREINFO_OFFSET(pglist_data, node_mem_map); 692f66f2 Hari Bathini 2017-05-08 437 #endif 692f66f2 Hari Bathini 2017-05-08 438 VMCOREINFO_OFFSET(pglist_data, node_start_pfn); 692f66f2 Hari Bathini 2017-05-08 439 VMCOREINFO_OFFSET(pglist_data, node_spanned_pages); 692f66f2 Hari Bathini 2017-05-08 440 VMCOREINFO_OFFSET(pglist_data, node_id); 692f66f2 Hari Bathini 2017-05-08 441 VMCOREINFO_OFFSET(zone, free_area); 692f66f2 Hari Bathini 2017-05-08 442 VMCOREINFO_OFFSET(zone, vm_stat); 692f66f2 Hari Bathini 2017-05-08 443 VMCOREINFO_OFFSET(zone, spanned_pages); 692f66f2 Hari Bathini 2017-05-08 444 VMCOREINFO_OFFSET(free_area, free_list); 692f66f2 Hari Bathini 2017-05-08 445 VMCOREINFO_OFFSET(list_head, next); 692f66f2 Hari Bathini 2017-05-08 446 VMCOREINFO_OFFSET(list_head, prev); 692f66f2 Hari Bathini 2017-05-08 447 VMCOREINFO_OFFSET(vmap_area, va_start); 692f66f2 Hari Bathini 2017-05-08 448 VMCOREINFO_OFFSET(vmap_area, list); 692f66f2 Hari Bathini 2017-05-08 449 VMCOREINFO_LENGTH(zone.free_area, MAX_ORDER); 692f66f2 Hari Bathini 2017-05-08 450 log_buf_vmcoreinfo_setup(); 692f66f2 Hari Bathini 2017-05-08 451 VMCOREINFO_LENGTH(free_area.free_list, MIGRATE_TYPES); 692f66f2 Hari Bathini 2017-05-08 452 VMCOREINFO_NUMBER(NR_FREE_PAGES); 692f66f2 Hari Bathini 2017-05-08 453 VMCOREINFO_NUMBER(PG_lru); 692f66f2 Hari Bathini 2017-05-08 454 VMCOREINFO_NUMBER(PG_private); 692f66f2 Hari Bathini 2017-05-08 455 VMCOREINFO_NUMBER(PG_swapcache); 692f66f2 Hari Bathini 2017-05-08 456 VMCOREINFO_NUMBER(PG_slab); 692f66f2 Hari Bathini 2017-05-08 457 #ifdef CONFIG_MEMORY_FAILURE 692f66f2 Hari Bathini 2017-05-08 458 VMCOREINFO_NUMBER(PG_hwpoison); 692f66f2 Hari Bathini 2017-05-08 459 #endif 692f66f2 Hari Bathini 2017-05-08 460 VMCOREINFO_NUMBER(PG_head_mask); 692f66f2 Hari Bathini 2017-05-08 @461 VMCOREINFO_NUMBER(PAGE_BUDDY_MAPCOUNT_VALUE); 692f66f2 Hari Bathini 2017-05-08 462 #ifdef CONFIG_HUGETLB_PAGE 692f66f2 Hari Bathini 2017-05-08 463 VMCOREINFO_NUMBER(HUGETLB_PAGE_DTOR); 692f66f2 Hari Bathini 2017-05-08 464 #endif 692f66f2 Hari Bathini 2017-05-08 465 692f66f2 Hari Bathini 2017-05-08 466 arch_crash_save_vmcoreinfo(); 692f66f2 Hari Bathini 2017-05-08 467 update_vmcoreinfo_note(); 692f66f2 Hari Bathini 2017-05-08 468 692f66f2 Hari Bathini 2017-05-08 469 return 0; 692f66f2 Hari Bathini 2017-05-08 470 } 692f66f2 Hari Bathini 2017-05-08 471 :::::: The code at line 461 was first introduced by commit :::::: 692f66f26a4c19d73249736aa973c13a1521b387 crash: move crashkernel parsing and vmcore related code under CONFIG_CRASH_CORE :::::: TO: Hari Bathini <hbathini@linux.vnet.ibm.com> :::::: CC: Linus Torvalds <torvalds@linux-foundation.org> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 32428 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2018-02-10 5:00 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-02-07 21:30 [PATCH] mm: Split page_type out from _map_count Matthew Wilcox 2018-02-09 10:51 ` Kirill A. Shutemov 2018-02-09 13:49 ` Matthew Wilcox 2018-02-09 15:28 ` [PATCH v2] " Matthew Wilcox 2018-02-09 18:43 ` Dave Hansen 2018-02-09 19:04 ` Christopher Lameter 2018-02-09 19:28 ` Matthew Wilcox 2018-02-10 5:00 ` [PATCH] " kbuild test robot
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).