cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pageblock-flags.h (2460B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Macros for manipulating and testing flags related to a
      4 * pageblock_nr_pages number of pages.
      5 *
      6 * Copyright (C) IBM Corporation, 2006
      7 *
      8 * Original author, Mel Gorman
      9 * Major cleanups and reduction of bit operations, Andy Whitcroft
     10 */
     11#ifndef PAGEBLOCK_FLAGS_H
     12#define PAGEBLOCK_FLAGS_H
     13
     14#include <linux/types.h>
     15
     16#define PB_migratetype_bits 3
     17/* Bit indices that affect a whole block of pages */
     18enum pageblock_bits {
     19	PB_migrate,
     20	PB_migrate_end = PB_migrate + PB_migratetype_bits - 1,
     21			/* 3 bits required for migrate types */
     22	PB_migrate_skip,/* If set the block is skipped by compaction */
     23
     24	/*
     25	 * Assume the bits will always align on a word. If this assumption
     26	 * changes then get/set pageblock needs updating.
     27	 */
     28	NR_PAGEBLOCK_BITS
     29};
     30
     31#ifdef CONFIG_HUGETLB_PAGE
     32
     33#ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE
     34
     35/* Huge page sizes are variable */
     36extern unsigned int pageblock_order;
     37
     38#else /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */
     39
     40/*
     41 * Huge pages are a constant size, but don't exceed the maximum allocation
     42 * granularity.
     43 */
     44#define pageblock_order		min_t(unsigned int, HUGETLB_PAGE_ORDER, MAX_ORDER - 1)
     45
     46#endif /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */
     47
     48#else /* CONFIG_HUGETLB_PAGE */
     49
     50/* If huge pages are not used, group by MAX_ORDER_NR_PAGES */
     51#define pageblock_order		(MAX_ORDER-1)
     52
     53#endif /* CONFIG_HUGETLB_PAGE */
     54
     55#define pageblock_nr_pages	(1UL << pageblock_order)
     56
     57/* Forward declaration */
     58struct page;
     59
     60unsigned long get_pfnblock_flags_mask(const struct page *page,
     61				unsigned long pfn,
     62				unsigned long mask);
     63
     64void set_pfnblock_flags_mask(struct page *page,
     65				unsigned long flags,
     66				unsigned long pfn,
     67				unsigned long mask);
     68
     69/* Declarations for getting and setting flags. See mm/page_alloc.c */
     70#ifdef CONFIG_COMPACTION
     71#define get_pageblock_skip(page) \
     72	get_pfnblock_flags_mask(page, page_to_pfn(page),	\
     73			(1 << (PB_migrate_skip)))
     74#define clear_pageblock_skip(page) \
     75	set_pfnblock_flags_mask(page, 0, page_to_pfn(page),	\
     76			(1 << PB_migrate_skip))
     77#define set_pageblock_skip(page) \
     78	set_pfnblock_flags_mask(page, (1 << PB_migrate_skip),	\
     79			page_to_pfn(page),			\
     80			(1 << PB_migrate_skip))
     81#else
     82static inline bool get_pageblock_skip(struct page *page)
     83{
     84	return false;
     85}
     86static inline void clear_pageblock_skip(struct page *page)
     87{
     88}
     89static inline void set_pageblock_skip(struct page *page)
     90{
     91}
     92#endif /* CONFIG_COMPACTION */
     93
     94#endif	/* PAGEBLOCK_FLAGS_H */