aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/mm.h4
-rw-r--r--include/linux/page-flags.h22
-rw-r--r--mm/memblock.c2
3 files changed, 21 insertions, 7 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h
index f945dff34925..2e40a44a1fae 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -903,7 +903,9 @@ extern int page_to_nid(const struct page *page);
903#else 903#else
904static inline int page_to_nid(const struct page *page) 904static inline int page_to_nid(const struct page *page)
905{ 905{
906 return (page->flags >> NODES_PGSHIFT) & NODES_MASK; 906 struct page *p = (struct page *)page;
907
908 return (PF_POISONED_CHECK(p)->flags >> NODES_PGSHIFT) & NODES_MASK;
907} 909}
908#endif 910#endif
909 911
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index 50c2b8786831..e34a27727b9a 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -156,9 +156,18 @@ static __always_inline int PageCompound(struct page *page)
156 return test_bit(PG_head, &page->flags) || PageTail(page); 156 return test_bit(PG_head, &page->flags) || PageTail(page);
157} 157}
158 158
159#define PAGE_POISON_PATTERN -1l
160static inline int PagePoisoned(const struct page *page)
161{
162 return page->flags == PAGE_POISON_PATTERN;
163}
164
159/* 165/*
160 * Page flags policies wrt compound pages 166 * Page flags policies wrt compound pages
161 * 167 *
168 * PF_POISONED_CHECK
169 * check if this struct page poisoned/uninitialized
170 *
162 * PF_ANY: 171 * PF_ANY:
163 * the page flag is relevant for small, head and tail pages. 172 * the page flag is relevant for small, head and tail pages.
164 * 173 *
@@ -176,17 +185,20 @@ static __always_inline int PageCompound(struct page *page)
176 * PF_NO_COMPOUND: 185 * PF_NO_COMPOUND:
177 * the page flag is not relevant for compound pages. 186 * the page flag is not relevant for compound pages.
178 */ 187 */
179#define PF_ANY(page, enforce) page 188#define PF_POISONED_CHECK(page) ({ \
180#define PF_HEAD(page, enforce) compound_head(page) 189 VM_BUG_ON_PGFLAGS(PagePoisoned(page), page); \
190 page; })
191#define PF_ANY(page, enforce) PF_POISONED_CHECK(page)
192#define PF_HEAD(page, enforce) PF_POISONED_CHECK(compound_head(page))
181#define PF_ONLY_HEAD(page, enforce) ({ \ 193#define PF_ONLY_HEAD(page, enforce) ({ \
182 VM_BUG_ON_PGFLAGS(PageTail(page), page); \ 194 VM_BUG_ON_PGFLAGS(PageTail(page), page); \
183 page;}) 195 PF_POISONED_CHECK(page); })
184#define PF_NO_TAIL(page, enforce) ({ \ 196#define PF_NO_TAIL(page, enforce) ({ \
185 VM_BUG_ON_PGFLAGS(enforce && PageTail(page), page); \ 197 VM_BUG_ON_PGFLAGS(enforce && PageTail(page), page); \
186 compound_head(page);}) 198 PF_POISONED_CHECK(compound_head(page)); })
187#define PF_NO_COMPOUND(page, enforce) ({ \ 199#define PF_NO_COMPOUND(page, enforce) ({ \
188 VM_BUG_ON_PGFLAGS(enforce && PageCompound(page), page); \ 200 VM_BUG_ON_PGFLAGS(enforce && PageCompound(page), page); \
189 page;}) 201 PF_POISONED_CHECK(page); })
190 202
191/* 203/*
192 * Macros to create function definitions for page flags 204 * Macros to create function definitions for page flags
diff --git a/mm/memblock.c b/mm/memblock.c
index f7f76513a0c5..c2fed302c2f8 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -1345,7 +1345,7 @@ void * __init memblock_virt_alloc_try_nid_raw(
1345 min_addr, max_addr, nid); 1345 min_addr, max_addr, nid);
1346#ifdef CONFIG_DEBUG_VM 1346#ifdef CONFIG_DEBUG_VM
1347 if (ptr && size > 0) 1347 if (ptr && size > 0)
1348 memset(ptr, 0xff, size); 1348 memset(ptr, PAGE_POISON_PATTERN, size);
1349#endif 1349#endif
1350 return ptr; 1350 return ptr;
1351} 1351}