[PATCH] arm:pm: save the vfp state of last scheduled-out proceed while suspending

Barry Song 21cnbao at gmail.com
Thu Apr 28 23:26:02 EDT 2011


2011/4/29 Barry Song <21cnbao at gmail.com>:
> Hi Catalin,
> Thanks.
> 2011/4/29 Catalin Marinas <catalin.marinas at arm.com>:
>> On 27 April 2011 07:30, Barry Song <bs14 at csr.com> wrote:
>>> From: Rongjun Ying <rongjun.ying at csr.com>
>>>
>>> Current vfp pm suspend entry only saves the vfp state of running proceed if it is using vfp. If current proceed doesn't use vfp,
>>> the state of last process will be lost after resume. In pressure tests, we can see old vfp processes crash after resume.
>>>
>>> In order that schedule can be faster, scheduler doesn't save vfp state if we schedule from proceeds using vfp to proceeds which
>>> don't use vfp. If system suspend happens just at proceeds which don't use vfp, we have no any chance to save old vfp state.
>>>
>>> Signed-off-by: Rongjun Ying <rongjun.ying at csr.com>
>>> Cc: Binghua Duan <binghua.duan at csr.com>
>>> Signed-off-by: Barry Song <21cnbao at gmail.com>
>>
>> There was a similar patch some time ago by Colin Cross. I don't know
>> what happened to it but please have a look at that discussion first:
>>
>> http://thread.gmane.org/gmane.linux.kernel/1099558
>
> sorry, i didn't see any patch committed and lost the thread in lkml.
>
> Seems like Rongjun's codes have handled Russel's last change but in
> the "else". Russel handles it before the "if (fpexc & FPEXC_EN) {".
> We will take over the test in
> http://thread.gmane.org/gmane.linux.kernel/1099558 and continue to
> send patch v3.

but we don't think Russel's last change is complelety right by:
/* If lazy disable, re-enable the VFP ready for it to be saved */
	if (last_VFP_context[ti->cpu] != &ti->vfpstate) {
		fpexc |= FPEXC_EN;
		fmxr(FPEXC, fpexc);
	}
	/* If VFP is on, then save state for resumption */
	if (fpexc & FPEXC_EN) {
		...

there are still risk.  For example, if process p1/p2 switch like this:
P1:     use vfp
       swith to -> P2: don't use vfp
                    switch to  -> P1(use vfp), but it didn't begin to
use vfp, then  FPEXC_EN is not set, but suspend happen at that moment

At the last time, last_VFP_context[ti->cpu] will be &ti->vfpstate,
fpexc & FPEXC_EN will be false. it loses the chance to save status.
So looks like Rongjun's codes can avoid this kind of risk:
       /* if vfp is on, then save state for resumption */
       if (fpexc & FPEXC_EN) {
@@ -392,8 +393,16 @@ static int vfp_pm_suspend(struct sys_device *dev,
pm_message_t state)

               /* disable, just in case */
               fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN);
+       } else {
+               if (last_VFP_context[cpu]) {
+                       fmxr(FPEXC, fpexc | FPEXC_EN);
+                       vfp_save_state(last_VFP_context[cpu], fpexc);
+                       fmxr(FPEXC, fpexc);
+               }
       }


>
>>
>> --
>> Catalin
>>
>



More information about the linux-arm-kernel mailing list