]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - arch/riscv/include/asm/pgtable.h
Merge tag 'mm-stable-2023-02-20-13-37' of git://git.kernel.org/pub/scm/linux/kernel...
[thirdparty/linux.git] / arch / riscv / include / asm / pgtable.h
index 3e01f4f3ab08aa9ec797390032d109d5e33264c3..d8d8de0ded992d3862c2d058c06f356ce7fa50c3 100644 (file)
@@ -728,16 +728,18 @@ extern pmd_t pmdp_collapse_flush(struct vm_area_struct *vma,
 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
 
 /*
- * Encode and decode a swap entry
+ * Encode/decode swap entries and swap PTEs. Swap PTEs are all PTEs that
+ * are !pte_none() && !pte_present().
  *
  * Format of swap PTE:
  *     bit            0:       _PAGE_PRESENT (zero)
  *     bit       1 to 3:       _PAGE_LEAF (zero)
  *     bit            5:       _PAGE_PROT_NONE (zero)
- *     bits      6 to 10:      swap type
- *     bits 10 to XLEN-1:      swap offset
+ *     bit            6:       exclusive marker
+ *     bits      7 to 11:      swap type
+ *     bits 11 to XLEN-1:      swap offset
  */
-#define __SWP_TYPE_SHIFT       6
+#define __SWP_TYPE_SHIFT       7
 #define __SWP_TYPE_BITS                5
 #define __SWP_TYPE_MASK                ((1UL << __SWP_TYPE_BITS) - 1)
 #define __SWP_OFFSET_SHIFT     (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
@@ -748,11 +750,27 @@ extern pmd_t pmdp_collapse_flush(struct vm_area_struct *vma,
 #define __swp_type(x)  (((x).val >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK)
 #define __swp_offset(x)        ((x).val >> __SWP_OFFSET_SHIFT)
 #define __swp_entry(type, offset) ((swp_entry_t) \
-       { ((type) << __SWP_TYPE_SHIFT) | ((offset) << __SWP_OFFSET_SHIFT) })
+       { (((type) & __SWP_TYPE_MASK) << __SWP_TYPE_SHIFT) | \
+         ((offset) << __SWP_OFFSET_SHIFT) })
 
 #define __pte_to_swp_entry(pte)        ((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)  ((pte_t) { (x).val })
 
+static inline int pte_swp_exclusive(pte_t pte)
+{
+       return pte_val(pte) & _PAGE_SWP_EXCLUSIVE;
+}
+
+static inline pte_t pte_swp_mkexclusive(pte_t pte)
+{
+       return __pte(pte_val(pte) | _PAGE_SWP_EXCLUSIVE);
+}
+
+static inline pte_t pte_swp_clear_exclusive(pte_t pte)
+{
+       return __pte(pte_val(pte) & ~_PAGE_SWP_EXCLUSIVE);
+}
+
 #ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION
 #define __pmd_to_swp_entry(pmd) ((swp_entry_t) { pmd_val(pmd) })
 #define __swp_entry_to_pmd(swp) __pmd((swp).val)