p!ranha?
Server IP : 103.169.32.36  /  Your IP : 216.73.217.13
Web Server : Apache
System : Linux web.dpmptsp 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64
User : apache ( 48)
PHP Version : 5.6.40
Disable Function : NONE
MySQL : ON  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /usr/lib/modules/3.10.0-1160.119.1.el7.x86_64/build/include/asm-generic/

Upload File :
Curr3nt_D!r [ Writeable ] D0cum3nt_r0Ot [ Writeable ]

 
Command :
Current File : /usr/lib/modules/3.10.0-1160.119.1.el7.x86_64/build/include/asm-generic/pgtable.h
#ifndef _ASM_GENERIC_PGTABLE_H
#define _ASM_GENERIC_PGTABLE_H

#include <linux/pfn.h>

#ifndef __ASSEMBLY__
#ifdef CONFIG_MMU

#include <linux/mm_types.h>
#include <linux/bug.h>
#include <linux/errno.h>

/*
 * On almost all architectures and configurations, 0 can be used as the
 * upper ceiling to free_pgtables(): on many architectures it has the same
 * effect as using TASK_SIZE.  However, there is one configuration which
 * must impose a more careful limit, to avoid freeing kernel pgtables.
 */
#ifndef USER_PGTABLES_CEILING
#define USER_PGTABLES_CEILING	0UL
#endif

#ifndef __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
extern int ptep_set_access_flags(struct vm_area_struct *vma,
				 unsigned long address, pte_t *ptep,
				 pte_t entry, int dirty);
#endif

#ifndef __HAVE_ARCH_PMDP_SET_ACCESS_FLAGS
extern int pmdp_set_access_flags(struct vm_area_struct *vma,
				 unsigned long address, pmd_t *pmdp,
				 pmd_t entry, int dirty);
#endif

#ifndef __HAVE_ARCH_PUDP_SET_ACCESS_FLAGS
extern int pudp_set_access_flags(struct vm_area_struct *vma,
				 unsigned long address, pud_t *pudp,
				 pud_t entry, int dirty);
#endif

#ifndef __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
static inline int ptep_test_and_clear_young(struct vm_area_struct *vma,
					    unsigned long address,
					    pte_t *ptep)
{
	pte_t pte = *ptep;
	int r = 1;
	if (!pte_young(pte))
		r = 0;
	else
		set_pte_at(vma->vm_mm, address, ptep, pte_mkold(pte));
	return r;
}
#endif

#ifndef __HAVE_ARCH_PMDP_TEST_AND_CLEAR_YOUNG
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
static inline int pmdp_test_and_clear_young(struct vm_area_struct *vma,
					    unsigned long address,
					    pmd_t *pmdp)
{
	pmd_t pmd = *pmdp;
	int r = 1;
	if (!pmd_young(pmd))
		r = 0;
	else
		set_pmd_at(vma->vm_mm, address, pmdp, pmd_mkold(pmd));
	return r;
}
#else /* CONFIG_TRANSPARENT_HUGEPAGE */
static inline int pmdp_test_and_clear_young(struct vm_area_struct *vma,
					    unsigned long address,
					    pmd_t *pmdp)
{
	BUG();
	return 0;
}
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
#endif

#ifndef __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
int ptep_clear_flush_young(struct vm_area_struct *vma,
			   unsigned long address, pte_t *ptep);
#endif

#ifndef __HAVE_ARCH_PMDP_CLEAR_YOUNG_FLUSH
int pmdp_clear_flush_young(struct vm_area_struct *vma,
			   unsigned long address, pmd_t *pmdp);
#endif

#ifndef __HAVE_ARCH_PTEP_GET_AND_CLEAR
static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
				       unsigned long address,
				       pte_t *ptep)
{
	pte_t pte = *ptep;
	pte_clear(mm, address, ptep);
	return pte;
}
#endif

#ifdef CONFIG_TRANSPARENT_HUGEPAGE
#ifndef __HAVE_ARCH_PMDP_GET_AND_CLEAR
static inline pmd_t pmdp_get_and_clear(struct mm_struct *mm,
				       unsigned long address,
				       pmd_t *pmdp)
{
	pmd_t pmd = *pmdp;
	pmd_clear(pmdp);
	return pmd;
}
#endif /* __HAVE_ARCH_PMDP_GET_AND_CLEAR */
#ifndef __HAVE_ARCH_PUDP_GET_AND_CLEAR
static inline pud_t pudp_get_and_clear(struct mm_struct *mm,
				       unsigned long address,
				       pud_t *pudp)
{
	pud_t pud = *pudp;
	pud_clear(pudp);
	return pud;
}
#endif /* __HAVE_ARCH_PUDP_GET_AND_CLEAR */
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */

#ifndef __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm,
					    unsigned long address, pte_t *ptep,
					    int full)
{
	pte_t pte;
	pte = ptep_get_and_clear(mm, address, ptep);
	return pte;
}
#endif

/*
 * Some architectures may be able to avoid expensive synchronization
 * primitives when modifications are made to PTE's which are already
 * not present, or in the process of an address space destruction.
 */
#ifndef __HAVE_ARCH_PTE_CLEAR_NOT_PRESENT_FULL
static inline void pte_clear_not_present_full(struct mm_struct *mm,
					      unsigned long address,
					      pte_t *ptep,
					      int full)
{
	pte_clear(mm, address, ptep);
}
#endif

