lkml.org 
[lkml]   [2019]   [Aug]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 3/6] [RFC] x86: Add support for idle bit in swap PTE
    Date
    This bit will be used by idle page tracking code to correctly identify
    if a page that was swapped out was idle before it got swapped out.
    Without this PTE bit, we lose information about if a page is idle or not
    since the page frame gets unmapped and the page gets freed.

    Bits 2-6 are unused in the swap PTE (see the comment in
    arch/x86/include/asm/pgtable_64.h). Bit 2 corresponds to _PAGE_USER. Use
    it for swap PTE purposes.

    Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
    ---
    arch/x86/Kconfig | 1 +
    arch/x86/include/asm/pgtable.h | 15 +++++++++++++++
    arch/x86/include/asm/pgtable_types.h | 6 ++++++
    3 files changed, 22 insertions(+)

    diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
    index 222855cc0158..728f22370f17 100644
    --- a/arch/x86/Kconfig
    +++ b/arch/x86/Kconfig
    @@ -139,6 +139,7 @@ config X86
    select HAVE_ARCH_MMAP_RND_COMPAT_BITS if MMU && COMPAT
    select HAVE_ARCH_COMPAT_MMAP_BASES if MMU && COMPAT
    select HAVE_ARCH_PREL32_RELOCATIONS
    + select HAVE_ARCH_PTE_SWP_PGIDLE
    select HAVE_ARCH_SECCOMP_FILTER
    select HAVE_ARCH_THREAD_STRUCT_WHITELIST
    select HAVE_ARCH_STACKLEAK
    diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
    index 0bc530c4eb13..ef3e662cee4a 100644
    --- a/arch/x86/include/asm/pgtable.h
    +++ b/arch/x86/include/asm/pgtable.h
    @@ -1371,6 +1371,21 @@ static inline pmd_t pmd_swp_clear_soft_dirty(pmd_t pmd)
    #endif
    #endif

    +static inline pte_t pte_swp_mkpage_idle(pte_t pte)
    +{
    + return pte_set_flags(pte, _PAGE_SWP_PGIDLE);
    +}
    +
    +static inline int pte_swp_page_idle(pte_t pte)
    +{
    + return pte_flags(pte) & _PAGE_SWP_PGIDLE;
    +}
    +
    +static inline pte_t pte_swp_clear_mkpage_idle(pte_t pte)
    +{
    + return pte_clear_flags(pte, _PAGE_SWP_PGIDLE);
    +}
    +
    #define PKRU_AD_BIT 0x1
    #define PKRU_WD_BIT 0x2
    #define PKRU_BITS_PER_PKEY 2
    diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h
    index b5e49e6bac63..6739cba4c900 100644
    --- a/arch/x86/include/asm/pgtable_types.h
    +++ b/arch/x86/include/asm/pgtable_types.h
    @@ -100,6 +100,12 @@
    #define _PAGE_SWP_SOFT_DIRTY (_AT(pteval_t, 0))
    #endif

    +#ifdef CONFIG_IDLE_PAGE_TRACKING
    +#define _PAGE_SWP_PGIDLE _PAGE_USER
    +#else
    +#define _PAGE_SWP_PGIDLE (_AT(pteval_t, 0))
    +#endif
    +
    #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
    #define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX)
    #define _PAGE_DEVMAP (_AT(u64, 1) << _PAGE_BIT_DEVMAP)
    --
    2.22.0.770.g0f2c4a37fd-goog
    \
     
     \ /
      Last update: 2019-08-07 19:19    [W:2.337 / U:0.488 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site