提交 9f37e797 编写于 作者: M Martin Schwidefsky

s390: fix preemption race in disable_sacf_uaccess

With CONFIG_PREEMPT=y there is a possible race in disable_sacf_uaccess.

The new set_fs value needs to be stored the the task structure first,
the control register update needs to be second. Otherwise a preemptive
schedule may interrupt the code right after the control register update
has been done and the next time the task is scheduled we get an incorrect
value in the control register due to the old set_fs setting.

Fixes: 0aaba41b ("s390: remove all code using the access register mode")
Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
上级 366d8216
...@@ -89,11 +89,11 @@ EXPORT_SYMBOL(enable_sacf_uaccess); ...@@ -89,11 +89,11 @@ EXPORT_SYMBOL(enable_sacf_uaccess);
void disable_sacf_uaccess(mm_segment_t old_fs) void disable_sacf_uaccess(mm_segment_t old_fs)
{ {
current->thread.mm_segment = old_fs;
if (old_fs == USER_DS && test_facility(27)) { if (old_fs == USER_DS && test_facility(27)) {
__ctl_load(S390_lowcore.user_asce, 1, 1); __ctl_load(S390_lowcore.user_asce, 1, 1);
clear_cpu_flag(CIF_ASCE_PRIMARY); clear_cpu_flag(CIF_ASCE_PRIMARY);
} }
current->thread.mm_segment = old_fs;
} }
EXPORT_SYMBOL(disable_sacf_uaccess); EXPORT_SYMBOL(disable_sacf_uaccess);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册