#ifndef __HAVE_ARCH_PTEP_CLEAR_FLUSH
extern pte_t ptep_clear_flush(struct vm_area_struct *vma,
			      unsigned long address,
			      pte_t *ptep);
#endif

#ifndef __HAVE_ARCH_PMDP_CLEAR_FLUSH
extern pmd_t pmdp_clear_flush(struct vm_area_struct *vma,
			      unsigned long address,
			      pmd_t *pmdp);
#endif

#ifndef __HAVE_ARCH_PUDP_CLEAR_FLUSH
extern pud_t pudp_clear_flush(struct vm_area_struct *vma,
			      unsigned long address,
			      pud_t *pudp);
#endif

#ifndef __HAVE_ARCH_PTEP_SET_WRPROTECT
struct mm_struct;
static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long address, pte_t *ptep)
{
	pte_t old_pte = *ptep;
	set_pte_at(mm, address, ptep, pte_wrprotect(old_pte));
}
#endif

#ifndef __HAVE_ARCH_PMDP_SET_WRPROTECT
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
static inline void pmdp_set_wrprotect(struct mm_struct *mm,
				      unsigned long address, pmd_t *pmdp)
{
	pmd_t old_pmd = *pmdp;
	set_pmd_at(mm, address, pmdp, pmd_wrprotect(old_pmd));
}
#else /* CONFIG_TRANSPARENT_HUGEPAGE */
static inline void pmdp_set_wrprotect(struct mm_struct *mm,
				      unsigned long address, pmd_t *pmdp)
{
	BUG();
}
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
#endif

#ifndef __HAVE_ARCH_PUDP_SET_WRPROTECT
#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
static inline void pudp_set_wrprotect(struct mm_struct *mm,
				      unsigned long address, pud_t *pudp)
{
	pud_t old_pud = *pudp;

	set_pud_at(mm, address, pudp, pud_wrprotect(old_pud));
}
#else
static inline void pudp_set_wrprotect(struct mm_struct *mm,
				      unsigned long address, pud_t *pudp)
{
	BUILD_BUG();
}
#endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
#endif

#ifndef __HAVE_ARCH_PMDP_SPLITTING_FLUSH
extern void pmdp_splitting_flush(struct vm_area_struct *vma,
				 unsigned long address, pmd_t *pmdp);
#endif

#ifndef __HAVE_ARCH_PGTABLE_DEPOSIT
extern void pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp,
				       pgtable_t pgtable);
#endif

#ifndef __HAVE_ARCH_PGTABLE_WITHDRAW
extern pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);
#endif

#ifndef __HAVE_ARCH_PMDP_INVALIDATE
extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
			    pmd_t *pmdp);
#endif

#ifndef __HAVE_ARCH_PTE_SAME
static inline int pte_same(pte_t pte_a, pte_t pte_b)
{
	return pte_val(pte_a) == pte_val(pte_b);
}
#endif

#ifndef __HAVE_ARCH_PMD_SAME
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b)
{
	return pmd_val(pmd_a) == pmd_val(pmd_b);
}

static inline int pud_same(pud_t pud_a, pud_t pud_b)
{
	return pud_val(pud_a) == pud_val(pud_b);
}
#else /* CONFIG_TRANSPARENT_HUGEPAGE */
static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b)
{
	BUILD_BUG();
	return 0;
}

static inline int pud_same(pud_t pud_a, pud_t pud_b)
{
	BUILD_BUG();
	return 0;
}
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
#endif

#ifndef __HAVE_ARCH_PGD_OFFSET_GATE
#define pgd_offset_gate(mm, addr)	pgd_offset(mm, addr)
#endif

#ifndef __HAVE_ARCH_MOVE_PTE
#define move_pte(pte, prot, old_addr, new_addr)	(pte)
#endif

#ifndef pte_accessible
# define pte_accessible(mm, pte)	((void)(pte), 1)
#endif

#ifndef flush_tlb_fix_spurious_fault
#define flush_tlb_fix_spurious_fault(vma, address) flush_tlb_page(vma, address)
#endif

#ifndef pgprot_noncached
#define pgprot_noncached(prot)	(prot)
#endif

#ifndef pgprot_writecombine
#define pgprot_writecombine pgprot_noncached
#endif

#ifndef pgprot_device
#define pgprot_device pgprot_noncached
#endif

#ifndef pgprot_modify
#define pgprot_modify pgprot_modify
static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
{
	if (pgprot_val(oldprot) == pgprot_val(pgprot_noncached(oldprot)))
		newprot = pgprot_noncached(newprot);
	if (pgprot_val(oldprot) == pgprot_val(pgprot_writecombine(oldprot)))
		newprot = pgprot_writecombine(newprot);
	if (pgprot_val(oldprot) == pgprot_val(pgprot_device(oldprot)))
		newprot = pgprot_device(newprot);
	return newprot;
}
#endif

/*
 * When walking page tables, get the address of the next boundary,
 * or the end address of the range if that comes earlier.  Although no
 * vma end wraps to 0, rounded up __boundary may wrap to 0 throughout.
 */

#define pgd_addr_end(addr, end)						\
({	unsigned long __boundary = ((addr) + PGDIR_SIZE) & PGDIR_MASK;	\
	(__boundary - 1 < (end) - 1)? __boundary: (end);		\
})

