Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cea20ca3 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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 34ddc81a ("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: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b01543df
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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);