diff options
Diffstat (limited to 'arch/i386/kernel/process.c')
-rw-r--r-- | arch/i386/kernel/process.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index dd53c58f64f1..ae924c416b68 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
@@ -648,6 +648,11 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas | |||
648 | 648 | ||
649 | __unlazy_fpu(prev_p); | 649 | __unlazy_fpu(prev_p); |
650 | 650 | ||
651 | |||
652 | /* we're going to use this soon, after a few expensive things */ | ||
653 | if (next_p->fpu_counter > 5) | ||
654 | prefetch(&next->i387.fxsave); | ||
655 | |||
651 | /* | 656 | /* |
652 | * Reload esp0. | 657 | * Reload esp0. |
653 | */ | 658 | */ |
@@ -697,6 +702,13 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas | |||
697 | 702 | ||
698 | disable_tsc(prev_p, next_p); | 703 | disable_tsc(prev_p, next_p); |
699 | 704 | ||
705 | /* If the task has used fpu the last 5 timeslices, just do a full | ||
706 | * restore of the math state immediately to avoid the trap; the | ||
707 | * chances of needing FPU soon are obviously high now | ||
708 | */ | ||
709 | if (next_p->fpu_counter > 5) | ||
710 | math_state_restore(); | ||
711 | |||
700 | return prev_p; | 712 | return prev_p; |
701 | } | 713 | } |
702 | 714 | ||