#ifndef pud_addr_end
#define pud_addr_end(addr, end)						\
({	unsigned long __boundary = ((addr) + PUD_SIZE) & PUD_MASK;	\
	(__boundary - 1 < (end) - 1)? __boundary: (end);		\
})
#endif

#ifndef pmd_addr_end
#define pmd_addr_end(addr, end)						\
({	unsigned long __boundary = ((addr) + PMD_SIZE) & PMD_MASK;	\
	(__boundary - 1 < (end) - 1)? __boundary: (end);		\
})
#endif

/*
 * When walking page tables, we usually want to skip any p?d_none entries;
 * and any p?d_bad entries - reporting the error before resetting to none.
 * Do the tests inline, but report and clear the bad entry in mm/memory.c.
 */
void pgd_clear_bad(pgd_t *);
void pud_clear_bad(pud_t *);
void pmd_clear_bad(pmd_t *);

static inline int pgd_none_or_clear_bad(pgd_t *pgd)
{
	if (pgd_none(*pgd))
		return 1;
	if (unlikely(pgd_bad(*pgd))) {
		pgd_clear_bad(pgd);
		return 1;
	}
	return 0;
}

static inline int pud_none_or_clear_bad(pud_t *pud)
{
	if (pud_none(*pud))
		return 1;
	if (unlikely(pud_bad(*pud))) {
		pud_clear_bad(pud);
		return 1;
	}
	return 0;
}

static inline int pmd_none_or_clear_bad(pmd_t *pmd)
{
	if (pmd_none(*pmd))
		return 1;
	if (unlikely(pmd_bad(*pmd))) {
		pmd_clear_bad(pmd);
		return 1;
	}
	return 0;
}

static inline pte_t __ptep_modify_prot_start(struct mm_struct *mm,
					     unsigned long addr,
					     pte_t *ptep)
{
	/*
	 * Get the current pte state, but zero it out to make it
	 * non-present, preventing the hardware from asynchronously
	 * updating it.
	 */
	return ptep_get_and_clear(mm, addr, ptep);
}

static inline void __ptep_modify_prot_commit(struct mm_struct *mm,
					     unsigned long addr,
					     pte_t *ptep, pte_t pte)
{
	/*
	 * The pte is non-present, so there's no hardware state to
	 * preserve.
	 */
	set_pte_at(mm, addr, ptep, pte);
}

#ifndef __HAVE_ARCH_PTEP_MODIFY_PROT_TRANSACTION
/*
 * Start a pte protection read-modify-write transaction, which
 * protects against asynchronous hardware modifications to the pte.
 * The intention is not to prevent the hardware from making pte
 * updates, but to prevent any updates it may make from being lost.
 *
 * This does not protect against other software modifications of the
 * pte; the appropriate pte lock must be held over the transation.
 *
 * Note that this interface is intended to be batchable, meaning that
 * ptep_modify_prot_commit may not actually update the pte, but merely
 * queue the update to be done at some later time.  The update must be
 * actually committed before the pte lock is released, however.
 */
static inline pte_t ptep_modify_prot_start(struct mm_struct *mm,
					   unsigned long addr,
					   pte_t *ptep)
{
	return __ptep_modify_prot_start(mm, addr, ptep);
}

/*
 * Commit an update to a pte, leaving any hardware-controlled bits in
 * the PTE unmodified.
 */
static inline void ptep_modify_prot_commit(struct mm_struct *mm,
					   unsigned long addr,
					   pte_t *ptep, pte_t pte)
{
	__ptep_modify_prot_commit(mm, addr, ptep, pte);
}
#endif /* __HAVE_ARCH_PTEP_MODIFY_PROT_TRANSACTION */
#endif /* CONFIG_MMU */

/*
 * No-op macros that just return the current protection value. Defined here
 * because these macros can be used used even if CONFIG_MMU is not defined.
 */
#ifndef pgprot_encrypted
#define pgprot_encrypted(prot)	(prot)
#endif

#ifndef pgprot_decrypted
#define pgprot_decrypted(prot)	(prot)
#endif

/*
 * A facility to provide lazy MMU batching.  This allows PTE updates and
 * page invalidations to be delayed until a call to leave lazy MMU mode
 * is issued.  Some architectures may benefit from doing this, and it is
 * beneficial for both shadow and direct mode hypervisors, which may batch
 * the PTE updates which happen during this window.  Note that using this
 * interface requires that read hazards be removed from the code.  A read
 * hazard could result in the direct mode hypervisor case, since the actual
 * write to the page tables may not yet have taken place, so reads though
 * a raw PTE pointer after it has been modified are not guaranteed to be
 * up to date.  This mode can only be entered and left under the protection of
 * the page table locks for all page tables which may be modified.  In the UP
 * case, this is required so that preemption is disabled, and in the SMP case,
 * it must synchronize the delayed page table writes properly on other CPUs.
 */
#ifndef __HAVE_ARCH_ENTER_LAZY_MMU_MODE
#define arch_enter_lazy_mmu_mode()	do {} while (0)
#define arch_leave_lazy_mmu_mode()	do {} while (0)
#define arch_flush_lazy_mmu_mode()	do {} while (0)
#endif

