[S390] pgtables: Fix race in enable_sie vs. page table ops
authorChristian Borntraeger <borntraeger@de.ibm.com>
Tue, 28 Oct 2008 10:10:15 +0000 (11:10 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 28 Oct 2008 10:12:03 +0000 (11:12 +0100)
commit250cf776f74b5932a1977d0489cae9206e2351dd
tree71bb6778e65e8efbdd0cac09a64e4e1194b98c3f
parent2c78091405d6f54748b1fac78c45f2a799e3073a
[S390] pgtables: Fix race in enable_sie vs. page table ops

The current enable_sie code sets the mm->context.pgstes bit to tell
dup_mm that the new mm should have extended page tables. This bit is also
used by the s390 specific page table primitives to decide about the page
table layout - which means context.pgstes has two meanings. This can cause
any kind of bugs. For example  - e.g. shrink_zone can call
ptep_clear_flush_young while enable_sie is running. ptep_clear_flush_young
will test for context.pgstes. Since enable_sie changed that value of the old
struct mm without changing the page table layout ptep_clear_flush_young will
do the wrong thing.
The solution is to split pgstes into two bits
- one for the allocation
- one for the current state

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/mmu.h
arch/s390/include/asm/mmu_context.h
arch/s390/include/asm/pgtable.h
arch/s390/mm/pgtable.c