All of lore.kernel.org
 help / color / mirror / Atom feed
From: "André Hentschel" <nerv@dawncrow.de>
To: Will Deacon <will.deacon@arm.com>
Cc: Russell King - ARM Linux <linux@arm.linux.org.uk>,
	"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>
Subject: Re: [PATCHv2] arm: Preserve TPIDRURW on context switch
Date: Wed, 24 Apr 2013 23:44:34 +0200	[thread overview]
Message-ID: <51785242.6020500@dawncrow.de> (raw)
In-Reply-To: <20130424094251.GA21850@mudshark.cambridge.arm.com>

Am 24.04.2013 11:42, schrieb Will Deacon:
> Hi Andrew,
> 
> On Tue, Apr 23, 2013 at 11:42:22PM +0100, André Hentschel wrote:
>> Am 23.04.2013 11:15, schrieb Will Deacon:
>>> You could introduce `get' tls functions, which don't do anything for CPUs
>>> without the relevant registers.
>>
>> Before i have another round of testing and patch formatting/sending,
>> what about the untested patch below?
> 
> Ok. Comments inline.

Thanks for them. My first kernel patch was adding an include, this second patch is a rather hard one. So every comment is appreciated.

>>  #ifdef __ASSEMBLY__
>> +	.macro get_tls2_none, tp, tmp1
>> +	.endm
> 
> Cosmetic, but these are really horrible macro names.

I guess that's only about removing '2'?

>> +	.macro get_tls2_v6, tp, tmp1
>> +	ldr	\tmp1, =elf_hwcap
>> +	ldr	\tmp1, [\tmp1, #0]
>> +	tst	\tmp1, #HWCAP_TLS		@ hardware TLS available?
>> +	mrcne	p15, 0, \tmp1, c13, c0, 2		@ get user r/w TLS register
>> +	strne	\tmp1, [\tp, #4]
> 
> You could factor out some of this hwcap checking now that it's used by both
> set and get.

Sure, but the code would still run twice (unlike my PATCHv2)

>> +	ldrdne	\tmp1, \tmp2, [\tp]
> 
> Does this work for big-endian CPUs?

I'd say yes.

>> diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
>> index 047d3e4..6138eb1 100644
>> --- a/arch/arm/kernel/process.c
>> +++ b/arch/arm/kernel/process.c
>> @@ -395,7 +395,8 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,
>>  	clear_ptrace_hw_breakpoint(p);
>>  
>>  	if (clone_flags & CLONE_SETTLS)
>> -		thread->tp_value = childregs->ARM_r3;
>> +		thread->tp_value[0] = childregs->ARM_r3;
>> +	thread->tp_value[1] = current_thread_info()->tp_value[1];
>>
> 
> This still isn't correct. Imagine the following sequence of events:
> 
>   - Task foo writes its TPIDRURW register from userspace and then issues a
>     fork() system call. No context switch occurs between these two events.
> 
>   - We start creating the child task, bar, and end up in copy_thread with
>     the `thread' pointing at foo's struct thread_info, which contains the
>     *old* TPIDRURW value.
> 
>   - We copy out the stale value into bar, which is then scheduled with an
>     old TPIDRURW value.
> 
> The solution is to reload the value sitting in the register in copy_thread,
> rather than relying on the thread_info being up-to-date. That's why I
> previously suggested not using asm macros for the getters.

Thanks for the informations. Further questions:
	Where would i place this functions? In tls.h as inline functions?
	How should that function look like? Containing compile-time checks and only using assembler for mrc instructions?
	Wouldn't that be much overhead in __switch_to?

>> diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c
>> index 03deeff..2bc1514 100644
>> --- a/arch/arm/kernel/ptrace.c
>> +++ b/arch/arm/kernel/ptrace.c
>> @@ -849,7 +849,7 @@ long arch_ptrace(struct task_struct *child, long request,
>>  #endif
>>  
>>  		case PTRACE_GET_THREAD_AREA:
>> -			ret = put_user(task_thread_info(child)->tp_value,
>> +			ret = put_user(task_thread_info(child)->tp_value[0],
>>  				       datap);
>>  			break;
> 
> I'm guessing debuggers don't care about the new TLS value, or do we need a
> new ptrace request?

I'd say no. In case someone would jump in and say we need it, it'd be a seperate patch anyway.

Best regards.

  reply	other threads:[~2013-04-24 21:44 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-19 15:54 [PATCHv2] arm: Preserve TPIDRURW on context switch André Hentschel
2013-04-19 15:54 ` André Hentschel
2013-04-19 15:54 ` André Hentschel
2013-04-22 14:36 ` Russell King - ARM Linux
2013-04-22 14:36   ` Russell King - ARM Linux
2013-04-22 15:18   ` Will Deacon
2013-04-22 15:18     ` Will Deacon
2013-04-22 21:07     ` André Hentschel
2013-04-22 21:07       ` André Hentschel
2013-04-23  9:15       ` Will Deacon
2013-04-23  9:15         ` Will Deacon
2013-04-23 22:42         ` André Hentschel
2013-04-23 22:42           ` André Hentschel
2013-04-24  9:42           ` Will Deacon
2013-04-24  9:42             ` Will Deacon
2013-04-24  9:42             ` Will Deacon
2013-04-24 21:44             ` André Hentschel [this message]
2013-05-02 19:54             ` André Hentschel
2013-05-02 19:54               ` André Hentschel
2013-05-03  9:21               ` Jonathan Austin
2013-05-03  9:21                 ` Jonathan Austin
2013-05-03  9:21                 ` Jonathan Austin
2013-05-03  9:55                 ` Russell King - ARM Linux
2013-05-03  9:55                   ` Russell King - ARM Linux
2013-05-03 15:24                   ` Jonathan Austin
2013-05-03 15:24                     ` Jonathan Austin
2013-05-04 15:54                     ` André Hentschel
2013-05-04 15:54                       ` André Hentschel
2013-05-06 22:27                     ` André Hentschel
2013-05-06 22:27                       ` André Hentschel
2013-05-06 22:27                       ` André Hentschel
2013-05-07 10:16                       ` Jonathan Austin
2013-05-07 10:16                         ` Jonathan Austin

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=51785242.6020500@dawncrow.de \
    --to=nerv@dawncrow.de \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --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.