Skip to content

Commit

Permalink
mm/uffd: PTE_MARKER_UFFD_WP
Browse files Browse the repository at this point in the history
This patch introduces the 1st user of pte marker: the uffd-wp marker.

When the pte marker is installed with the uffd-wp bit set, it means this pte
was wr-protected by uffd.

We will use this special pte to arm the ptes that got either unmapped or
swapped out for a file-backed region that was previously wr-protected.  This
special pte could trigger a page fault just like swap entries.

This idea is greatly inspired by Hugh and Andrea in the discussion, which is
referenced in the links below.

Some helpers are introduced to detect whether a swap pte is uffd wr-protected.
After the pte marker introduced, one swap pte can be wr-protected in two forms:
either it is a normal swap pte and it has _PAGE_SWP_UFFD_WP set, or it's a pte
marker that has PTE_MARKER_UFFD_WP set.

Link: https://lore.kernel.org/lkml/20201126222359.8120-1-peterx@redhat.com/
Link: https://lore.kernel.org/lkml/20201130230603.46187-1-peterx@redhat.com/
Suggested-by: Andrea Arcangeli <aarcange@redhat.com>
Suggested-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
  • Loading branch information
xzpeter authored and intel-lab-lkp committed Apr 5, 2022
1 parent ba5b926 commit 5baea0f
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 1 deletion.
3 changes: 2 additions & 1 deletion include/linux/swapops.h
Expand Up @@ -276,7 +276,8 @@ static inline int is_readable_migration_entry(swp_entry_t entry)

typedef unsigned long pte_marker;

#define PTE_MARKER_MASK (0)
#define PTE_MARKER_UFFD_WP BIT(0)
#define PTE_MARKER_MASK (PTE_MARKER_UFFD_WP)

#ifdef CONFIG_PTE_MARKER

Expand Down
43 changes: 43 additions & 0 deletions include/linux/userfaultfd_k.h
Expand Up @@ -15,6 +15,8 @@

#include <linux/fcntl.h>
#include <linux/mm.h>
#include <linux/swap.h>
#include <linux/swapops.h>
#include <asm-generic/pgtable_uffd.h>

/* The set of all possible UFFD-related VM flags. */
Expand Down Expand Up @@ -236,4 +238,45 @@ static inline void userfaultfd_unmap_complete(struct mm_struct *mm,

#endif /* CONFIG_USERFAULTFD */

static inline bool pte_marker_entry_uffd_wp(swp_entry_t entry)
{
return is_pte_marker_entry(entry) &&
(pte_marker_get(entry) & PTE_MARKER_UFFD_WP);
}

static inline bool pte_marker_uffd_wp(pte_t pte)
{
#ifdef CONFIG_PTE_MARKER_UFFD_WP
swp_entry_t entry;

if (!is_swap_pte(pte))
return false;

entry = pte_to_swp_entry(pte);

return pte_marker_entry_uffd_wp(entry);
#else
return false;
#endif
}

/*
* Returns true if this is a swap pte and was uffd-wp wr-protected in either
* forms (pte marker or a normal swap pte), false otherwise.
*/
static inline bool pte_swp_uffd_wp_any(pte_t pte)
{
#ifdef CONFIG_PTE_MARKER_UFFD_WP
if (!is_swap_pte(pte))
return false;

if (pte_swp_uffd_wp(pte))
return true;

if (pte_marker_uffd_wp(pte))
return true;
#endif
return false;
}

#endif /* _LINUX_USERFAULTFD_K_H */
9 changes: 9 additions & 0 deletions mm/Kconfig
Expand Up @@ -915,6 +915,15 @@ config PTE_MARKER
help
Allows to create marker PTEs for file-backed memory.

config PTE_MARKER_UFFD_WP
bool "Marker PTEs support for userfaultfd write protection"
depends on PTE_MARKER && HAVE_ARCH_USERFAULTFD_WP

help
Allows to create marker PTEs for userfaultfd write protection
purposes. It is required to enable userfaultfd write protection on
file-backed memory types like shmem and hugetlbfs.

source "mm/damon/Kconfig"

endmenu

0 comments on commit 5baea0f

Please sign in to comment.