On Fri, Aug 12, 2016 at 09:28:17AM +1000, Cyril Bur wrote:
> @@ -846,7 +834,9 @@ static void tm_reclaim_thread(struct thread_struct *thr,
>       if (!MSR_TM_SUSPENDED(mfmsr()))
>               return;
>  
> -     tm_reclaim(thr, thr->regs->msr, cause);
> +     giveup_all(container_of(thr, struct task_struct, thread));
> +
> +     tm_reclaim(thr, msr_diff, cause);
>  
>       /* Having done the reclaim, we now have the checkpointed
>        * FP/VSX values in the registers.  These might be valid

> @@ -1189,11 +1171,11 @@ struct task_struct *__switch_to(struct task_struct 
> *prev,
>        */
>       save_sprs(&prev->thread);
>  
> -     __switch_to_tm(prev);
> -
>       /* Save FPU, Altivec, VSX and SPE state */
>       giveup_all(prev);
>  
> +     __switch_to_tm(prev, new);
> +
>       /*
>        * We can't take a PMU exception inside _switch() since there is a
>        * window where the kernel stack SLB and the kernel stack are out


There are 2 "giveall_all()" in above path:
__switch_to()
        giveup_all()  // first time
        __switch_to_tm()
                tm_reclaim_task()
                        tm_reclaim_thread()
                                giveup_all()  // again????
We should remove the one in __switch_to().

And another question, for following code in tm_reclaim_thread():
        /* Having done the reclaim, we now have the checkpointed
         * FP/VSX values in the registers.  These might be valid
         * even if we have previously called enable_kernel_fp() or
         * flush_fp_to_thread(), so update thr->regs->msr to
         * indicate their current validity.
         */
        thr->regs->msr |= msr_diff;

Does it imply the task being switched out of CPU, with TIF_RESTORE_TM
bit set,  might end with MSR_FP enabled? (I thought MSR_FP should not 
be enabled for a switched out task, as specified in
flush_fp_to_thread())

Thanks,
- Simon

Reply via email to