page_ext
static struct iommu_debug_metadata *get_iommu_data(struct page_ext *page_ext)
return page_ext_data(page_ext, &page_iommu_debug_ops);
struct page_ext *page_ext = page_ext_from_phys(phys);
if (!page_ext)
d = get_iommu_data(page_ext);
page_ext_put(page_ext);
struct page_ext *page_ext = page_ext_from_phys(phys);
if (!page_ext)
d = get_iommu_data(page_ext);
page_ext_put(page_ext);
struct page_ext *page_ext = page_ext_get(page);
struct iommu_debug_metadata *d = get_iommu_data(page_ext);
page_ext_put(page_ext);
struct page_ext *node_page_ext;
struct page_ext;
struct page_ext *page_ext;
static inline void *page_ext_data(struct page_ext *page_ext,
return (void *)(page_ext) + ops->offset;
static inline struct page_ext *page_ext_next(struct page_ext *curr)
struct page_ext *page_ext;
static inline struct page_ext *page_ext_iter_begin(struct page_ext_iter *iter,
iter->page_ext = page_ext_lookup(pfn);
return iter->page_ext;
static inline struct page_ext *page_ext_iter_next(struct page_ext_iter *iter,
if (WARN_ON_ONCE(!iter->page_ext))
iter->page_ext = page_ext_next(iter->page_ext);
iter->page_ext = page_ext_lookup(pfn);
return iter->page_ext;
static inline struct page_ext *page_ext_iter_get(const struct page_ext_iter *iter)
return iter->page_ext;
struct page_ext;
static inline struct page_ext *page_ext_get(const struct page *page)
static inline struct page_ext *page_ext_from_phys(phys_addr_t phys)
static inline void page_ext_put(struct page_ext *page_ext)
extern struct page_ext *page_ext_get(const struct page *page);
extern struct page_ext *page_ext_from_phys(phys_addr_t phys);
extern void page_ext_put(struct page_ext *page_ext);
extern struct page_ext *page_ext_lookup(unsigned long pfn);
struct page_ext *page_ext = page_ext_get(&folio->page);
if (unlikely(!page_ext))
page_young = test_bit(PAGE_EXT_YOUNG, &page_ext->flags);
page_ext_put(page_ext);
struct page_ext *page_ext = page_ext_get(&folio->page);
if (unlikely(!page_ext))
set_bit(PAGE_EXT_YOUNG, &page_ext->flags);
page_ext_put(page_ext);
struct page_ext *page_ext = page_ext_get(&folio->page);
if (unlikely(!page_ext))
page_young = test_and_clear_bit(PAGE_EXT_YOUNG, &page_ext->flags);
page_ext_put(page_ext);
struct page_ext *page_ext = page_ext_get(&folio->page);
if (unlikely(!page_ext))
page_idle = test_bit(PAGE_EXT_IDLE, &page_ext->flags);
page_ext_put(page_ext);
struct page_ext *page_ext = page_ext_get(&folio->page);
if (unlikely(!page_ext))
set_bit(PAGE_EXT_IDLE, &page_ext->flags);
page_ext_put(page_ext);
struct page_ext *page_ext = page_ext_get(&folio->page);
if (unlikely(!page_ext))
clear_bit(PAGE_EXT_IDLE, &page_ext->flags);
page_ext_put(page_ext);
struct page_ext *page_ext;
page_ext = page_ext_get(page);
if (!page_ext)
tmp = (union codetag_ref *)page_ext_data(page_ext, &page_alloc_tagging_ops);
page_ext_size = sizeof(struct page_ext);
static inline struct page_ext *get_entry(void *base, unsigned long index)
static struct page_ext *lookup_page_ext(const struct page *page)
struct page_ext *base;
struct page_ext *base;
static bool page_ext_invalid(struct page_ext *page_ext)
return !page_ext || (((unsigned long)page_ext & PAGE_EXT_INVALID) == PAGE_EXT_INVALID);
static struct page_ext *lookup_page_ext(const struct page *page)
struct page_ext *page_ext = READ_ONCE(section->page_ext);
if (page_ext_invalid(page_ext))
return get_entry(page_ext, pfn);
struct page_ext *base;
if (section->page_ext)
section->page_ext = (void *)base - page_ext_size * pfn;
struct page_ext *base;
if (!ms || !ms->page_ext)
base = READ_ONCE(ms->page_ext);
WRITE_ONCE(ms->page_ext, NULL);
if (!ms || !ms->page_ext)
val = (void *)ms->page_ext + PAGE_EXT_INVALID;
WRITE_ONCE(ms->page_ext, val);
struct page_ext *page_ext_lookup(unsigned long pfn)
struct page_ext *page_ext_get(const struct page *page)
struct page_ext *page_ext;
page_ext = lookup_page_ext(page);
if (!page_ext) {
return page_ext;
struct page_ext *page_ext_from_phys(phys_addr_t phys)
void page_ext_put(struct page_ext *page_ext)
if (unlikely(!page_ext))
static inline struct page_owner *get_page_owner(struct page_ext *page_ext)
return page_ext_data(page_ext, &page_owner_ops);
struct page_ext *page_ext;
for_each_page_ext(page, 1 << order, page_ext, iter) {
page_owner = get_page_owner(page_ext);
__set_bit(PAGE_EXT_OWNER, &page_ext->flags);
__set_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags);
struct page_ext *page_ext;
for_each_page_ext(page, 1 << order, page_ext, iter) {
page_owner = get_page_owner(page_ext);
__clear_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags);
struct page_ext *page_ext;
page_ext = page_ext_get(page);
if (unlikely(!page_ext))
page_owner = get_page_owner(page_ext);
page_ext_put(page_ext);
struct page_ext *page_ext = page_ext_get(&folio->page);
if (unlikely(!page_ext))
page_owner = get_page_owner(page_ext);
page_ext_put(page_ext);
struct page_ext *page_ext;
for_each_page_ext(page, 1 << old_order, page_ext, iter) {
page_owner = get_page_owner(page_ext);
struct page_ext *page_ext;
page_ext = page_ext_get(&old->page);
if (unlikely(!page_ext))
old_page_owner = get_page_owner(page_ext);
page_ext_put(page_ext);
page_ext = page_ext_get(&newfolio->page);
if (unlikely(!page_ext))
new_page_owner = get_page_owner(page_ext);
page_ext_put(page_ext);
for_each_page_ext(&old->page, 1 << new_page_owner->order, page_ext, iter) {
old_page_owner = get_page_owner(page_ext);
struct page_ext *page_ext;
page_ext = page_ext_get(page);
if (unlikely(!page_ext))
if (!test_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags))
page_owner = get_page_owner(page_ext);
page_ext_put(page_ext);
page_ext_put(page_ext);
struct page_ext *page_ext = page_ext_get((void *)page);
if (unlikely(!page_ext)) {
page_owner = get_page_owner(page_ext);
if (!test_bit(PAGE_EXT_OWNER, &page_ext->flags)) {
page_ext_put(page_ext);
if (test_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags))
page_ext_put(page_ext);
struct page_ext *page_ext;
page_ext = page_ext_get(page);
if (unlikely(!page_ext))
if (!test_bit(PAGE_EXT_OWNER, &page_ext->flags))
if (!test_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags))
page_owner = get_page_owner(page_ext);
page_ext_put(page_ext);
page_ext_put(page_ext);
struct page_ext *page_ext;
page_ext = page_ext_get(page);
if (unlikely(!page_ext))
if (test_bit(PAGE_EXT_OWNER, &page_ext->flags))
page_ext_put(page_ext);
struct page_ext *page_ext;
for_each_page_ext(page, pgcnt, page_ext, iter) {
struct page_table_check *ptc = get_page_table_check(page_ext);
struct page_ext *page_ext;
for_each_page_ext(page, 1 << order, page_ext, iter) {
struct page_table_check *ptc = get_page_table_check(page_ext);
static struct page_table_check *get_page_table_check(struct page_ext *page_ext)
BUG_ON(!page_ext);
return page_ext_data(page_ext, &page_table_check_ops);
struct page_ext *page_ext;
for_each_page_ext(page, pgcnt, page_ext, iter) {
struct page_table_check *ptc = get_page_table_check(page_ext);