@@ -55,6 +55,13 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp)
55
55
#define native_pmdp_get_and_clear (xp ) native_local_pmdp_get_and_clear(xp)
56
56
#endif
57
57
58
+ /* Bit manipulation helper on pte/pgoff entry */
59
+ static inline unsigned long pte_bitop (unsigned long value , unsigned int rightshift ,
60
+ unsigned long mask , unsigned int leftshift )
61
+ {
62
+ return ((value >> rightshift ) & mask ) << leftshift ;
63
+ }
64
+
58
65
#ifdef CONFIG_MEM_SOFT_DIRTY
59
66
60
67
/*
@@ -71,31 +78,34 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp)
71
78
#define PTE_FILE_BITS2 (PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1)
72
79
#define PTE_FILE_BITS3 (PTE_FILE_SHIFT4 - PTE_FILE_SHIFT3 - 1)
73
80
74
- #define pte_to_pgoff (pte ) \
75
- ((((pte).pte_low >> (PTE_FILE_SHIFT1)) \
76
- & ((1U << PTE_FILE_BITS1) - 1))) \
77
- + ((((pte).pte_low >> (PTE_FILE_SHIFT2)) \
78
- & ((1U << PTE_FILE_BITS2) - 1)) \
79
- << (PTE_FILE_BITS1)) \
80
- + ((((pte).pte_low >> (PTE_FILE_SHIFT3)) \
81
- & ((1U << PTE_FILE_BITS3) - 1)) \
82
- << (PTE_FILE_BITS1 + PTE_FILE_BITS2)) \
83
- + ((((pte).pte_low >> (PTE_FILE_SHIFT4))) \
84
- << (PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3))
85
-
86
- #define pgoff_to_pte (off ) \
87
- ((pte_t) { .pte_low = \
88
- ((((off)) & ((1U << PTE_FILE_BITS1) - 1)) << PTE_FILE_SHIFT1) \
89
- + ((((off) >> PTE_FILE_BITS1) \
90
- & ((1U << PTE_FILE_BITS2) - 1)) \
91
- << PTE_FILE_SHIFT2) \
92
- + ((((off) >> (PTE_FILE_BITS1 + PTE_FILE_BITS2)) \
93
- & ((1U << PTE_FILE_BITS3) - 1)) \
94
- << PTE_FILE_SHIFT3) \
95
- + ((((off) >> \
96
- (PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3))) \
97
- << PTE_FILE_SHIFT4) \
98
- + _PAGE_FILE })
81
+ #define PTE_FILE_MASK1 ((1U << PTE_FILE_BITS1) - 1)
82
+ #define PTE_FILE_MASK2 ((1U << PTE_FILE_BITS2) - 1)
83
+ #define PTE_FILE_MASK3 ((1U << PTE_FILE_BITS3) - 1)
84
+
85
+ #define PTE_FILE_LSHIFT2 (PTE_FILE_BITS1)
86
+ #define PTE_FILE_LSHIFT3 (PTE_FILE_BITS1 + PTE_FILE_BITS2)
87
+ #define PTE_FILE_LSHIFT4 (PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3)
88
+
89
+ static __always_inline pgoff_t pte_to_pgoff (pte_t pte )
90
+ {
91
+ return (pgoff_t )
92
+ (pte_bitop (pte .pte_low , PTE_FILE_SHIFT1 , PTE_FILE_MASK1 , 0 ) +
93
+ pte_bitop (pte .pte_low , PTE_FILE_SHIFT2 , PTE_FILE_MASK2 , PTE_FILE_LSHIFT2 ) +
94
+ pte_bitop (pte .pte_low , PTE_FILE_SHIFT3 , PTE_FILE_MASK3 , PTE_FILE_LSHIFT3 ) +
95
+ pte_bitop (pte .pte_low , PTE_FILE_SHIFT4 , -1UL , PTE_FILE_LSHIFT4 ));
96
+ }
97
+
98
+ static __always_inline pte_t pgoff_to_pte (pgoff_t off )
99
+ {
100
+ return (pte_t ){
101
+ .pte_low =
102
+ pte_bitop (off , 0 , PTE_FILE_MASK1 , PTE_FILE_SHIFT1 ) +
103
+ pte_bitop (off , PTE_FILE_LSHIFT2 , PTE_FILE_MASK2 , PTE_FILE_SHIFT2 ) +
104
+ pte_bitop (off , PTE_FILE_LSHIFT3 , PTE_FILE_MASK3 , PTE_FILE_SHIFT3 ) +
105
+ pte_bitop (off , PTE_FILE_LSHIFT4 , -1UL , PTE_FILE_SHIFT4 ) +
106
+ _PAGE_FILE ,
107
+ };
108
+ }
99
109
100
110
#else /* CONFIG_MEM_SOFT_DIRTY */
101
111
@@ -115,22 +125,30 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp)
115
125
#define PTE_FILE_BITS1 (PTE_FILE_SHIFT2 - PTE_FILE_SHIFT1 - 1)
116
126
#define PTE_FILE_BITS2 (PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1)
117
127
118
- #define pte_to_pgoff (pte ) \
119
- ((((pte).pte_low >> PTE_FILE_SHIFT1) \
120
- & ((1U << PTE_FILE_BITS1) - 1)) \
121
- + ((((pte).pte_low >> PTE_FILE_SHIFT2) \
122
- & ((1U << PTE_FILE_BITS2) - 1)) << PTE_FILE_BITS1) \
123
- + (((pte).pte_low >> PTE_FILE_SHIFT3) \
124
- << (PTE_FILE_BITS1 + PTE_FILE_BITS2)))
125
-
126
- #define pgoff_to_pte (off ) \
127
- ((pte_t) { .pte_low = \
128
- (((off) & ((1U << PTE_FILE_BITS1) - 1)) << PTE_FILE_SHIFT1) \
129
- + ((((off) >> PTE_FILE_BITS1) & ((1U << PTE_FILE_BITS2) - 1)) \
130
- << PTE_FILE_SHIFT2) \
131
- + (((off) >> (PTE_FILE_BITS1 + PTE_FILE_BITS2)) \
132
- << PTE_FILE_SHIFT3) \
133
- + _PAGE_FILE })
128
+ #define PTE_FILE_MASK1 ((1U << PTE_FILE_BITS1) - 1)
129
+ #define PTE_FILE_MASK2 ((1U << PTE_FILE_BITS2) - 1)
130
+
131
+ #define PTE_FILE_LSHIFT2 (PTE_FILE_BITS1)
132
+ #define PTE_FILE_LSHIFT3 (PTE_FILE_BITS1 + PTE_FILE_BITS2)
133
+
134
+ static __always_inline pgoff_t pte_to_pgoff (pte_t pte )
135
+ {
136
+ return (pgoff_t )
137
+ (pte_bitop (pte .pte_low , PTE_FILE_SHIFT1 , PTE_FILE_MASK1 , 0 ) +
138
+ pte_bitop (pte .pte_low , PTE_FILE_SHIFT2 , PTE_FILE_MASK2 , PTE_FILE_LSHIFT2 ) +
139
+ pte_bitop (pte .pte_low , PTE_FILE_SHIFT3 , -1UL , PTE_FILE_LSHIFT3 ));
140
+ }
141
+
142
+ static __always_inline pte_t pgoff_to_pte (pgoff_t off )
143
+ {
144
+ return (pte_t ){
145
+ .pte_low =
146
+ pte_bitop (off , 0 , PTE_FILE_MASK1 , PTE_FILE_SHIFT1 ) +
147
+ pte_bitop (off , PTE_FILE_LSHIFT2 , PTE_FILE_MASK2 , PTE_FILE_SHIFT2 ) +
148
+ pte_bitop (off , PTE_FILE_LSHIFT3 , -1UL , PTE_FILE_SHIFT3 ) +
149
+ _PAGE_FILE ,
150
+ };
151
+ }
134
152
135
153
#endif /* CONFIG_MEM_SOFT_DIRTY */
136
154
0 commit comments