.. | .. |
---|
27 | 27 | #include <linux/highmem.h> |
---|
28 | 28 | #include <linux/slab.h> |
---|
29 | 29 | #include <linux/spinlock.h> |
---|
| 30 | +#include <linux/locallock.h> |
---|
30 | 31 | #include <linux/types.h> |
---|
31 | 32 | #include <linux/atomic.h> |
---|
32 | 33 | #include <linux/frontswap.h> |
---|
.. | .. |
---|
990 | 991 | memset_l(page, value, PAGE_SIZE / sizeof(unsigned long)); |
---|
991 | 992 | } |
---|
992 | 993 | |
---|
| 994 | +/* protect zswap_dstmem from concurrency */ |
---|
| 995 | +static DEFINE_LOCAL_IRQ_LOCK(zswap_dstmem_lock); |
---|
993 | 996 | /********************************* |
---|
994 | 997 | * frontswap hooks |
---|
995 | 998 | **********************************/ |
---|
.. | .. |
---|
1066 | 1069 | } |
---|
1067 | 1070 | |
---|
1068 | 1071 | /* compress */ |
---|
1069 | | - dst = get_cpu_var(zswap_dstmem); |
---|
1070 | | - tfm = *get_cpu_ptr(entry->pool->tfm); |
---|
| 1072 | + dst = get_locked_var(zswap_dstmem_lock, zswap_dstmem); |
---|
| 1073 | + tfm = *this_cpu_ptr(entry->pool->tfm); |
---|
1071 | 1074 | src = kmap_atomic(page); |
---|
1072 | 1075 | ret = crypto_comp_compress(tfm, src, PAGE_SIZE, dst, &dlen); |
---|
1073 | 1076 | kunmap_atomic(src); |
---|
1074 | | - put_cpu_ptr(entry->pool->tfm); |
---|
1075 | 1077 | if (ret) { |
---|
1076 | 1078 | ret = -EINVAL; |
---|
1077 | 1079 | goto put_dstmem; |
---|
.. | .. |
---|
1094 | 1096 | memcpy(buf, &zhdr, hlen); |
---|
1095 | 1097 | memcpy(buf + hlen, dst, dlen); |
---|
1096 | 1098 | zpool_unmap_handle(entry->pool->zpool, handle); |
---|
1097 | | - put_cpu_var(zswap_dstmem); |
---|
| 1099 | + put_locked_var(zswap_dstmem_lock, zswap_dstmem); |
---|
1098 | 1100 | |
---|
1099 | 1101 | /* populate entry */ |
---|
1100 | 1102 | entry->offset = offset; |
---|
.. | .. |
---|
1122 | 1124 | return 0; |
---|
1123 | 1125 | |
---|
1124 | 1126 | put_dstmem: |
---|
1125 | | - put_cpu_var(zswap_dstmem); |
---|
| 1127 | + put_locked_var(zswap_dstmem_lock, zswap_dstmem); |
---|
1126 | 1128 | zswap_pool_put(entry->pool); |
---|
1127 | 1129 | freepage: |
---|
1128 | 1130 | zswap_entry_cache_free(entry); |
---|