diff options
author | Christian Borntraeger <borntraeger@de.ibm.com> | 2014-07-25 08:23:29 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-08-01 05:16:23 -0400 |
commit | 55e4283c3eb1d850893f645dd695c9c75d5fa1fc (patch) | |
tree | 73b921638494fa3923c94a3930b48bb4f3b20242 /arch/s390/mm | |
parent | a94fa154291bb11b1537ac2ff1ae2fd28428e054 (diff) |
KVM: s390/mm: Fix page table locking vs. split pmd lock
commit ec66ad66a0de87866be347b5ecc83bd46427f53b (s390/mm: enable
split page table lock for PMD level) activated the split pmd lock
for s390. Turns out that we missed one place: We also have to take
the pmd lock instead of the page table lock when we reallocate the
page tables (==> changing entries in the PMD) during sie enablement.
Cc: stable@vger.kernel.org # 3.15+
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/mm')
-rw-r--r-- | arch/s390/mm/pgtable.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 37b8241ec784..f90ad8592b36 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
@@ -1279,6 +1279,7 @@ static unsigned long page_table_realloc_pmd(struct mmu_gather *tlb, | |||
1279 | { | 1279 | { |
1280 | unsigned long next, *table, *new; | 1280 | unsigned long next, *table, *new; |
1281 | struct page *page; | 1281 | struct page *page; |
1282 | spinlock_t *ptl; | ||
1282 | pmd_t *pmd; | 1283 | pmd_t *pmd; |
1283 | 1284 | ||
1284 | pmd = pmd_offset(pud, addr); | 1285 | pmd = pmd_offset(pud, addr); |
@@ -1296,7 +1297,7 @@ again: | |||
1296 | if (!new) | 1297 | if (!new) |
1297 | return -ENOMEM; | 1298 | return -ENOMEM; |
1298 | 1299 | ||
1299 | spin_lock(&mm->page_table_lock); | 1300 | ptl = pmd_lock(mm, pmd); |
1300 | if (likely((unsigned long *) pmd_deref(*pmd) == table)) { | 1301 | if (likely((unsigned long *) pmd_deref(*pmd) == table)) { |
1301 | /* Nuke pmd entry pointing to the "short" page table */ | 1302 | /* Nuke pmd entry pointing to the "short" page table */ |
1302 | pmdp_flush_lazy(mm, addr, pmd); | 1303 | pmdp_flush_lazy(mm, addr, pmd); |
@@ -1310,7 +1311,7 @@ again: | |||
1310 | page_table_free_rcu(tlb, table); | 1311 | page_table_free_rcu(tlb, table); |
1311 | new = NULL; | 1312 | new = NULL; |
1312 | } | 1313 | } |
1313 | spin_unlock(&mm->page_table_lock); | 1314 | spin_unlock(ptl); |
1314 | if (new) { | 1315 | if (new) { |
1315 | page_table_free_pgste(new); | 1316 | page_table_free_pgste(new); |
1316 | goto again; | 1317 | goto again; |