hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/mm/zswap.c
....@@ -18,7 +18,6 @@
1818 #include <linux/highmem.h>
1919 #include <linux/slab.h>
2020 #include <linux/spinlock.h>
21
-#include <linux/local_lock.h>
2221 #include <linux/types.h>
2322 #include <linux/atomic.h>
2423 #include <linux/frontswap.h>
....@@ -388,37 +387,27 @@
388387 /*********************************
389388 * per-cpu code
390389 **********************************/
391
-struct zswap_comp {
392
- /* Used for per-CPU dstmem and tfm */
393
- local_lock_t lock;
394
- u8 *dstmem;
395
-};
396
-
397
-static DEFINE_PER_CPU(struct zswap_comp, zswap_comp) = {
398
- .lock = INIT_LOCAL_LOCK(lock),
399
-};
390
+static DEFINE_PER_CPU(u8 *, zswap_dstmem);
400391
401392 static int zswap_dstmem_prepare(unsigned int cpu)
402393 {
403
- struct zswap_comp *zcomp;
404394 u8 *dst;
405395
406396 dst = kmalloc_node(PAGE_SIZE * 2, GFP_KERNEL, cpu_to_node(cpu));
407397 if (!dst)
408398 return -ENOMEM;
409399
410
- zcomp = per_cpu_ptr(&zswap_comp, cpu);
411
- zcomp->dstmem = dst;
400
+ per_cpu(zswap_dstmem, cpu) = dst;
412401 return 0;
413402 }
414403
415404 static int zswap_dstmem_dead(unsigned int cpu)
416405 {
417
- struct zswap_comp *zcomp;
406
+ u8 *dst;
418407
419
- zcomp = per_cpu_ptr(&zswap_comp, cpu);
420
- kfree(zcomp->dstmem);
421
- zcomp->dstmem = NULL;
408
+ dst = per_cpu(zswap_dstmem, cpu);
409
+ kfree(dst);
410
+ per_cpu(zswap_dstmem, cpu) = NULL;
422411
423412 return 0;
424413 }
....@@ -930,11 +919,10 @@
930919 dlen = PAGE_SIZE;
931920 src = (u8 *)zhdr + sizeof(struct zswap_header);
932921 dst = kmap_atomic(page);
933
- local_lock(&zswap_comp.lock);
934
- tfm = *this_cpu_ptr(entry->pool->tfm);
922
+ tfm = *get_cpu_ptr(entry->pool->tfm);
935923 ret = crypto_comp_decompress(tfm, src, entry->length,
936924 dst, &dlen);
937
- local_unlock(&zswap_comp.lock);
925
+ put_cpu_ptr(entry->pool->tfm);
938926 kunmap_atomic(dst);
939927 BUG_ON(ret);
940928 BUG_ON(dlen != PAGE_SIZE);
....@@ -1086,12 +1074,12 @@
10861074 }
10871075
10881076 /* compress */
1089
- local_lock(&zswap_comp.lock);
1090
- dst = *this_cpu_ptr(&zswap_comp.dstmem);
1091
- tfm = *this_cpu_ptr(entry->pool->tfm);
1077
+ dst = get_cpu_var(zswap_dstmem);
1078
+ tfm = *get_cpu_ptr(entry->pool->tfm);
10921079 src = kmap_atomic(page);
10931080 ret = crypto_comp_compress(tfm, src, PAGE_SIZE, dst, &dlen);
10941081 kunmap_atomic(src);
1082
+ put_cpu_ptr(entry->pool->tfm);
10951083 if (ret) {
10961084 ret = -EINVAL;
10971085 goto put_dstmem;
....@@ -1115,7 +1103,7 @@
11151103 memcpy(buf, &zhdr, hlen);
11161104 memcpy(buf + hlen, dst, dlen);
11171105 zpool_unmap_handle(entry->pool->zpool, handle);
1118
- local_unlock(&zswap_comp.lock);
1106
+ put_cpu_var(zswap_dstmem);
11191107
11201108 /* populate entry */
11211109 entry->offset = offset;
....@@ -1143,7 +1131,7 @@
11431131 return 0;
11441132
11451133 put_dstmem:
1146
- local_unlock(&zswap_comp.lock);
1134
+ put_cpu_var(zswap_dstmem);
11471135 zswap_pool_put(entry->pool);
11481136 freepage:
11491137 zswap_entry_cache_free(entry);
....@@ -1188,10 +1176,9 @@
11881176 if (zpool_evictable(entry->pool->zpool))
11891177 src += sizeof(struct zswap_header);
11901178 dst = kmap_atomic(page);
1191
- local_lock(&zswap_comp.lock);
1192
- tfm = *this_cpu_ptr(entry->pool->tfm);
1179
+ tfm = *get_cpu_ptr(entry->pool->tfm);
11931180 ret = crypto_comp_decompress(tfm, src, entry->length, dst, &dlen);
1194
- local_unlock(&zswap_comp.lock);
1181
+ put_cpu_ptr(entry->pool->tfm);
11951182 kunmap_atomic(dst);
11961183 zpool_unmap_handle(entry->pool->zpool, entry->handle);
11971184 BUG_ON(ret);