/*
 * A facility to provide batching of the reload of page tables and
 * other process state with the actual context switch code for
 * paravirtualized guests.  By convention, only one of the batched
 * update (lazy) modes (CPU, MMU) should be active at any given time,
 * entry should never be nested, and entry and exits should always be
 * paired.  This is for sanity of maintaining and reasoning about the
 * kernel code.  In this case, the exit (end of the context switch) is
 * in architecture-specific code, and so doesn't need a generic
 * definition.
 */
#ifndef __HAVE_ARCH_START_CONTEXT_SWITCH
#define arch_start_context_switch(prev)	do {} while (0)
#endif

#ifndef CONFIG_HAVE_ARCH_SOFT_DIRTY
static inline int pte_soft_dirty(pte_t pte)
{
	return 0;
}

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

static inline pte_t pte_mksoft_dirty(pte_t pte)
{
	return pte;
}

static inline pmd_t pmd_mksoft_dirty(pmd_t pmd)
{
	return pmd;
}

static inline pte_t pte_swp_mksoft_dirty(pte_t pte)
{
	return pte;
}

static inline int pte_swp_soft_dirty(pte_t pte)
{
	return 0;
}

static inline pte_t pte_swp_clear_soft_dirty(pte_t pte)
{
	return pte;
}

static inline pte_t pte_file_clear_soft_dirty(pte_t pte)
{
       return pte;
}

static inline pte_t pte_file_mksoft_dirty(pte_t pte)
{
       return pte;
}

static inline int pte_file_soft_dirty(pte_t pte)
{
       return 0;
}
#endif

#ifndef __HAVE_PFNMAP_TRACKING
/*
 * Interfaces that can be used by architecture code to keep track of
 * memory type of pfn mappings specified by the remap_pfn_range,
 * vm_insert_pfn.
 */

/*
 * track_pfn_remap is called when a _new_ pfn mapping is being established
 * by remap_pfn_range() for physical range indicated by pfn and size.
 */
static inline int track_pfn_remap(struct vm_area_struct *vma, pgprot_t *prot,
				  unsigned long pfn, unsigned long addr,
				  unsigned long size)
{
	return 0;
}

/*
 * track_pfn_insert is called when a _new_ single pfn is established
 * by vm_insert_pfn().
 */
static inline int track_pfn_insert(struct vm_area_struct *vma, pgprot_t *prot,
				   pfn_t pfn)
{
	return 0;
}

/*
 * track_pfn_copy is called when vma that is covering the pfnmap gets
 * copied through copy_page_range().
 */
static inline int track_pfn_copy(struct vm_area_struct *vma)
{
	return 0;
}

/*
 * untrack_pfn is called while unmapping a pfnmap for a region.
 * untrack can be called for a specific region indicated by pfn and size or
 * can be for the entire vma (in which case pfn, size are zero).
 */
static inline void untrack_pfn(struct vm_area_struct *vma,
			       unsigned long pfn, unsigned long size)
{
}

/*
 * untrack_pfn_moved is called while mremapping a pfnmap for a new region.
 */
static inline void untrack_pfn_moved(struct vm_area_struct *vma)
{
}
#else
extern int track_pfn_remap(struct vm_area_struct *vma, pgprot_t *prot,
			   unsigned long pfn, unsigned long addr,
			   unsigned long size);
extern int track_pfn_insert(struct vm_area_struct *vma, pgprot_t *prot,
			    pfn_t pfn);
extern int track_pfn_copy(struct vm_area_struct *vma);
extern void untrack_pfn(struct vm_area_struct *vma, unsigned long pfn,
			unsigned long size);
extern void untrack_pfn_moved(struct vm_area_struct *vma);
#endif

#ifdef __HAVE_COLOR_ZERO_PAGE
static inline int is_zero_pfn(unsigned long pfn)
{
	extern unsigned long zero_pfn;
	unsigned long offset_from_zero_pfn = pfn - zero_pfn;
	return offset_from_zero_pfn <= (zero_page_mask >> PAGE_SHIFT);
}

#define my_zero_pfn(addr)	page_to_pfn(ZERO_PAGE(addr))

#else
static inline int is_zero_pfn(unsigned long pfn)
{
	extern unsigned long zero_pfn;
	return pfn == zero_pfn;
}

static inline unsigned long my_zero_pfn(unsigned long addr)
{
	extern unsigned long zero_pfn;
	return zero_pfn;
}
#endif

#ifdef CONFIG_MMU

#ifndef CONFIG_TRANSPARENT_HUGEPAGE
static inline int pmd_trans_huge(pmd_t pmd)
{
	return 0;
}
static inline int pmd_trans_splitting(pmd_t pmd)
{
	return 0;
}
static inline int pud_trans_huge(pud_t pud)
{
	return 0;
}
static inline int pud_trans_splitting(pud_t pud)
{
	return 0;
}
#ifndef __HAVE_ARCH_PMD_WRITE
static inline int pmd_write(pmd_t pmd)
{
	BUG();
	return 0;
}
#endif /* __HAVE_ARCH_PMD_WRITE */
#ifndef __HAVE_ARCH_PUD_WRITE
static inline int pud_write(pud_t pud)
{
	BUG();
	return 0;
}
#endif /* __HAVE_ARCH_PUD_WRITE */
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */

#if !defined(CONFIG_TRANSPARENT_HUGEPAGE) || \
	(defined(CONFIG_TRANSPARENT_HUGEPAGE) && \
	 !defined(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD))
