Files
linux/arch/s390/include/asm
Gerald Schaefer 723cacbd9d s390/mm: fix asce_bits handling with dynamic pagetable levels
There is a race with multi-threaded applications between context switch and
pagetable upgrade. In switch_mm() a new user_asce is built from mm->pgd and
mm->context.asce_bits, w/o holding any locks. A concurrent mmap with a
pagetable upgrade on another thread in crst_table_upgrade() could already
have set new asce_bits, but not yet the new mm->pgd. This would result in a
corrupt user_asce in switch_mm(), and eventually in a kernel panic from a
translation exception.

Fix this by storing the complete asce instead of just the asce_bits, which
can then be read atomically from switch_mm(), so that it either sees the
old value or the new value, but no mixture. Both cases are OK. Having the
old value would result in a page fault on access to the higher level memory,
but the fault handler would see the new mm->pgd, if it was a valid access
after the mmap on the other thread has completed. So as worst-case scenario
we would have a page fault loop for the racing thread until the next time
slice.

Also remove dead code and simplify the upgrade/downgrade path, there are no
upgrades from 2 levels, and only downgrades from 3 levels for compat tasks.
There are also no concurrent upgrades, because the mmap_sem is held with
down_write() in do_mmap, so the flush and table checks during upgrade can
be removed.

Reported-by: Michael Munday <munday@ca.ibm.com>
Reviewed-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
2016-04-21 09:50:09 +02:00
..
2014-03-04 10:41:04 +01:00
2016-01-12 20:47:05 +02:00
2016-03-07 16:54:32 +01:00
2015-10-14 14:32:15 +02:00
2015-11-27 09:24:17 +01:00
2015-03-25 11:49:33 +01:00
2016-03-02 17:01:56 +02:00
2013-01-08 10:57:09 +01:00
2013-10-24 17:17:04 +02:00
2016-03-08 15:00:15 +01:00
2013-11-13 20:21:46 +01:00
2015-03-25 11:49:33 +01:00
2016-01-19 12:14:01 +01:00
2015-03-25 11:49:33 +01:00
2015-08-03 18:40:25 +02:00
2015-10-27 09:33:55 +01:00
2016-01-26 12:45:49 +01:00
2015-03-25 11:49:33 +01:00
2015-03-25 11:49:33 +01:00
2016-03-08 15:00:17 +01:00
2012-09-26 15:44:57 +02:00
2015-03-25 11:49:33 +01:00
2015-11-27 09:24:14 +01:00
2015-03-25 11:49:33 +01:00
2015-02-12 18:54:14 -08:00
2015-03-25 11:49:33 +01:00
2015-03-25 11:49:33 +01:00
2016-01-11 13:01:24 +01:00
2012-11-30 17:47:28 +01:00