hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/include/linux/swapops.h
....@@ -6,6 +6,8 @@
66 #include <linux/bug.h>
77 #include <linux/mm_types.h>
88
9
+#ifdef CONFIG_MMU
10
+
911 /*
1012 * swapcache pages are stored in the swapper_space radix tree. We want to
1113 * get good packing density in that tree, so the index should be dense in
....@@ -18,9 +20,18 @@
1820 *
1921 * swp_entry_t's are *never* stored anywhere in their arch-dependent format.
2022 */
21
-#define SWP_TYPE_SHIFT(e) ((sizeof(e.val) * 8) - \
22
- (MAX_SWAPFILES_SHIFT + RADIX_TREE_EXCEPTIONAL_SHIFT))
23
-#define SWP_OFFSET_MASK(e) ((1UL << SWP_TYPE_SHIFT(e)) - 1)
23
+#define SWP_TYPE_SHIFT (BITS_PER_XA_VALUE - MAX_SWAPFILES_SHIFT)
24
+#define SWP_OFFSET_MASK ((1UL << SWP_TYPE_SHIFT) - 1)
25
+
26
+/* Clear all flags but only keep swp_entry_t related information */
27
+static inline pte_t pte_swp_clear_flags(pte_t pte)
28
+{
29
+ if (pte_swp_soft_dirty(pte))
30
+ pte = pte_swp_clear_soft_dirty(pte);
31
+ if (pte_swp_uffd_wp(pte))
32
+ pte = pte_swp_clear_uffd_wp(pte);
33
+ return pte;
34
+}
2435
2536 /*
2637 * Store a type+offset into a swp_entry_t in an arch-independent format
....@@ -29,8 +40,7 @@
2940 {
3041 swp_entry_t ret;
3142
32
- ret.val = (type << SWP_TYPE_SHIFT(ret)) |
33
- (offset & SWP_OFFSET_MASK(ret));
43
+ ret.val = (type << SWP_TYPE_SHIFT) | (offset & SWP_OFFSET_MASK);
3444 return ret;
3545 }
3646
....@@ -40,7 +50,7 @@
4050 */
4151 static inline unsigned swp_type(swp_entry_t entry)
4252 {
43
- return (entry.val >> SWP_TYPE_SHIFT(entry));
53
+ return (entry.val >> SWP_TYPE_SHIFT);
4454 }
4555
4656 /*
....@@ -49,16 +59,14 @@
4959 */
5060 static inline pgoff_t swp_offset(swp_entry_t entry)
5161 {
52
- return entry.val & SWP_OFFSET_MASK(entry);
62
+ return entry.val & SWP_OFFSET_MASK;
5363 }
5464
55
-#ifdef CONFIG_MMU
5665 /* check whether a pte points to a swap entry */
5766 static inline int is_swap_pte(pte_t pte)
5867 {
5968 return !pte_none(pte) && !pte_present(pte);
6069 }
61
-#endif
6270
6371 /*
6472 * Convert the arch-dependent pte representation of a swp_entry_t into an
....@@ -68,8 +76,7 @@
6876 {
6977 swp_entry_t arch_entry;
7078
71
- if (pte_swp_soft_dirty(pte))
72
- pte = pte_swp_clear_soft_dirty(pte);
79
+ pte = pte_swp_clear_flags(pte);
7380 arch_entry = __pte_to_swp_entry(pte);
7481 return swp_entry(__swp_type(arch_entry), __swp_offset(arch_entry));
7582 }
....@@ -90,16 +97,13 @@
9097 {
9198 swp_entry_t entry;
9299
93
- entry.val = (unsigned long)arg >> RADIX_TREE_EXCEPTIONAL_SHIFT;
100
+ entry.val = xa_to_value(arg);
94101 return entry;
95102 }
96103
97104 static inline void *swp_to_radix_entry(swp_entry_t entry)
98105 {
99
- unsigned long value;
100
-
101
- value = entry.val << RADIX_TREE_EXCEPTIONAL_SHIFT;
102
- return (void *)(value | RADIX_TREE_EXCEPTIONAL_ENTRY);
106
+ return xa_mk_value(entry.val);
103107 }
104108
105109 #if IS_ENABLED(CONFIG_DEVICE_PRIVATE)
....@@ -134,12 +138,6 @@
134138 {
135139 return pfn_to_page(swp_offset(entry));
136140 }
137
-
138
-vm_fault_t device_private_entry_fault(struct vm_area_struct *vma,
139
- unsigned long addr,
140
- swp_entry_t entry,
141
- unsigned int flags,
142
- pmd_t *pmdp);
143141 #else /* CONFIG_DEVICE_PRIVATE */
144142 static inline swp_entry_t make_device_private_entry(struct page *page, bool write)
145143 {
....@@ -168,15 +166,6 @@
168166 static inline struct page *device_private_entry_to_page(swp_entry_t entry)
169167 {
170168 return NULL;
171
-}
172
-
173
-static inline vm_fault_t device_private_entry_fault(struct vm_area_struct *vma,
174
- unsigned long addr,
175
- swp_entry_t entry,
176
- unsigned int flags,
177
- pmd_t *pmdp)
178
-{
179
- return VM_FAULT_SIGBUS;
180169 }
181170 #endif /* CONFIG_DEVICE_PRIVATE */
182171
....@@ -276,6 +265,8 @@
276265
277266 if (pmd_swp_soft_dirty(pmd))
278267 pmd = pmd_swp_clear_soft_dirty(pmd);
268
+ if (pmd_swp_uffd_wp(pmd))
269
+ pmd = pmd_swp_clear_uffd_wp(pmd);
279270 arch_entry = __pmd_to_swp_entry(pmd);
280271 return swp_entry(__swp_type(arch_entry), __swp_offset(arch_entry));
281272 }
....@@ -381,4 +372,5 @@
381372 }
382373 #endif
383374
375
+#endif /* CONFIG_MMU */
384376 #endif /* _LINUX_SWAPOPS_H */