static inline int pud_trans_huge(pud_t pud)
{
	return 0;
}
#endif

#ifndef pmd_read_atomic
static inline pmd_t pmd_read_atomic(pmd_t *pmdp)
{
	/*
	 * Depend on compiler for an atomic pmd read. NOTE: this is
	 * only going to work, if the pmdval_t isn't larger than
	 * an unsigned long.
	 */
	return *pmdp;
}
#endif

#ifndef pmd_move_must_withdraw
static inline int pmd_move_must_withdraw(spinlock_t *new_pmd_ptl,
					 spinlock_t *old_pmd_ptl)
{
	/*
	 * With split pmd lock we also need to move preallocated
	 * PTE page table if new_pmd is on different PMD page table.
	 */
	return new_pmd_ptl != old_pmd_ptl;
}
#endif

/*
 * This function is meant to be used by sites walking pagetables with
 * the mmap_sem hold in read mode to protect against MADV_DONTNEED and
 * transhuge page faults. MADV_DONTNEED can convert a transhuge pmd
 * into a null pmd and the transhuge page fault can convert a null pmd
 * into an hugepmd or into a regular pmd (if the hugepage allocation
 * fails). While holding the mmap_sem in read mode the pmd becomes
 * stable and stops changing under us only if it's not null and not a
 * transhuge pmd. When those races occurs and this function makes a
 * difference vs the standard pmd_none_or_clear_bad, the result is
 * undefined so behaving like if the pmd was none is safe (because it
 * can return none anyway). The compiler level barrier() is critically
 * important to compute the two checks atomically on the same pmdval.
 *
 * For 32bit kernels with a 64bit large pmd_t this automatically takes
 * care of reading the pmd atomically to avoid SMP race conditions
 * against pmd_populate() when the mmap_sem is hold for reading by the
 * caller (a special atomic read not done by "gcc" as in the generic
 * version above, is also needed when THP is disabled because the page
 * fault can populate the pmd from under us).
 */
static inline int pmd_none_or_trans_huge_or_clear_bad(pmd_t *pmd)
{
	pmd_t pmdval = pmd_read_atomic(pmd);
	/*
	 * The barrier will stabilize the pmdval in a register or on
	 * the stack so that it will stop changing under the code.
	 *
	 * When CONFIG_TRANSPARENT_HUGEPAGE=y on x86 32bit PAE,
	 * pmd_read_atomic is allowed to return a not atomic pmdval
	 * (for example pointing to an hugepage that has never been
	 * mapped in the pmd). The below checks will only care about
	 * the low part of the pmd with 32bit PAE x86 anyway, with the
	 * exception of pmd_none(). So the important thing is that if
	 * the low part of the pmd is found null, the high part will
	 * be also null or the pmd_none() check below would be
	 * confused.
	 */
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
	barrier();
#endif
	if (pmd_none(pmdval) || pmd_trans_huge(pmdval))
		return 1;
	if (unlikely(pmd_bad(pmdval))) {
		pmd_clear_bad(pmd);
		return 1;
	}
	return 0;
}

/*
 * This is a noop if Transparent Hugepage Support is not built into
 * the kernel. Otherwise it is equivalent to
 * pmd_none_or_trans_huge_or_clear_bad(), and shall only be called in
 * places that already verified the pmd is not none and they want to
 * walk ptes while holding the mmap sem in read mode (write mode don't
 * need this). If THP is not enabled, the pmd can't go away under the
 * code even if MADV_DONTNEED runs, but if THP is enabled we need to
 * run a pmd_trans_unstable before walking the ptes after
 * split_huge_page_pmd returns (because it may have run when the pmd
 * become null, but then a page fault can map in a THP and not a
 * regular page).
 */
static inline int pmd_trans_unstable(pmd_t *pmd)
{
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
	return pmd_none_or_trans_huge_or_clear_bad(pmd);
#else
	return 0;
#endif
}

#ifdef CONFIG_NUMA_BALANCING
#ifdef CONFIG_ARCH_USES_NUMA_PROT_NONE
/*
 * _PAGE_NUMA works identical to _PAGE_PROTNONE (it's actually the
 * same bit too). It's set only when _PAGE_PRESET is not set and it's
 * never set if _PAGE_PRESENT is set.
 *
 * pte/pmd_present() returns true if pte/pmd_numa returns true. Page
 * fault triggers on those regions if pte/pmd_numa returns true
 * (because _PAGE_PRESENT is not set).
 */
#ifndef pte_numa
static inline int pte_numa(pte_t pte)
{
	return (pte_flags(pte) &
		(_PAGE_NUMA|_PAGE_PRESENT)) == _PAGE_NUMA;
}
#endif

#ifndef pmd_numa
static inline int pmd_numa(pmd_t pmd)
{
	return (pmd_flags(pmd) &
		(_PAGE_NUMA|_PAGE_PRESENT)) == _PAGE_NUMA;
}
#endif

/*
 * pte/pmd_mknuma sets the _PAGE_ACCESSED bitflag automatically
 * because they're called by the NUMA hinting minor page fault. If we
 * wouldn't set the _PAGE_ACCESSED bitflag here, the TLB miss handler
 * would be forced to set it later while filling the TLB after we
 * return to userland. That would trigger a second write to memory
 * that we optimize away by setting _PAGE_ACCESSED here.
 */
