diff options
author | Dominik Dingel <dingel@linux.vnet.ibm.com> | 2014-10-23 06:09:17 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-10-27 08:27:26 -0400 |
commit | 3ac8e38015d4fd1c12e4e048a01a9f059a2053a2 (patch) | |
tree | ca076c3bc2009ee77f2a312673c934601d767287 /arch/s390/mm | |
parent | 2faee8ff9dc6f4bfe46f6d2d110add858140fb20 (diff) |
s390/mm: disable KSM for storage key enabled pages
When storage keys are enabled unmerge already merged pages and prevent
new pages from being merged.
Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/mm')
-rw-r--r-- | arch/s390/mm/pgtable.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 0f1e9ff6bc12..b1871d39e46e 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
@@ -18,6 +18,8 @@ | |||
18 | #include <linux/rcupdate.h> | 18 | #include <linux/rcupdate.h> |
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/swapops.h> | 20 | #include <linux/swapops.h> |
21 | #include <linux/ksm.h> | ||
22 | #include <linux/mman.h> | ||
21 | 23 | ||
22 | #include <asm/pgtable.h> | 24 | #include <asm/pgtable.h> |
23 | #include <asm/pgalloc.h> | 25 | #include <asm/pgalloc.h> |
@@ -1275,22 +1277,34 @@ static int __s390_enable_skey(pte_t *pte, unsigned long addr, | |||
1275 | return 0; | 1277 | return 0; |
1276 | } | 1278 | } |
1277 | 1279 | ||
1278 | void s390_enable_skey(void) | 1280 | int s390_enable_skey(void) |
1279 | { | 1281 | { |
1280 | struct mm_walk walk = { .pte_entry = __s390_enable_skey }; | 1282 | struct mm_walk walk = { .pte_entry = __s390_enable_skey }; |
1281 | struct mm_struct *mm = current->mm; | 1283 | struct mm_struct *mm = current->mm; |
1284 | struct vm_area_struct *vma; | ||
1285 | int rc = 0; | ||
1282 | 1286 | ||
1283 | down_write(&mm->mmap_sem); | 1287 | down_write(&mm->mmap_sem); |
1284 | if (mm_use_skey(mm)) | 1288 | if (mm_use_skey(mm)) |
1285 | goto out_up; | 1289 | goto out_up; |
1286 | 1290 | ||
1287 | mm->context.use_skey = 1; | 1291 | mm->context.use_skey = 1; |
1292 | for (vma = mm->mmap; vma; vma = vma->vm_next) { | ||
1293 | if (ksm_madvise(vma, vma->vm_start, vma->vm_end, | ||
1294 | MADV_UNMERGEABLE, &vma->vm_flags)) { | ||
1295 | mm->context.use_skey = 0; | ||
1296 | rc = -ENOMEM; | ||
1297 | goto out_up; | ||
1298 | } | ||
1299 | } | ||
1300 | mm->def_flags &= ~VM_MERGEABLE; | ||
1288 | 1301 | ||
1289 | walk.mm = mm; | 1302 | walk.mm = mm; |
1290 | walk_page_range(0, TASK_SIZE, &walk); | 1303 | walk_page_range(0, TASK_SIZE, &walk); |
1291 | 1304 | ||
1292 | out_up: | 1305 | out_up: |
1293 | up_write(&mm->mmap_sem); | 1306 | up_write(&mm->mmap_sem); |
1307 | return rc; | ||
1294 | } | 1308 | } |
1295 | EXPORT_SYMBOL_GPL(s390_enable_skey); | 1309 | EXPORT_SYMBOL_GPL(s390_enable_skey); |
1296 | 1310 | ||