cregit-Linux how code gets into the kernel

Release 4.15 include/linux/swapops.h

Directory: include/linux
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_SWAPOPS_H

#define _LINUX_SWAPOPS_H

#include <linux/radix-tree.h>
#include <linux/bug.h>

/*
 * swapcache pages are stored in the swapper_space radix tree.  We want to
 * get good packing density in that tree, so the index should be dense in
 * the low-order bits.
 *
 * We arrange the `type' and `offset' fields so that `type' is at the seven
 * high-order bits of the swp_entry_t and `offset' is right-aligned in the
 * remaining bits.  Although `type' itself needs only five bits, we allow for
 * shmem/tmpfs to shift it all up a further two bits: see swp_to_radix_entry().
 *
 * swp_entry_t's are *never* stored anywhere in their arch-dependent format.
 */

#define SWP_TYPE_SHIFT(e)	((sizeof(e.val) * 8) - \
                        (MAX_SWAPFILES_SHIFT + RADIX_TREE_EXCEPTIONAL_SHIFT))

#define SWP_OFFSET_MASK(e)	((1UL << SWP_TYPE_SHIFT(e)) - 1)

/*
 * Store a type+offset into a swp_entry_t in an arch-independent format
 */

static inline swp_entry_t swp_entry(unsigned long type, pgoff_t offset) { swp_entry_t ret; ret.val = (type << SWP_TYPE_SHIFT(ret)) | (offset & SWP_OFFSET_MASK(ret)); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton42100.00%2100.00%
Total42100.00%2100.00%

/* * Extract the `type' field from a swp_entry_t. The swp_entry_t is in * arch-independent format */
static inline unsigned swp_type(swp_entry_t entry) { return (entry.val >> SWP_TYPE_SHIFT(entry)); }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton22100.00%1100.00%
Total22100.00%1100.00%

/* * Extract the `offset' field from a swp_entry_t. The swp_entry_t is in * arch-independent format */
static inline pgoff_t swp_offset(swp_entry_t entry) { return entry.val & SWP_OFFSET_MASK(entry); }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton20100.00%1100.00%
Total20100.00%1100.00%

#ifdef CONFIG_MMU /* check whether a pte points to a swap entry */
static inline int is_swap_pte(pte_t pte) { return !pte_none(pte) && !pte_present(pte); }

Contributors

PersonTokensPropCommitsCommitProp
Matt Mackall2295.65%150.00%
Mel Gorman14.35%150.00%
Total23100.00%2100.00%

#endif /* * Convert the arch-dependent pte representation of a swp_entry_t into an * arch-independent swp_entry_t. */
static inline swp_entry_t pte_to_swp_entry(pte_t pte) { swp_entry_t arch_entry; if (pte_swp_soft_dirty(pte)) pte = pte_swp_clear_soft_dirty(pte); arch_entry = __pte_to_swp_entry(pte); return swp_entry(__swp_type(arch_entry), __swp_offset(arch_entry)); }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton3470.83%150.00%
Cyrill V. Gorcunov1429.17%150.00%
Total48100.00%2100.00%

/* * Convert the arch-independent representation of a swp_entry_t into the * arch-dependent pte representation. */
static inline pte_t swp_entry_to_pte(swp_entry_t entry) { swp_entry_t arch_entry; arch_entry = __swp_entry(swp_type(entry), swp_offset(entry)); return __swp_entry_to_pte(arch_entry); }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton34100.00%1100.00%
Total34100.00%1100.00%


static inline swp_entry_t radix_to_swp_entry(void *arg) { swp_entry_t entry; entry.val = (unsigned long)arg >> RADIX_TREE_EXCEPTIONAL_SHIFT; return entry; }

Contributors

PersonTokensPropCommitsCommitProp
Hugh Dickins29100.00%1100.00%
Total29100.00%1100.00%


static inline void *swp_to_radix_entry(swp_entry_t entry) { unsigned long value; value = entry.val << RADIX_TREE_EXCEPTIONAL_SHIFT; return (void *)(value | RADIX_TREE_EXCEPTIONAL_ENTRY); }

Contributors

PersonTokensPropCommitsCommitProp
Hugh Dickins34100.00%1100.00%
Total34100.00%1100.00%

#if IS_ENABLED(CONFIG_DEVICE_PRIVATE)
static inline swp_entry_t make_device_private_entry(struct page *page, bool write) { return swp_entry(write ? SWP_DEVICE_WRITE : SWP_DEVICE_READ, page_to_pfn(page)); }

Contributors

PersonTokensPropCommitsCommitProp
Jérôme Glisse30100.00%1100.00%
Total30100.00%1100.00%


static inline bool is_device_private_entry(swp_entry_t entry) { int type = swp_type(entry); return type == SWP_DEVICE_READ || type == SWP_DEVICE_WRITE; }

Contributors

PersonTokensPropCommitsCommitProp
Jérôme Glisse27100.00%1100.00%
Total27100.00%1100.00%


static inline void make_device_private_entry_read(swp_entry_t *entry) { *entry = swp_entry(SWP_DEVICE_READ, swp_offset(*entry)); }

Contributors

PersonTokensPropCommitsCommitProp
Jérôme Glisse25100.00%1100.00%
Total25100.00%1100.00%


static inline bool is_write_device_private_entry(swp_entry_t entry) { return unlikely(swp_type(entry) == SWP_DEVICE_WRITE); }

Contributors

PersonTokensPropCommitsCommitProp
Jérôme Glisse21100.00%1100.00%
Total21100.00%1100.00%


static inline unsigned long device_private_entry_to_pfn(swp_entry_t entry) { return swp_offset(entry); }

Contributors

PersonTokensPropCommitsCommitProp
Kirill A. Shutemov17100.00%1100.00%
Total17100.00%1100.00%


static inline struct page *device_private_entry_to_page(swp_entry_t entry) { return pfn_to_page(swp_offset(entry)); }

Contributors

PersonTokensPropCommitsCommitProp
Jérôme Glisse21100.00%1100.00%
Total21100.00%1100.00%

int device_private_entry_fault(struct vm_area_struct *vma, unsigned long addr, swp_entry_t entry, unsigned int flags, pmd_t *pmdp); #else /* CONFIG_DEVICE_PRIVATE */
static inline swp_entry_t make_device_private_entry(struct page *page, bool write) { return swp_entry(0, 0); }

Contributors

PersonTokensPropCommitsCommitProp
Jérôme Glisse23100.00%1100.00%
Total23100.00%1100.00%


static inline void make_device_private_entry_read(swp_entry_t *entry) { }

Contributors

PersonTokensPropCommitsCommitProp
Jérôme Glisse10100.00%1100.00%
Total10100.00%1100.00%


static inline bool is_device_private_entry(swp_entry_t entry) { return false; }

Contributors

PersonTokensPropCommitsCommitProp
Jérôme Glisse13100.00%1100.00%
Total13100.00%1100.00%


static inline bool is_write_device_private_entry(swp_entry_t entry) { return false; }

Contributors

PersonTokensPropCommitsCommitProp
Jérôme Glisse13100.00%1100.00%
Total13100.00%1100.00%


static inline unsigned long device_private_entry_to_pfn(swp_entry_t entry) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Kirill A. Shutemov14100.00%1100.00%
Total14100.00%1100.00%


static inline struct page *device_private_entry_to_page(swp_entry_t entry) { return NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Jérôme Glisse15100.00%1100.00%
Total15100.00%1100.00%


static inline int device_private_entry_fault(struct vm_area_struct *vma, unsigned long addr, swp_entry_t entry, unsigned int flags, pmd_t *pmdp) { return VM_FAULT_SIGBUS; }

Contributors

PersonTokensPropCommitsCommitProp
Jérôme Glisse30100.00%1100.00%
Total30100.00%1100.00%

#endif /* CONFIG_DEVICE_PRIVATE */ #ifdef CONFIG_MIGRATION
static inline swp_entry_t make_migration_entry(struct page *page, int write) { BUG_ON(!PageLocked(compound_head(page))); return swp_entry(write ? SWP_MIGRATION_WRITE : SWP_MIGRATION_READ, page_to_pfn(page)); }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Lameter3992.86%150.00%
Zi Yan37.14%150.00%
Total42100.00%2100.00%


static inline int is_migration_entry(swp_entry_t entry) { return unlikely(swp_type(entry) == SWP_MIGRATION_READ || swp_type(entry) == SWP_MIGRATION_WRITE); }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Lameter28100.00%1100.00%
Total28100.00%1100.00%


static inline int is_write_migration_entry(swp_entry_t entry) { return unlikely(swp_type(entry) == SWP_MIGRATION_WRITE); }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Lameter21100.00%1100.00%
Total21100.00%1100.00%


static inline unsigned long migration_entry_to_pfn(swp_entry_t entry) { return swp_offset(entry); }

Contributors

PersonTokensPropCommitsCommitProp
Kirill A. Shutemov17100.00%1100.00%
Total17100.00%1100.00%


static inline struct page *migration_entry_to_page(swp_entry_t entry) { struct page *p = pfn_to_page(swp_offset(entry)); /* * Any use of migration entries may only occur while the * corresponding page is locked */ BUG_ON(!PageLocked(compound_head(p))); return p; }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Lameter3892.68%150.00%
Zi Yan37.32%150.00%
Total41100.00%2100.00%


static inline void make_migration_entry_read(swp_entry_t *entry) { *entry = swp_entry(SWP_MIGRATION_READ, swp_offset(*entry)); }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Lameter25100.00%1100.00%
Total25100.00%1100.00%

extern void __migration_entry_wait(struct mm_struct *mm, pte_t *ptep, spinlock_t *ptl); extern void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, unsigned long address); extern void migration_entry_wait_huge(struct vm_area_struct *vma, struct mm_struct *mm, pte_t *pte); #else #define make_migration_entry(page, write) swp_entry(0, 0)
static inline int is_migration_entry(swp_entry_t swp) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton969.23%150.00%
Christoph Lameter430.77%150.00%
Total13100.00%2100.00%


static inline unsigned long migration_entry_to_pfn(swp_entry_t entry) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Kirill A. Shutemov14100.00%1100.00%
Total14100.00%1100.00%


static inline struct page *migration_entry_to_page(swp_entry_t entry) { return NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Zi Yan1280.00%150.00%
Christoph Lameter320.00%150.00%
Total15100.00%2100.00%


static inline void make_migration_entry_read(swp_entry_t *entryp) { }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Lameter10100.00%1100.00%
Total10100.00%1100.00%


static inline void __migration_entry_wait(struct mm_struct *mm, pte_t *ptep, spinlock_t *ptl) { }

Contributors

PersonTokensPropCommitsCommitProp
Naoya Horiguchi19100.00%1100.00%
Total19100.00%1100.00%


static inline void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, unsigned long address) { }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Lameter19100.00%1100.00%
Total19100.00%1100.00%


static inline void migration_entry_wait_huge(struct vm_area_struct *vma, struct mm_struct *mm, pte_t *pte) { }

Contributors

PersonTokensPropCommitsCommitProp
Naoya Horiguchi1575.00%150.00%
Kirill A. Shutemov525.00%150.00%
Total20100.00%2100.00%


static inline int is_write_migration_entry(swp_entry_t entry) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Lameter13100.00%1100.00%
Total13100.00%1100.00%

#endif struct page_vma_mapped_walk; #ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION extern void set_pmd_migration_entry(struct page_vma_mapped_walk *pvmw, struct page *page); extern void remove_migration_pmd(struct page_vma_mapped_walk *pvmw, struct page *new); extern void pmd_migration_entry_wait(struct mm_struct *mm, pmd_t *pmd);
static inline swp_entry_t pmd_to_swp_entry(pmd_t pmd) { swp_entry_t arch_entry; if (pmd_swp_soft_dirty(pmd)) pmd = pmd_swp_clear_soft_dirty(pmd); arch_entry = __pmd_to_swp_entry(pmd); return swp_entry(__swp_type(arch_entry), __swp_offset(arch_entry)); }

Contributors

PersonTokensPropCommitsCommitProp
Zi Yan3470.83%150.00%
Naoya Horiguchi1429.17%150.00%
Total48100.00%2100.00%


static inline pmd_t swp_entry_to_pmd(swp_entry_t entry) { swp_entry_t arch_entry; arch_entry = __swp_entry(swp_type(entry), swp_offset(entry)); return __swp_entry_to_pmd(arch_entry); }

Contributors

PersonTokensPropCommitsCommitProp
Zi Yan34100.00%1100.00%
Total34100.00%1100.00%


static inline int is_pmd_migration_entry(pmd_t pmd) { return !pmd_present(pmd) && is_migration_entry(pmd_to_swp_entry(pmd)); }

Contributors

PersonTokensPropCommitsCommitProp
Zi Yan25100.00%1100.00%
Total25100.00%1100.00%

#else
static inline void set_pmd_migration_entry(struct page_vma_mapped_walk *pvmw, struct page *page) { BUILD_BUG(); }

Contributors

PersonTokensPropCommitsCommitProp
Zi Yan20100.00%1100.00%
Total20100.00%1100.00%


static inline void remove_migration_pmd(struct page_vma_mapped_walk *pvmw, struct page *new) { BUILD_BUG(); }

Contributors

PersonTokensPropCommitsCommitProp
Zi Yan20100.00%1100.00%
Total20100.00%1100.00%


static inline void pmd_migration_entry_wait(struct mm_struct *m, pmd_t *p) { }

Contributors

PersonTokensPropCommitsCommitProp
Zi Yan15100.00%1100.00%
Total15100.00%1100.00%


static inline swp_entry_t pmd_to_swp_entry(pmd_t pmd) { return swp_entry(0, 0); }

Contributors

PersonTokensPropCommitsCommitProp
Zi Yan18100.00%1100.00%
Total18100.00%1100.00%


static inline pmd_t swp_entry_to_pmd(swp_entry_t entry) { return __pmd(0); }

Contributors

PersonTokensPropCommitsCommitProp
Zi Yan16100.00%1100.00%
Total16100.00%1100.00%


static inline int is_pmd_migration_entry(pmd_t pmd) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Zi Yan13100.00%1100.00%
Total13100.00%1100.00%

#endif #ifdef CONFIG_MEMORY_FAILURE extern atomic_long_t num_poisoned_pages __read_mostly; /* * Support for hardware poisoned pages */
static inline swp_entry_t make_hwpoison_entry(struct page *page) { BUG_ON(!PageLocked(page)); return swp_entry(SWP_HWPOISON, page_to_pfn(page)); }

Contributors

PersonTokensPropCommitsCommitProp
Andi Kleen32100.00%1100.00%
Total32100.00%1100.00%


static inline int is_hwpoison_entry(swp_entry_t entry) { return swp_type(entry) == SWP_HWPOISON; }

Contributors

PersonTokensPropCommitsCommitProp
Andi Kleen18100.00%1100.00%
Total18100.00%1100.00%


static inline bool test_set_page_hwpoison(struct page *page) { return TestSetPageHWPoison(page); }

Contributors

PersonTokensPropCommitsCommitProp
Wanpeng Li18100.00%1100.00%
Total18100.00%1100.00%


static inline void num_poisoned_pages_inc(void) { atomic_long_inc(&num_poisoned_pages); }

Contributors

PersonTokensPropCommitsCommitProp
Naoya Horiguchi15100.00%1100.00%
Total15100.00%1100.00%


static inline void num_poisoned_pages_dec(void) { atomic_long_dec(&num_poisoned_pages); }

Contributors

PersonTokensPropCommitsCommitProp
Naoya Horiguchi15100.00%1100.00%
Total15100.00%1100.00%

#else
static inline swp_entry_t make_hwpoison_entry(struct page *page) { return swp_entry(0, 0); }

Contributors

PersonTokensPropCommitsCommitProp
Andi Kleen20100.00%1100.00%
Total20100.00%1100.00%


static inline int is_hwpoison_entry(swp_entry_t swp) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Andi Kleen13100.00%1100.00%
Total13100.00%1100.00%


static inline bool test_set_page_hwpoison(struct page *page) { return false; }

Contributors

PersonTokensPropCommitsCommitProp
Wanpeng Li15100.00%1100.00%
Total15100.00%1100.00%


static inline void num_poisoned_pages_inc(void) { }

Contributors

PersonTokensPropCommitsCommitProp
Wanpeng Li8100.00%1100.00%
Total8100.00%1100.00%

#endif #if defined(CONFIG_MEMORY_FAILURE) || defined(CONFIG_MIGRATION)
static inline int non_swap_entry(swp_entry_t entry) { return swp_type(entry) >= MAX_SWAPFILES; }

Contributors

PersonTokensPropCommitsCommitProp
Andi Kleen18100.00%1100.00%
Total18100.00%1100.00%

#else
static inline int non_swap_entry(swp_entry_t entry) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Andi Kleen13100.00%1100.00%
Total13100.00%1100.00%

#endif #endif /* _LINUX_SWAPOPS_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
Zi Yan26718.63%14.35%
Jérôme Glisse26418.42%14.35%
Christoph Lameter23416.33%14.35%
Andrew Morton17812.42%313.04%
Andi Kleen1379.56%14.35%
Naoya Horiguchi1158.03%417.39%
Hugh Dickins775.37%28.70%
Kirill A. Shutemov725.02%28.70%
Wanpeng Li412.86%14.35%
Matt Mackall281.95%28.70%
Cyrill V. Gorcunov140.98%14.35%
Paul Gortmaker30.21%14.35%
Greg Kroah-Hartman10.07%14.35%
Anton Blanchard10.07%14.35%
Mel Gorman10.07%14.35%
Total1433100.00%23100.00%
Directory: include/linux
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.