#ifndef pte_mknonnuma
static inline pte_t pte_mknonnuma(pte_t pte)
{
	pteval_t val = pte_val(pte);

	val &= ~_PAGE_NUMA;
	val |= (_PAGE_PRESENT|_PAGE_ACCESSED);
	return __pte(val);
}
#endif

#ifndef pmd_mknonnuma
static inline pmd_t pmd_mknonnuma(pmd_t pmd)
{
	pmdval_t val = pmd_val(pmd);

	val &= ~_PAGE_NUMA;
	val |= (_PAGE_PRESENT|_PAGE_ACCESSED);

	return __pmd(val);
}
#endif

#ifndef pte_mknuma
static inline pte_t pte_mknuma(pte_t pte)
{
	pteval_t val = pte_val(pte);

	val &= ~_PAGE_PRESENT;
	val |= _PAGE_NUMA;

	return __pte(val);
}
#endif

#ifndef ptep_set_numa
static inline void ptep_set_numa(struct mm_struct *mm, unsigned long addr,
				 pte_t *ptep)
{
	pte_t ptent = *ptep;

	ptent = pte_mknuma(ptent);
	set_pte_at(mm, addr, ptep, ptent);
	return;
}
#endif

#ifndef pmd_mknuma
static inline pmd_t pmd_mknuma(pmd_t pmd)
{
	pmdval_t val = pmd_val(pmd);

	val &= ~_PAGE_PRESENT;
	val |= _PAGE_NUMA;

	return __pmd(val);
}
#endif

#ifndef pmdp_set_numa
static inline void pmdp_set_numa(struct mm_struct *mm, unsigned long addr,
				 pmd_t *pmdp)
{
	pmd_t pmd = *pmdp;

	pmd = pmd_mknuma(pmd);
	set_pmd_at(mm, addr, pmdp, pmd);
	return;
}
#endif
#else
extern int pte_numa(pte_t pte);
extern int pmd_numa(pmd_t pmd);
extern pte_t pte_mknonnuma(pte_t pte);
extern pmd_t pmd_mknonnuma(pmd_t pmd);
extern pte_t pte_mknuma(pte_t pte);
extern pmd_t pmd_mknuma(pmd_t pmd);
extern void ptep_set_numa(struct mm_struct *mm, unsigned long addr, pte_t *ptep);
extern void pmdp_set_numa(struct mm_struct *mm, unsigned long addr, pmd_t *pmdp);
#endif /* CONFIG_ARCH_USES_NUMA_PROT_NONE */
#else
static inline int pmd_numa(pmd_t pmd)
{
	return 0;
}

static inline int pte_numa(pte_t pte)
{
	return 0;
}

static inline pte_t pte_mknonnuma(pte_t pte)
{
	return pte;
}

static inline pmd_t pmd_mknonnuma(pmd_t pmd)
{
	return pmd;
}

static inline pte_t pte_mknuma(pte_t pte)
{
	return pte;
}

static inline void ptep_set_numa(struct mm_struct *mm, unsigned long addr,
				 pte_t *ptep)
{
	return;
}


static inline pmd_t pmd_mknuma(pmd_t pmd)
{
	return pmd;
}

static inline void pmdp_set_numa(struct mm_struct *mm, unsigned long addr,
				 pmd_t *pmdp)
{
	return ;
}
#endif /* CONFIG_NUMA_BALANCING */

#endif /* CONFIG_MMU */

#ifdef CONFIG_HAVE_ARCH_HUGE_VMAP
int pud_set_huge(pud_t *pud, phys_addr_t addr, pgprot_t prot);
int pmd_set_huge(pmd_t *pmd, phys_addr_t addr, pgprot_t prot);
int pud_clear_huge(pud_t *pud);
int pmd_clear_huge(pmd_t *pmd);
#else	/* !CONFIG_HAVE_ARCH_HUGE_VMAP */
static inline int pud_set_huge(pud_t *pud, phys_addr_t addr, pgprot_t prot)
{
	return 0;
}
static inline int pmd_set_huge(pmd_t *pmd, phys_addr_t addr, pgprot_t prot)
{
	return 0;
}
static inline int pud_clear_huge(pud_t *pud)
{
	return 0;
}
static inline int pmd_clear_huge(pmd_t *pmd)
{
	return 0;
}
#endif	/* CONFIG_HAVE_ARCH_HUGE_VMAP */

#ifndef __HAVE_ARCH_PFN_MODIFY_ALLOWED
static inline bool pfn_modify_allowed(unsigned long pfn, pgprot_t prot)
{
	return true;
}

static inline bool arch_has_pfn_modify_check(void)
{
	return false;
}
#endif /* !_HAVE_ARCH_PFN_MODIFY_ALLOWED */

#endif /* !__ASSEMBLY__ */

