| .. | .. |
|---|
| 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); |
|---|