|
@@ -347,11 +347,27 @@ static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry)
|
|
|
pr_err("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
|
|
|
|
|
|
/* Encode and de-code a swap entry */
|
|
|
-#define __swp_type(entry) (((entry).val >> 1) & 0x3f)
|
|
|
-#define __swp_offset(entry) ((entry).val >> 8)
|
|
|
-#define __swp_entry(type, offset) ((swp_entry_t){((type)<< 1)|((offset)<<8)})
|
|
|
-#define __pte_to_swp_entry(pte) ((swp_entry_t){pte_val(pte) >> PTE_RPN_SHIFT})
|
|
|
-#define __swp_entry_to_pte(x) ((pte_t) { (x).val << PTE_RPN_SHIFT })
|
|
|
+#define MAX_SWAPFILES_CHECK() do { \
|
|
|
+ BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > SWP_TYPE_BITS); \
|
|
|
+ /* \
|
|
|
+ * Don't have overlapping bits with _PAGE_HPTEFLAGS \
|
|
|
+ * We filter HPTEFLAGS on set_pte. \
|
|
|
+ */ \
|
|
|
+ BUILD_BUG_ON(_PAGE_HPTEFLAGS & (0x1f << _PAGE_BIT_SWAP_TYPE)); \
|
|
|
+ } while (0)
|
|
|
+/*
|
|
|
+ * on pte we don't need handle RADIX_TREE_EXCEPTIONAL_SHIFT;
|
|
|
+ */
|
|
|
+#define SWP_TYPE_BITS 5
|
|
|
+#define __swp_type(x) (((x).val >> _PAGE_BIT_SWAP_TYPE) \
|
|
|
+ & ((1UL << SWP_TYPE_BITS) - 1))
|
|
|
+#define __swp_offset(x) ((x).val >> PTE_RPN_SHIFT)
|
|
|
+#define __swp_entry(type, offset) ((swp_entry_t) { \
|
|
|
+ ((type) << _PAGE_BIT_SWAP_TYPE) \
|
|
|
+ | ((offset) << PTE_RPN_SHIFT) })
|
|
|
+
|
|
|
+#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val((pte)) })
|
|
|
+#define __swp_entry_to_pte(x) __pte((x).val)
|
|
|
|
|
|
void pgtable_cache_add(unsigned shift, void (*ctor)(void *));
|
|
|
void pgtable_cache_init(void);
|