#endif /* _ASM_GENERIC_PGTABLE_H */
N4m3
5!z3
L45t M0d!f!3d
0wn3r / Gr0up
P3Rm!55!0n5
0pt!0n5
..
--
September 29 2025 07:01:09
0 / 0
0755
bitops
--
September 29 2025 07:01:10
0 / 0
0755
4level-fixup.h
1.004 KB
November 06 2023 09:15:52
0 / 0
0644
Kbuild.asm
0.043 KB
November 06 2023 09:15:52
0 / 0
0644
atomic-long.h
5.121 KB
November 06 2023 09:15:52
0 / 0
0644
atomic.h
4.346 KB
November 06 2023 09:15:52
0 / 0
0644
atomic64.h
1.797 KB
November 06 2023 09:15:52
0 / 0
0644
audit_change_attr.h
0.409 KB
November 06 2023 09:15:52
0 / 0
0644
audit_dir_write.h
0.45 KB
November 06 2023 09:15:52
0 / 0
0644
audit_read.h
0.197 KB
November 06 2023 09:15:52
0 / 0
0644
audit_signal.h
0.035 KB
November 06 2023 09:15:52
0 / 0
0644
audit_write.h
0.32 KB
November 06 2023 09:15:52
0 / 0
0644
barrier.h
2.486 KB
November 06 2023 09:15:52
0 / 0
0644
bitops.h
1.055 KB
November 06 2023 09:15:52
0 / 0
0644
bitsperlong.h
0.54 KB
November 06 2023 09:15:52
0 / 0
0644
bug.h
5.729 KB
November 06 2023 09:15:52
0 / 0
0644
bugs.h
0.223 KB
November 06 2023 09:15:52
0 / 0
0644
cache.h
0.337 KB
November 06 2023 09:15:52
0 / 0
0644
cacheflush.h
1.271 KB
November 06 2023 09:15:52
0 / 0
0644
checksum.h
2.236 KB
November 06 2023 09:15:52
0 / 0
0644
clkdev.h
0.657 KB
November 06 2023 09:15:52
0 / 0
0644
cmpxchg-local.h
1.38 KB
November 06 2023 09:15:52
0 / 0
0644
cmpxchg.h
2.311 KB
November 06 2023 09:15:52
0 / 0
0644
cputime.h
0.286 KB
November 06 2023 09:15:52
0 / 0
0644
cputime_jiffies.h
2.076 KB
November 06 2023 09:15:52
0 / 0
0644
cputime_nsecs.h
3.055 KB
November 06 2023 09:15:52
0 / 0
0644
current.h
0.212 KB
November 06 2023 09:15:52
0 / 0
0644
delay.h
1.092 KB
November 06 2023 09:15:52
0 / 0
0644
device.h
0.239 KB
November 06 2023 09:15:52
0 / 0
0644
div64.h
1.339 KB
November 06 2023 09:15:52
0 / 0
0644
dma-coherent.h
1.03 KB
November 06 2023 09:15:52
0 / 0
0644
dma.h
0.502 KB
November 06 2023 09:15:52
0 / 0
0644
emergency-restart.h
0.204 KB
November 06 2023 09:15:52
0 / 0
0644
exec.h
0.681 KB
November 06 2023 09:15:52
0 / 0
0644
fb.h
0.227 KB
November 06 2023 09:15:52
0 / 0
0644
ftrace.h
0.449 KB
November 06 2023 09:15:52
0 / 0
0644
futex.h
1.247 KB
November 06 2023 09:15:52
0 / 0
0644
getorder.h
1.414 KB
November 06 2023 09:15:52
0 / 0
0644
gpio.h
5.821 KB
November 06 2023 09:15:52
0 / 0
0644
hardirq.h
0.481 KB
November 06 2023 09:15:52
0 / 0
0644
hugetlb.h
0.74 KB
November 06 2023 09:15:52
0 / 0
0644
hw_irq.h
0.264 KB
November 06 2023 09:15:52
0 / 0
0644
ide_iops.h
0.734 KB
November 06 2023 09:15:52
0 / 0
0644
int-l64.h
0.851 KB
November 06 2023 09:15:52
0 / 0
0644
int-ll64.h
0.872 KB
November 06 2023 09:15:52
0 / 0
0644
io-64-nonatomic-hi-lo.h
0.59 KB
November 06 2023 09:15:52
0 / 0
0644
io-64-nonatomic-lo-hi.h
0.59 KB
November 06 2023 09:15:52
0 / 0
0644
io.h
19.255 KB
November 06 2023 09:15:52
0 / 0
0644
ioctl.h
0.387 KB
November 06 2023 09:15:52
0 / 0
0644
iomap.h
2.832 KB
November 06 2023 09:15:52
0 / 0
0644
irq.h
0.355 KB
November 06 2023 09:15:52
0 / 0
0644
irq_regs.h
0.957 KB
November 06 2023 09:15:52
0 / 0
0644
irq_work.h
0.15 KB
November 06 2023 09:15:52
0 / 0
0644
irqflags.h
1.469 KB
November 06 2023 09:15:52
0 / 0
0644
kdebug.h
0.14 KB
November 06 2023 09:15:52
0 / 0
0644
kexec.h
0.33 KB
November 06 2023 09:15:52
0 / 0
0644
kmap_types.h
0.155 KB
November 06 2023 09:15:52
0 / 0
0644
kvm_para.h
0.431 KB
November 06 2023 09:15:52
0 / 0
0644
libata-portmap.h
0.149 KB
November 06 2023 09:15:52
0 / 0
0644
linkage.h
0.22 KB
November 06 2023 09:15:52
0 / 0
0644
local.h
2.19 KB
November 06 2023 09:15:52
0 / 0
0644
local64.h
3.758 KB
November 06 2023 09:15:52
0 / 0
0644
memory_model.h
2.12 KB
November 06 2023 09:15:52
0 / 0
0644
mm-arch-hooks.h
0.379 KB
November 06 2023 09:15:52
0 / 0
0644
mm_hooks.h
0.938 KB
November 06 2023 09:15:52
0 / 0
0644
mmu.h
0.4 KB
November 06 2023 09:15:52
0 / 0
0644
mmu_context.h
0.915 KB
November 06 2023 09:15:52
0 / 0
0644
module.h
1.054 KB
November 06 2023 09:15:52
0 / 0
0644
mutex-dec.h
2.695 KB
November 06 2023 09:15:52
0 / 0
0644
mutex-null.h
0.633 KB
November 06 2023 09:15:52
0 / 0
0644
mutex-xchg.h
3.722 KB
November 06 2023 09:15:52
0 / 0
0644
mutex.h
0.25 KB
November 06 2023 09:15:52
0 / 0
0644
page.h
2.466 KB
November 06 2023 09:15:52
0 / 0
0644
param.h
0.32 KB
November 06 2023 09:15:52
0 / 0
0644
parport.h
0.552 KB
November 06 2023 09:15:52
0 / 0
0644
pci-dma-compat.h
0 KB
May 09 2024 13:06:31
0 / 0
0644
pci.h
0.529 KB
November 06 2023 09:15:52
0 / 0
0644
pci_iomap.h
1.496 KB
November 06 2023 09:15:52
0 / 0
0644
percpu.h
3.17 KB
November 06 2023 09:15:52
0 / 0
0644
pgalloc.h
0.296 KB
November 06 2023 09:15:52
0 / 0
0644
pgtable-nopmd.h
1.858 KB
November 06 2023 09:15:52
0 / 0
0644
pgtable-nopud.h
1.779 KB
November 06 2023 09:15:52
0 / 0
0644
pgtable.h
24.551 KB
November 06 2023 09:15:52
0 / 0
0644
ptrace.h
1.577 KB
November 06 2023 09:15:52
0 / 0
0644
qrwlock.h
5.279 KB
November 06 2023 09:15:52
0 / 0
0644
qrwlock_remap.h
1.495 KB
November 06 2023 09:15:52
0 / 0
0644
qrwlock_types.h
0.413 KB
November 06 2023 09:15:52
0 / 0
0644
qspinlock.h
4.218 KB
November 06 2023 09:15:52
0 / 0
0644
qspinlock_types.h
2.763 KB
November 06 2023 09:15:52
0 / 0
0644
resource.h
1.036 KB
November 06 2023 09:15:52
0 / 0
0644
rtc.h
5.334 KB
November 06 2023 09:15:52
0 / 0
0644
rwsem.h
2.521 KB
November 06 2023 09:15:52
0 / 0
0644
scatterlist.h
0.771 KB
November 06 2023 09:15:52
0 / 0
0644
sections.h
3.471 KB
November 06 2023 09:15:52
0 / 0
0644
segment.h
0.243 KB
November 06 2023 09:15:52
0 / 0
0644
serial.h
0.299 KB
November 06 2023 09:15:52
0 / 0
0644
siginfo.h
0.89 KB
November 06 2023 09:15:52
0 / 0
0644
signal.h
0.263 KB
November 06 2023 09:15:52
0 / 0
0644
sizes.h
0.076 KB
November 06 2023 09:15:52
0 / 0
0644
spinlock.h
0.283 KB
November 06 2023 09:15:52
0 / 0
0644
statfs.h
0.127 KB
November 06 2023 09:15:52
0 / 0
0644
string.h
0.274 KB
November 06 2023 09:15:52
0 / 0
0644
switch_to.h
0.969 KB
November 06 2023 09:15:52
0 / 0
0644
syscall.h
6.179 KB
November 06 2023 09:15:52
0 / 0
0644
syscalls.h
0.684 KB
November 06 2023 09:15:52
0 / 0
0644
termios-base.h
2.073 KB
November 06 2023 09:15:52
0 / 0
0644
termios.h
2.77 KB
November 06 2023 09:15:52
0 / 0
0644
timex.h
0.458 KB
November 06 2023 09:15:52
0 / 0
0644
tlb.h
6.997 KB
November 06 2023 09:15:52
0 / 0
0644
tlbflush.h
0.436 KB
November 06 2023 09:15:52
0 / 0
0644
topology.h
2.112 KB
November 06 2023 09:15:52
0 / 0
0644
trace_clock.h
0.344 KB
November 06 2023 09:15:52
0 / 0
0644
uaccess-unaligned.h
0.716 KB
November 06 2023 09:15:52
0 / 0
0644
uaccess.h
7.635 KB
November 06 2023 09:15:52
0 / 0
0644
unaligned.h
0.886 KB
November 06 2023 09:15:52
0 / 0
0644
unistd.h
0.272 KB
November 06 2023 09:15:52
0 / 0
0644
user.h
0.236 KB
November 06 2023 09:15:52
0 / 0
0644
vga.h
0.535 KB
November 06 2023 09:15:52
0 / 0
0644
vmlinux.lds.h
26.37 KB
November 06 2023 09:15:52
0 / 0
0644
vtime.h
0 KB
May 09 2024 13:06:31
0 / 0
0644
word-at-a-time.h
1.161 KB
November 06 2023 09:15:52
0 / 0
0644
xor.h
13.634 KB
November 06 2023 09:15:52
0 / 0
0644