All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christopher Covington <cov@codeaurora.org>
To: Will Deacon <will.deacon@arm.com>
Cc: Catalin Marinas <Catalin.Marinas@arm.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"linux-arm-msm@vger.kernel.org" <linux-arm-msm@vger.kernel.org>
Subject: Re: [PATCH] arm64: Fix task tracing
Date: Mon, 08 Apr 2013 10:42:24 -0400	[thread overview]
Message-ID: <5162D750.9050706@codeaurora.org> (raw)
In-Reply-To: <20130403180443.GB21167@mudshark.cambridge.arm.com>

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

-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by the Linux Foundation.

WARNING: multiple messages have this Message-ID (diff)
From: cov@codeaurora.org (Christopher Covington)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] arm64: Fix task tracing
Date: Mon, 08 Apr 2013 10:42:24 -0400	[thread overview]
Message-ID: <5162D750.9050706@codeaurora.org> (raw)
In-Reply-To: <20130403180443.GB21167@mudshark.cambridge.arm.com>

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

-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by the Linux Foundation.

  reply	other threads:[~2013-04-08 14:42 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-03 18:01 [PATCH] arm64: Fix task tracing Christopher Covington
2013-04-03 18:01 ` Christopher Covington
2013-04-03 18:04 ` Will Deacon
2013-04-03 18:04   ` Will Deacon
2013-04-03 18:04   ` Will Deacon
2013-04-08 14:42   ` Christopher Covington [this message]
2013-04-08 14:42     ` Christopher Covington
2013-04-08 14:42     ` Christopher Covington
2013-04-08 15:31     ` Will Deacon
2013-04-08 15:31       ` Will Deacon
2013-04-08 15:31       ` Will Deacon
2013-04-09 12:33       ` [PATCH v2] " Christopher Covington
2013-04-09 12:33         ` Christopher Covington
2013-04-10 11:41         ` Will Deacon
2013-04-10 11:41           ` Will Deacon
2013-04-10 11:41           ` Will Deacon
2013-04-10 13:12           ` Christopher Covington
2013-04-10 13:12             ` Christopher Covington
2013-04-10 13:12             ` Christopher Covington
2013-04-15 10:11         ` Catalin Marinas
2013-04-15 10:11           ` Catalin Marinas
2013-04-15 10:11           ` Catalin Marinas
2013-04-15 10:45           ` Will Deacon
2013-04-15 10:45             ` Will Deacon
2013-04-15 10:45             ` Will Deacon
2013-04-15 10:58             ` Catalin Marinas
2013-04-15 10:58               ` Catalin Marinas
2013-04-15 10:58               ` Catalin Marinas
2013-04-15 11:43               ` Catalin Marinas
2013-04-15 11:43                 ` Catalin Marinas
2013-04-15 11:43                 ` Catalin Marinas
2013-04-15 13:09                 ` Christopher Covington
2013-04-15 13:09                   ` Christopher Covington
2013-04-15 13:09                   ` Christopher Covington
2013-04-15 15:23                   ` Catalin Marinas
2013-04-15 15:23                     ` Catalin Marinas
2013-04-15 15:23                     ` Catalin Marinas
2013-04-15 13:19                 ` Will Deacon
2013-04-15 13:19                   ` Will Deacon
2013-04-15 13:19                   ` Will Deacon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5162D750.9050706@codeaurora.org \
    --to=cov@codeaurora.org \
    --cc=Catalin.Marinas@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.