VM_BUG_ON(!__PageMovable(page));
return (const struct movable_operations *)
- ((unsigned long)page->mapping - PAGE_MAPPING_MOVABLE);
+ ((unsigned long)page->__folio_mapping - PAGE_MAPPING_MOVABLE);
}
#ifdef CONFIG_NUMA_BALANCING
};
};
/* See page-flags.h for PAGE_MAPPING_FLAGS */
- struct address_space *mapping;
+ struct address_space *__folio_mapping;
union {
pgoff_t __folio_index; /* Our offset within mapping. */
unsigned long share; /* share count for fsdax */
static_assert(offsetof(struct page, pg) == offsetof(struct folio, fl))
FOLIO_MATCH(flags, flags);
FOLIO_MATCH(lru, lru);
-FOLIO_MATCH(mapping, mapping);
+FOLIO_MATCH(__folio_mapping, mapping);
FOLIO_MATCH(compound_head, lru);
FOLIO_MATCH(__folio_index, index);
FOLIO_MATCH(private, private);
* pgds.
* @_pt_pad_1: Padding that aliases with page's compound head.
* @pmd_huge_pte: Protected by ptdesc->ptl, used for THPs.
- * @__page_mapping: Aliases with page->mapping. Unused for page tables.
+ * @__folio_mapping: Aliases with folio->mapping. Unused for page tables.
* @pt_index: Used for s390 gmap.
* @pt_mm: Used for x86 pgds.
* @pt_frag_refcount: For fragmented page table tracking. Powerpc only.
* @pt_share_count: Used for HugeTLB PMD page table share count.
* @_pt_pad_2: Padding to ensure proper alignment.
* @ptl: Lock for the page table.
- * @__page_type: Same as page->page_type. Unused for page tables.
+ * @__page_type: Set to PGTY_table. Bottom 24 bits unused.
* @__page_refcount: Same as page refcount.
* @pt_memcg_data: Memcg data. Tracked for page tables here.
*
pgtable_t pmd_huge_pte;
};
};
- unsigned long __page_mapping;
+ unsigned long __folio_mapping;
union {
pgoff_t pt_index;
TABLE_MATCH(flags, __page_flags);
TABLE_MATCH(compound_head, pt_list);
TABLE_MATCH(compound_head, _pt_pad_1);
-TABLE_MATCH(mapping, __page_mapping);
+TABLE_MATCH(__folio_mapping, __folio_mapping);
TABLE_MATCH(__folio_index, pt_index);
TABLE_MATCH(rcu_head, pt_rcu_head);
TABLE_MATCH(page_type, __page_type);
static __always_inline bool __PageMovable(const struct page *page)
{
- return ((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) ==
+ return ((unsigned long)page->__folio_mapping & PAGE_MAPPING_FLAGS) ==
PAGE_MAPPING_MOVABLE;
}
/********** mm/page_poison.c **********/
#define PAGE_POISON 0xaa
-/********** mm/page_alloc.c ************/
-
-#define TAIL_MAPPING ((void *) 0x400 + POISON_POINTER_DELTA)
-
/********** mm/slab.c **********/
/*
* Magic nums for obj red zoning.
__entry->flags = page->flags;
__entry->count = page_ref_count(page);
__entry->mapcount = atomic_read(&page->_mapcount);
- __entry->mapping = page->mapping;
+ __entry->mapping = page->__folio_mapping;
__entry->mt = get_pageblock_migratetype(page);
__entry->val = v;
),
__entry->flags = page->flags;
__entry->count = page_ref_count(page);
__entry->mapcount = atomic_read(&page->_mapcount);
- __entry->mapping = page->mapping;
+ __entry->mapping = page->__folio_mapping;
__entry->mt = get_pageblock_migratetype(page);
__entry->val = v;
__entry->ret = ret;
VMCOREINFO_SIZE(nodemask_t);
VMCOREINFO_OFFSET(page, flags);
VMCOREINFO_OFFSET(page, _refcount);
- VMCOREINFO_OFFSET(page, mapping);
+ VMCOREINFO_OFFSET(folio, mapping);
VMCOREINFO_OFFSET(page, lru);
VMCOREINFO_OFFSET(page, _mapcount);
VMCOREINFO_OFFSET(page, private);
{
VM_BUG_ON_PAGE(!PageLocked(page), page);
VM_BUG_ON_PAGE((unsigned long)mops & PAGE_MAPPING_MOVABLE, page);
- page->mapping = (void *)((unsigned long)mops | PAGE_MAPPING_MOVABLE);
+ page->__folio_mapping = (void *)((unsigned long)mops | PAGE_MAPPING_MOVABLE);
}
EXPORT_SYMBOL(__SetPageMovable);
* This page still has the type of a movable page, but it's
* actually not movable any more.
*/
- page->mapping = (void *)PAGE_MAPPING_MOVABLE;
+ page->__folio_mapping = (void *)PAGE_MAPPING_MOVABLE;
}
EXPORT_SYMBOL(__ClearPageMovable);
{
struct page *p = head + tail_idx;
- p->mapping = TAIL_MAPPING;
set_compound_head(p, head);
set_page_private(p, 0);
}
}
/* FIXME support THP */
- if (!page || !page->mapping || PageTransCompound(page)) {
+ if (!page || !page->__folio_mapping || PageTransCompound(page)) {
mpfn = 0;
goto next;
}
if (unlikely(atomic_read(&page->_mapcount) != -1))
return false;
- if (unlikely((unsigned long)page->mapping |
+ if (unlikely((unsigned long)page->__folio_mapping |
page_ref_count(page) |
#ifdef CONFIG_MEMCG
page->memcg_data |
if (unlikely(atomic_read(&page->_mapcount) != -1))
bad_reason = "nonzero mapcount";
- if (unlikely(page->mapping != NULL))
+ if (unlikely(page->__folio_mapping != NULL))
bad_reason = "non-NULL mapping";
if (unlikely(page_ref_count(page) != 0))
bad_reason = "nonzero _refcount";
goto out;
}
switch (page - head_page) {
- case 1:
- /* the first tail page: these may be in place of ->mapping */
+ case 1: /* the first tail page */
if (unlikely(folio_large_mapcount(folio))) {
bad_page(page, "nonzero large_mapcount");
goto out;
}
}
break;
- case 2:
- /* the second tail page: deferred_list overlaps ->mapping */
+ case 2: /* the second tail page */
if (unlikely(!list_empty(&folio->_deferred_list))) {
bad_page(page, "on deferred list");
goto out;
}
}
break;
- case 3:
- /* the third tail page: hugetlb specifics overlap ->mappings */
- if (IS_ENABLED(CONFIG_HUGETLB_PAGE))
- break;
- fallthrough;
default:
- if (page->mapping != TAIL_MAPPING) {
- bad_page(page, "corrupted mapping in tail page");
- goto out;
- }
break;
}
if (unlikely(!PageTail(page))) {
}
ret = 0;
out:
- page->mapping = NULL;
+ page->__folio_mapping = NULL;
clear_compound_head(page);
return ret;
}
ZPDESC_MATCH(flags, flags);
ZPDESC_MATCH(lru, lru);
-ZPDESC_MATCH(mapping, movable_ops);
+ZPDESC_MATCH(__folio_mapping, movable_ops);
ZPDESC_MATCH(__folio_index, next);
ZPDESC_MATCH(__folio_index, handle);
ZPDESC_MATCH(private, zspage);
/********** mm/page_poison.c **********/
#define PAGE_POISON 0xaa
-/********** mm/page_alloc.c ************/
-
-#define TAIL_MAPPING ((void *) 0x400 + POISON_POINTER_DELTA)
-
/********** mm/slab.c **********/
/*
* Magic nums for obj red zoning.