diff mbox

arm64: Fix task tracing

Message ID 1365012061-31660-1-git-send-email-cov@codeaurora.org (mailing list archive)
State New, archived
Headers show

Commit Message

Christopher Covington April 3, 2013, 6:01 p.m. UTC
For accurate accounting call contextidr_thread_switch before a
task is scheduled, rather than after.

Signed-off-by: Christopher Covington <cov@codeaurora.org>
---
 arch/arm64/kernel/process.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Christopher Covington April 8, 2013, 2:42 p.m. UTC | #1
Hi Will,

On 04/03/2013 02:04 PM, Will Deacon wrote:
> Hi Christopher,
> 
> On Wed, Apr 03, 2013 at 07:01:01PM +0100, Christopher Covington wrote:
>> For accurate accounting call contextidr_thread_switch before a
>> task is scheduled, rather than after.
>>
>> Signed-off-by: Christopher Covington <cov@codeaurora.org>
>> ---
>>  arch/arm64/kernel/process.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
>> index 0337cdb..c2cc249 100644
>> --- a/arch/arm64/kernel/process.c
>> +++ b/arch/arm64/kernel/process.c
>> @@ -311,11 +311,11 @@ struct task_struct *__switch_to(struct task_struct *prev,
>>  	fpsimd_thread_switch(next);
>>  	tls_thread_switch(next);
>>  	hw_breakpoint_thread_switch(next);
>> +	contextidr_thread_switch(next);
>>  
>>  	/* the actual thread switch */
>>  	last = cpu_switch_to(prev, next);
>>  
>> -	contextidr_thread_switch(next);
>>  	return last;
>>  }
> 
> Catalin and I wondered about this and decided to go with the current
> approach in case a debugger, in response to the contextidr write, decided to
> go off and mine information about the *new* task using the sp.

The problem with the existing implementation is that it doesn't seem to
compensate for how cpu_switch_to changes the stack pointer. Consider the
following sequence.

cpu_switch_to(prev=A, next=B)
cpu_switch_to(prev=B, next=C)
cpu_switch_to(prev=C, next=A)

After the third call, using A's stack, next will be B, and its thread ID will
be written to CONTEXTIDR. An easy way to see this in a simulator is to just
instrument the code with some printk's.

Thanks,
Christopher
Will Deacon April 8, 2013, 3:31 p.m. UTC | #2
On Mon, Apr 08, 2013 at 03:42:24PM +0100, Christopher Covington wrote:
> On 04/03/2013 02:04 PM, Will Deacon wrote:
> > Hi Christopher,
> > 
> > On Wed, Apr 03, 2013 at 07:01:01PM +0100, Christopher Covington wrote:
> >> For accurate accounting call contextidr_thread_switch before a
> >> task is scheduled, rather than after.
> >>
> >> Signed-off-by: Christopher Covington <cov@codeaurora.org>
> >> ---
> >>  arch/arm64/kernel/process.c | 2 +-
> >>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
> >> index 0337cdb..c2cc249 100644
> >> --- a/arch/arm64/kernel/process.c
> >> +++ b/arch/arm64/kernel/process.c
> >> @@ -311,11 +311,11 @@ struct task_struct *__switch_to(struct task_struct *prev,
> >>  	fpsimd_thread_switch(next);
> >>  	tls_thread_switch(next);
> >>  	hw_breakpoint_thread_switch(next);
> >> +	contextidr_thread_switch(next);
> >>  
> >>  	/* the actual thread switch */
> >>  	last = cpu_switch_to(prev, next);
> >>  
> >> -	contextidr_thread_switch(next);
> >>  	return last;
> >>  }
> > 
> > Catalin and I wondered about this and decided to go with the current
> > approach in case a debugger, in response to the contextidr write, decided to
> > go off and mine information about the *new* task using the sp.
> 
> The problem with the existing implementation is that it doesn't seem to
> compensate for how cpu_switch_to changes the stack pointer. Consider the
> following sequence.
> 
> cpu_switch_to(prev=A, next=B)
> cpu_switch_to(prev=B, next=C)
> cpu_switch_to(prev=C, next=A)
> 
> After the third call, using A's stack, next will be B, and its thread ID will
> be written to CONTEXTIDR. An easy way to see this in a simulator is to just
> instrument the code with some printk's.

Yes, but moving the call still isn't the right thing to do if we can avoid
it. How about making that contextidr_thread_switch take prev instead of
next?

Will
diff mbox

Patch

diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index 0337cdb..c2cc249 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -311,11 +311,11 @@  struct task_struct *__switch_to(struct task_struct *prev,
 	fpsimd_thread_switch(next);
 	tls_thread_switch(next);
 	hw_breakpoint_thread_switch(next);
+	contextidr_thread_switch(next);
 
 	/* the actual thread switch */
 	last = cpu_switch_to(prev, next);
 
-	contextidr_thread_switch(next);
 	return last;
 }