1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Manage cache of swap slots to be used for and returned from
4 * swap.
5 *
6 * Copyright(c) 2016 Intel Corporation.
7 *
8 * Author: Tim Chen <[email protected]>
9 *
10 * We allocate the swap slots from the global pool and put
11 * it into local per cpu caches. This has the advantage
12 * of no needing to acquire the swap_info lock every time
13 * we need a new slot.
14 *
15 * There is also opportunity to simply return the slot
16 * to local caches without needing to acquire swap_info
17 * lock. We do not reuse the returned slots directly but
18 * move them back to the global pool in a batch. This
19 * allows the slots to coalesce and reduce fragmentation.
20 *
21 * The swap entry allocated is marked with SWAP_HAS_CACHE
22 * flag in map_count that prevents it from being allocated
23 * again from the global pool.
24 *
25 * The swap slots cache is protected by a mutex instead of
26 * a spin lock as when we search for slots with scan_swap_map,
27 * we can possibly sleep.
28 */
29
30 #include <linux/swap_slots.h>
31 #include <linux/cpu.h>
32 #include <linux/cpumask.h>
33 #include <linux/slab.h>
34 #include <linux/vmalloc.h>
35 #include <linux/mutex.h>
36 #include <linux/mm.h>
37
38 static DEFINE_PER_CPU(struct swap_slots_cache, swp_slots);
39 static bool swap_slot_cache_active;
40 bool swap_slot_cache_enabled;
41 static bool swap_slot_cache_initialized;
42 static DEFINE_MUTEX(swap_slots_cache_mutex);
43 /* Serialize swap slots cache enable/disable operations */
44 static DEFINE_MUTEX(swap_slots_cache_enable_mutex);
45
46 static void __drain_swap_slots_cache(void);
47
48 #define use_swap_slot_cache (swap_slot_cache_active && swap_slot_cache_enabled)
49
deactivate_swap_slots_cache(void)50 static void deactivate_swap_slots_cache(void)
51 {
52 mutex_lock(&swap_slots_cache_mutex);
53 swap_slot_cache_active = false;
54 __drain_swap_slots_cache();
55 mutex_unlock(&swap_slots_cache_mutex);
56 }
57
reactivate_swap_slots_cache(void)58 static void reactivate_swap_slots_cache(void)
59 {
60 mutex_lock(&swap_slots_cache_mutex);
61 swap_slot_cache_active = true;
62 mutex_unlock(&swap_slots_cache_mutex);
63 }
64
65 /* Must not be called with cpu hot plug lock */
disable_swap_slots_cache_lock(void)66 void disable_swap_slots_cache_lock(void)
67 {
68 mutex_lock(&swap_slots_cache_enable_mutex);
69 swap_slot_cache_enabled = false;
70 if (swap_slot_cache_initialized) {
71 /* serialize with cpu hotplug operations */
72 cpus_read_lock();
73 __drain_swap_slots_cache();
74 cpus_read_unlock();
75 }
76 }
77
__reenable_swap_slots_cache(void)78 static void __reenable_swap_slots_cache(void)
79 {
80 swap_slot_cache_enabled = has_usable_swap();
81 }
82
reenable_swap_slots_cache_unlock(void)83 void reenable_swap_slots_cache_unlock(void)
84 {
85 __reenable_swap_slots_cache();
86 mutex_unlock(&swap_slots_cache_enable_mutex);
87 }
88
check_cache_active(void)89 static bool check_cache_active(void)
90 {
91 long pages;
92
93 if (!swap_slot_cache_enabled)
94 return false;
95
96 pages = get_nr_swap_pages();
97 if (!swap_slot_cache_active) {
98 if (pages > num_online_cpus() *
99 THRESHOLD_ACTIVATE_SWAP_SLOTS_CACHE)
100 reactivate_swap_slots_cache();
101 goto out;
102 }
103
104 /* if global pool of slot caches too low, deactivate cache */
105 if (pages < num_online_cpus() * THRESHOLD_DEACTIVATE_SWAP_SLOTS_CACHE)
106 deactivate_swap_slots_cache();
107 out:
108 return swap_slot_cache_active;
109 }
110
alloc_swap_slot_cache(unsigned int cpu)111 static int alloc_swap_slot_cache(unsigned int cpu)
112 {
113 struct swap_slots_cache *cache;
114 swp_entry_t *slots;
115
116 /*
117 * Do allocation outside swap_slots_cache_mutex
118 * as kvzalloc could trigger reclaim and folio_alloc_swap,
119 * which can lock swap_slots_cache_mutex.
120 */
121 slots = kvcalloc(SWAP_SLOTS_CACHE_SIZE, sizeof(swp_entry_t),
122 GFP_KERNEL);
123 if (!slots)
124 return -ENOMEM;
125
126 mutex_lock(&swap_slots_cache_mutex);
127 cache = &per_cpu(swp_slots, cpu);
128 if (cache->slots) {
129 /* cache already allocated */
130 mutex_unlock(&swap_slots_cache_mutex);
131
132 kvfree(slots);
133
134 return 0;
135 }
136
137 if (!cache->lock_initialized) {
138 mutex_init(&cache->alloc_lock);
139 cache->lock_initialized = true;
140 }
141 cache->nr = 0;
142 cache->cur = 0;
143 cache->n_ret = 0;
144 /*
145 * We initialized alloc_lock and free_lock earlier. We use
146 * !cache->slots or !cache->slots_ret to know if it is safe to acquire
147 * the corresponding lock and use the cache. Memory barrier below
148 * ensures the assumption.
149 */
150 mb();
151 cache->slots = slots;
152 mutex_unlock(&swap_slots_cache_mutex);
153 return 0;
154 }
155
drain_slots_cache_cpu(unsigned int cpu,bool free_slots)156 static void drain_slots_cache_cpu(unsigned int cpu, bool free_slots)
157 {
158 struct swap_slots_cache *cache;
159
160 cache = &per_cpu(swp_slots, cpu);
161 if (cache->slots) {
162 mutex_lock(&cache->alloc_lock);
163 swapcache_free_entries(cache->slots + cache->cur, cache->nr);
164 cache->cur = 0;
165 cache->nr = 0;
166 if (free_slots && cache->slots) {
167 kvfree(cache->slots);
168 cache->slots = NULL;
169 }
170 mutex_unlock(&cache->alloc_lock);
171 }
172 }
173
__drain_swap_slots_cache(void)174 static void __drain_swap_slots_cache(void)
175 {
176 unsigned int cpu;
177
178 /*
179 * This function is called during
180 * 1) swapoff, when we have to make sure no
181 * left over slots are in cache when we remove
182 * a swap device;
183 * 2) disabling of swap slot cache, when we run low
184 * on swap slots when allocating memory and need
185 * to return swap slots to global pool.
186 *
187 * We cannot acquire cpu hot plug lock here as
188 * this function can be invoked in the cpu
189 * hot plug path:
190 * cpu_up -> lock cpu_hotplug -> cpu hotplug state callback
191 * -> memory allocation -> direct reclaim -> folio_alloc_swap
192 * -> drain_swap_slots_cache
193 *
194 * Hence the loop over current online cpu below could miss cpu that
195 * is being brought online but not yet marked as online.
196 * That is okay as we do not schedule and run anything on a
197 * cpu before it has been marked online. Hence, we will not
198 * fill any swap slots in slots cache of such cpu.
199 * There are no slots on such cpu that need to be drained.
200 */
201 for_each_online_cpu(cpu)
202 drain_slots_cache_cpu(cpu, false);
203 }
204
free_slot_cache(unsigned int cpu)205 static int free_slot_cache(unsigned int cpu)
206 {
207 mutex_lock(&swap_slots_cache_mutex);
208 drain_slots_cache_cpu(cpu, true);
209 mutex_unlock(&swap_slots_cache_mutex);
210 return 0;
211 }
212
enable_swap_slots_cache(void)213 void enable_swap_slots_cache(void)
214 {
215 mutex_lock(&swap_slots_cache_enable_mutex);
216 if (!swap_slot_cache_initialized) {
217 int ret;
218
219 ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "swap_slots_cache",
220 alloc_swap_slot_cache, free_slot_cache);
221 if (WARN_ONCE(ret < 0, "Cache allocation failed (%s), operating "
222 "without swap slots cache.\n", __func__))
223 goto out_unlock;
224
225 swap_slot_cache_initialized = true;
226 }
227
228 __reenable_swap_slots_cache();
229 out_unlock:
230 mutex_unlock(&swap_slots_cache_enable_mutex);
231 }
232
233 /* called with swap slot cache's alloc lock held */
refill_swap_slots_cache(struct swap_slots_cache * cache)234 static int refill_swap_slots_cache(struct swap_slots_cache *cache)
235 {
236 if (!use_swap_slot_cache)
237 return 0;
238
239 cache->cur = 0;
240 if (swap_slot_cache_active)
241 cache->nr = get_swap_pages(SWAP_SLOTS_CACHE_SIZE,
242 cache->slots, 0);
243
244 return cache->nr;
245 }
246
folio_alloc_swap(struct folio * folio)247 swp_entry_t folio_alloc_swap(struct folio *folio)
248 {
249 swp_entry_t entry;
250 struct swap_slots_cache *cache;
251
252 entry.val = 0;
253
254 if (folio_test_large(folio)) {
255 if (IS_ENABLED(CONFIG_THP_SWAP))
256 get_swap_pages(1, &entry, folio_order(folio));
257 goto out;
258 }
259
260 /*
261 * Preemption is allowed here, because we may sleep
262 * in refill_swap_slots_cache(). But it is safe, because
263 * accesses to the per-CPU data structure are protected by the
264 * mutex cache->alloc_lock.
265 *
266 * The alloc path here does not touch cache->slots_ret
267 * so cache->free_lock is not taken.
268 */
269 cache = raw_cpu_ptr(&swp_slots);
270
271 if (likely(check_cache_active() && cache->slots)) {
272 mutex_lock(&cache->alloc_lock);
273 if (cache->slots) {
274 repeat:
275 if (cache->nr) {
276 entry = cache->slots[cache->cur];
277 cache->slots[cache->cur++].val = 0;
278 cache->nr--;
279 } else if (refill_swap_slots_cache(cache)) {
280 goto repeat;
281 }
282 }
283 mutex_unlock(&cache->alloc_lock);
284 if (entry.val)
285 goto out;
286 }
287
288 get_swap_pages(1, &entry, 0);
289 out:
290 if (mem_cgroup_try_charge_swap(folio, entry)) {
291 put_swap_folio(folio, entry);
292 entry.val = 0;
293 }
294 return entry;
295 }
296