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