i387: fix up some fpu_counter confusion
This makes sure we clear the FPU usage counter for newly created tasks,
just so that we start off in a known state (for example, don't try to
preload the FPU state on the first task switch etc).
It also fixes a thinko in when we increment the fpu_counter at task
switch time, introduced by commit 34ddc81a23
("i387: re-introduce FPU
state preloading at context switch time"). We should increment the
*new* task fpu_counter, not the old task, and only if we decide to use
that state (whether lazily or preloaded).
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
b01543dfe6
commit
cea20ca3f3
3 changed files with 4 additions and 1 deletions
|
@ -348,10 +348,10 @@ static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct ta
|
|||
if (__save_init_fpu(old))
|
||||
fpu_lazy_state_intact(old);
|
||||
__thread_clear_has_fpu(old);
|
||||
old->fpu_counter++;
|
||||
|
||||
/* Don't change CR0.TS if we just switch! */
|
||||
if (fpu.preload) {
|
||||
new->fpu_counter++;
|
||||
__thread_set_has_fpu(new);
|
||||
prefetch(new->thread.fpu.state);
|
||||
} else
|
||||
|
@ -359,6 +359,7 @@ static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct ta
|
|||
} else {
|
||||
old->fpu_counter = 0;
|
||||
if (fpu.preload) {
|
||||
new->fpu_counter++;
|
||||
if (fpu_lazy_restore(new))
|
||||
fpu.preload = 0;
|
||||
else
|
||||
|
|
|
@ -214,6 +214,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
|
|||
|
||||
task_user_gs(p) = get_user_gs(regs);
|
||||
|
||||
p->fpu_counter = 0;
|
||||
p->thread.io_bitmap_ptr = NULL;
|
||||
tsk = current;
|
||||
err = -ENOMEM;
|
||||
|
|
|
@ -286,6 +286,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
|
|||
|
||||
set_tsk_thread_flag(p, TIF_FORK);
|
||||
|
||||
p->fpu_counter = 0;
|
||||
p->thread.io_bitmap_ptr = NULL;
|
||||
|
||||
savesegment(gs, p->thread.gsindex);
|
||||
|
|
Loading…
Reference in a new issue