All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ptrace: add ability to get clear_tid_address
@ 2012-02-03 11:11 Andrew Vagin
  2012-02-03 16:25 ` Tejun Heo
  0 siblings, 1 reply; 22+ messages in thread
From: Andrew Vagin @ 2012-02-03 11:11 UTC (permalink / raw)
  To: linux-kernel
  Cc: Oleg Nesterov, Roland McGrath, Cyrill Gorcunov, Pavel Emelyanov,
	Tejun Heo, avagin

Zero is written at clear_tid_address, when the process exits.
This functionality is used by pthread_join().

sys_set_tid_address() changes this address for current task.

Before this patch clear_tid_address could not be got from user space.
I want to dump a full state of a task, so I need this address.
Also I think it may be useful for debugging a multithreading program.

I am not sure that ptrace is suitable place. It may be added in prctl,
but I think it's a bit useless and strange. I can't image a real
situation (avoid checkpointing) when a thread will want to get own
clear_tid_address from itself, this address is used by parent ussually.

Signed-off-by: Andrew Vagin <avagin@openvz.org>
---
 include/linux/ptrace.h |    3 +++
 kernel/ptrace.c        |    3 +++
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
index c2f1f6a..79b84a3 100644
--- a/include/linux/ptrace.h
+++ b/include/linux/ptrace.h
@@ -51,6 +51,9 @@
 #define PTRACE_INTERRUPT	0x4207
 #define PTRACE_LISTEN		0x4208
 
+/* Get clear_child_tid address */
+#define PTRACE_GET_TID_ADDRESS	0x4209
+
 /* flags in @data for PTRACE_SEIZE */
 #define PTRACE_SEIZE_DEVEL	0x80000000 /* temp flag for development */
 
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index 00ab2ca..ed7fbe7 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
@@ -845,6 +845,9 @@ int ptrace_request(struct task_struct *child, long request,
 		break;
 	}
 #endif
+	case PTRACE_GET_TID_ADDRESS:
+		return put_user(child->clear_child_tid, (int __user **) data);
+
 	default:
 		break;
 	}
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-03 11:11 [PATCH] ptrace: add ability to get clear_tid_address Andrew Vagin
@ 2012-02-03 16:25 ` Tejun Heo
  2012-02-03 16:30   ` Cyrill Gorcunov
  2012-02-03 16:45   ` Pavel Emelyanov
  0 siblings, 2 replies; 22+ messages in thread
From: Tejun Heo @ 2012-02-03 16:25 UTC (permalink / raw)
  To: Andrew Vagin
  Cc: linux-kernel, Oleg Nesterov, Roland McGrath, Cyrill Gorcunov,
	Pavel Emelyanov

On Fri, Feb 03, 2012 at 02:11:23PM +0300, Andrew Vagin wrote:
> Zero is written at clear_tid_address, when the process exits.
> This functionality is used by pthread_join().
> 
> sys_set_tid_address() changes this address for current task.
> 
> Before this patch clear_tid_address could not be got from user space.
> I want to dump a full state of a task, so I need this address.
> Also I think it may be useful for debugging a multithreading program.
> 
> I am not sure that ptrace is suitable place. It may be added in prctl,
> but I think it's a bit useless and strange. I can't image a real
> situation (avoid checkpointing) when a thread will want to get own
> clear_tid_address from itself, this address is used by parent ussually.
> 
> Signed-off-by: Andrew Vagin <avagin@openvz.org>

Ummm... this really doesn't fit in ptrace.  Cyrill, why not put it
together with other params you're exporting?

Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-03 16:25 ` Tejun Heo
@ 2012-02-03 16:30   ` Cyrill Gorcunov
  2012-02-03 16:41     ` Oleg Nesterov
  2012-02-03 16:45   ` Pavel Emelyanov
  1 sibling, 1 reply; 22+ messages in thread
From: Cyrill Gorcunov @ 2012-02-03 16:30 UTC (permalink / raw)
  To: Tejun Heo
  Cc: Andrew Vagin, linux-kernel, Oleg Nesterov, Roland McGrath,
	Pavel Emelyanov

On Fri, Feb 03, 2012 at 08:25:19AM -0800, Tejun Heo wrote:
> On Fri, Feb 03, 2012 at 02:11:23PM +0300, Andrew Vagin wrote:
> > Zero is written at clear_tid_address, when the process exits.
> > This functionality is used by pthread_join().
> > 
> > sys_set_tid_address() changes this address for current task.
> > 
> > Before this patch clear_tid_address could not be got from user space.
> > I want to dump a full state of a task, so I need this address.
> > Also I think it may be useful for debugging a multithreading program.
> > 
> > I am not sure that ptrace is suitable place. It may be added in prctl,
> > but I think it's a bit useless and strange. I can't image a real
> > situation (avoid checkpointing) when a thread will want to get own
> > clear_tid_address from itself, this address is used by parent ussually.
> > 
> > Signed-off-by: Andrew Vagin <avagin@openvz.org>
> 
> Ummm... this really doesn't fit in ptrace.  Cyrill, why not put it
> together with other params you're exporting?
> 

We could add it to /proc/pid/stat (but I fear Andrew Morton shoot me then ;)

	Cyrill

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-03 16:30   ` Cyrill Gorcunov
@ 2012-02-03 16:41     ` Oleg Nesterov
  2012-02-03 16:54       ` Cyrill Gorcunov
  0 siblings, 1 reply; 22+ messages in thread
From: Oleg Nesterov @ 2012-02-03 16:41 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: Tejun Heo, Andrew Vagin, linux-kernel, Roland McGrath, Pavel Emelyanov

On 02/03, Cyrill Gorcunov wrote:
>
> On Fri, Feb 03, 2012 at 08:25:19AM -0800, Tejun Heo wrote:
>
> > Ummm... this really doesn't fit in ptrace.  Cyrill, why not put it
> > together with other params you're exporting?

I agree. And to me this looks strange: some info is exported via /proc,
some things need ptrace.

> We could add it to /proc/pid/stat (but I fear Andrew Morton shoot me then ;)

may be you can add /proc/pid/misc_ugly^Wrandom_things_for_cr which
you can extend as needed ;)

Oleg.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-03 16:25 ` Tejun Heo
  2012-02-03 16:30   ` Cyrill Gorcunov
@ 2012-02-03 16:45   ` Pavel Emelyanov
  2012-02-03 16:51     ` Oleg Nesterov
  1 sibling, 1 reply; 22+ messages in thread
From: Pavel Emelyanov @ 2012-02-03 16:45 UTC (permalink / raw)
  To: Tejun Heo
  Cc: Andrew Vagin, linux-kernel, Oleg Nesterov, Roland McGrath,
	Cyrill Gorcunov

On 02/03/2012 08:25 PM, Tejun Heo wrote:
> On Fri, Feb 03, 2012 at 02:11:23PM +0300, Andrew Vagin wrote:
>> Zero is written at clear_tid_address, when the process exits.
>> This functionality is used by pthread_join().
>>
>> sys_set_tid_address() changes this address for current task.
>>
>> Before this patch clear_tid_address could not be got from user space.
>> I want to dump a full state of a task, so I need this address.
>> Also I think it may be useful for debugging a multithreading program.
>>
>> I am not sure that ptrace is suitable place. It may be added in prctl,
>> but I think it's a bit useless and strange. I can't image a real
>> situation (avoid checkpointing) when a thread will want to get own
>> clear_tid_address from itself, this address is used by parent ussually.
>>
>> Signed-off-by: Andrew Vagin <avagin@openvz.org>
> 
> Ummm... this really doesn't fit in ptrace.  Cyrill, why not put it
> together with other params you're exporting?

Because there's no need for current to get this value of himself, but can
be useful for e.g. gdb. But we don't insist. Prctl extension is just fine.

> Thanks.
> 


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-03 16:45   ` Pavel Emelyanov
@ 2012-02-03 16:51     ` Oleg Nesterov
  2012-02-07 20:07       ` Pedro Alves
  0 siblings, 1 reply; 22+ messages in thread
From: Oleg Nesterov @ 2012-02-03 16:51 UTC (permalink / raw)
  To: Pavel Emelyanov, Jan Kratochvil, Pedro Alves
  Cc: Tejun Heo, Andrew Vagin, linux-kernel, Roland McGrath, Cyrill Gorcunov

On 02/03, Pavel Emelyanov wrote:
>
> On 02/03/2012 08:25 PM, Tejun Heo wrote:
> > On Fri, Feb 03, 2012 at 02:11:23PM +0300, Andrew Vagin wrote:
> >> Zero is written at clear_tid_address, when the process exits.
> >> This functionality is used by pthread_join().
> >>
> >> sys_set_tid_address() changes this address for current task.
> >>
> >> Before this patch clear_tid_address could not be got from user space.
> >> I want to dump a full state of a task, so I need this address.
> >> Also I think it may be useful for debugging a multithreading program.
> >>
> >> I am not sure that ptrace is suitable place. It may be added in prctl,
> >> but I think it's a bit useless and strange. I can't image a real
> >> situation (avoid checkpointing) when a thread will want to get own
> >> clear_tid_address from itself, this address is used by parent ussually.
> >>
> >> Signed-off-by: Andrew Vagin <avagin@openvz.org>
> >
> > Ummm... this really doesn't fit in ptrace.  Cyrill, why not put it
> > together with other params you're exporting?
>
> Because there's no need for current to get this value of himself, but can
> be useful for e.g. gdb.

OK, perhaps this makes sense, I do not know.

Jan, Pedro, do you think gdb can use PTRACE_GET_TID_ADDRESS (returns
tracee->clear_child_tid) ?

Oleg.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-03 16:41     ` Oleg Nesterov
@ 2012-02-03 16:54       ` Cyrill Gorcunov
  0 siblings, 0 replies; 22+ messages in thread
From: Cyrill Gorcunov @ 2012-02-03 16:54 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: Tejun Heo, Andrew Vagin, linux-kernel, Roland McGrath, Pavel Emelyanov

On Fri, Feb 03, 2012 at 05:41:29PM +0100, Oleg Nesterov wrote:
> On 02/03, Cyrill Gorcunov wrote:
> >
> > On Fri, Feb 03, 2012 at 08:25:19AM -0800, Tejun Heo wrote:
> >
> > > Ummm... this really doesn't fit in ptrace.  Cyrill, why not put it
> > > together with other params you're exporting?
> 
> I agree. And to me this looks strange: some info is exported via /proc,
> some things need ptrace.
> 
> > We could add it to /proc/pid/stat (but I fear Andrew Morton shoot me then ;)
> 
> may be you can add /proc/pid/misc_ugly^Wrandom_things_for_cr which
> you can extend as needed ;)
> 

I personally don't mind to have /proc/pid/cr directory where we could
export all the data we might ever need. Still some things added (such
as /proc/pid/children) could be useful for other purposes as well, not
only c/r.

	Cyrill

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-03 16:51     ` Oleg Nesterov
@ 2012-02-07 20:07       ` Pedro Alves
  2012-02-07 20:56         ` Cyrill Gorcunov
  2012-02-08 13:41         ` Andrew Vagin
  0 siblings, 2 replies; 22+ messages in thread
From: Pedro Alves @ 2012-02-07 20:07 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: Pavel Emelyanov, Jan Kratochvil, Tejun Heo, Andrew Vagin,
	linux-kernel, Cyrill Gorcunov

On 02/03/2012 04:51 PM, Oleg Nesterov wrote:
> On 02/03, Pavel Emelyanov wrote:

>> Because there's no need for current to get this value of himself, but can
>> be useful for e.g. gdb.
> 
> OK, perhaps this makes sense, I do not know.
> 
> Jan, Pedro, do you think gdb can use PTRACE_GET_TID_ADDRESS (returns
> tracee->clear_child_tid) ?

Off hand, I'm not picturing a use.  But that may well just mean I'm lacking
imagination.  Andrew, Pavel, did you have a particular idea in mind when you
said it may be useful for debugging a multithreading program / gdb?

-- 
Pedro Alves

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-07 20:07       ` Pedro Alves
@ 2012-02-07 20:56         ` Cyrill Gorcunov
  2012-02-07 21:15           ` Pedro Alves
  2012-02-08 13:41         ` Andrew Vagin
  1 sibling, 1 reply; 22+ messages in thread
From: Cyrill Gorcunov @ 2012-02-07 20:56 UTC (permalink / raw)
  To: Pedro Alves
  Cc: Oleg Nesterov, Pavel Emelyanov, Jan Kratochvil, Tejun Heo,
	Andrew Vagin, linux-kernel

On Tue, Feb 07, 2012 at 08:07:38PM +0000, Pedro Alves wrote:
> On 02/03/2012 04:51 PM, Oleg Nesterov wrote:
> > On 02/03, Pavel Emelyanov wrote:
> 
> >> Because there's no need for current to get this value of himself, but can
> >> be useful for e.g. gdb.
> > 
> > OK, perhaps this makes sense, I do not know.
> > 
> > Jan, Pedro, do you think gdb can use PTRACE_GET_TID_ADDRESS (returns
> > tracee->clear_child_tid) ?
> 
> Off hand, I'm not picturing a use.  But that may well just mean I'm lacking
> imagination.  Andrew, Pavel, did you have a particular idea in mind when you
> said it may be useful for debugging a multithreading program / gdb?
> 

Might not we set up hw watchpoint on this address and get interrupt
before pthread-join will find it? (To be fair I'm not sure if such
trick will work, didn't test ;)

	Cyrill

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-07 20:56         ` Cyrill Gorcunov
@ 2012-02-07 21:15           ` Pedro Alves
  2012-02-07 21:51             ` Cyrill Gorcunov
  0 siblings, 1 reply; 22+ messages in thread
From: Pedro Alves @ 2012-02-07 21:15 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: Oleg Nesterov, Pavel Emelyanov, Jan Kratochvil, Tejun Heo,
	Andrew Vagin, linux-kernel

On 02/07/2012 08:56 PM, Cyrill Gorcunov wrote:
> On Tue, Feb 07, 2012 at 08:07:38PM +0000, Pedro Alves wrote:
>> On 02/03/2012 04:51 PM, Oleg Nesterov wrote:
>>> On 02/03, Pavel Emelyanov wrote:
>>
>>>> Because there's no need for current to get this value of himself, but can
>>>> be useful for e.g. gdb.
>>>
>>> OK, perhaps this makes sense, I do not know.
>>>
>>> Jan, Pedro, do you think gdb can use PTRACE_GET_TID_ADDRESS (returns
>>> tracee->clear_child_tid) ?
>>
>> Off hand, I'm not picturing a use.  But that may well just mean I'm lacking
>> imagination.  Andrew, Pavel, did you have a particular idea in mind when you
>> said it may be useful for debugging a multithreading program / gdb?
>>
> 
> Might not we set up hw watchpoint on this address and get interrupt
> before pthread-join will find it? (To be fair I'm not sure if such
> trick will work, didn't test ;)

For a debugger wanting to know when a pthread_join was about to return?
Might be simpler to put a breakpoint (or stap probe, or some such) inside
pthread_join.

It's the kernel that writes to this address, so I've no
idea if the watchpoint trap ends up visible on userspace.  Which thread
would it be reported to, given that this is cleared when the child
is gone, I have no idea either.

-- 
Pedro Alves

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-07 21:15           ` Pedro Alves
@ 2012-02-07 21:51             ` Cyrill Gorcunov
  2012-02-08 12:30               ` Pedro Alves
  0 siblings, 1 reply; 22+ messages in thread
From: Cyrill Gorcunov @ 2012-02-07 21:51 UTC (permalink / raw)
  To: Pedro Alves
  Cc: Oleg Nesterov, Pavel Emelyanov, Jan Kratochvil, Tejun Heo,
	Andrew Vagin, linux-kernel

On Tue, Feb 07, 2012 at 09:15:07PM +0000, Pedro Alves wrote:
> On 02/07/2012 08:56 PM, Cyrill Gorcunov wrote:
> > On Tue, Feb 07, 2012 at 08:07:38PM +0000, Pedro Alves wrote:
> >> On 02/03/2012 04:51 PM, Oleg Nesterov wrote:
> >>> On 02/03, Pavel Emelyanov wrote:
> >>
> >>>> Because there's no need for current to get this value of himself, but can
> >>>> be useful for e.g. gdb.
> >>>
> >>> OK, perhaps this makes sense, I do not know.
> >>>
> >>> Jan, Pedro, do you think gdb can use PTRACE_GET_TID_ADDRESS (returns
> >>> tracee->clear_child_tid) ?
> >>
> >> Off hand, I'm not picturing a use.  But that may well just mean I'm lacking
> >> imagination.  Andrew, Pavel, did you have a particular idea in mind when you
> >> said it may be useful for debugging a multithreading program / gdb?
> >>
> > 
> > Might not we set up hw watchpoint on this address and get interrupt
> > before pthread-join will find it? (To be fair I'm not sure if such
> > trick will work, didn't test ;)
> 
> For a debugger wanting to know when a pthread_join was about to return?
> Might be simpler to put a breakpoint (or stap probe, or some such) inside
> pthread_join.

Yes, could be, but it means you have to install pthread debug libs, right?
(have no idea actually since I personally use debug printing instead of
 breakpoints).

> It's the kernel that writes to this address, so I've no
> idea if the watchpoint trap ends up visible on userspace. Which thread
> would it be reported to, given that this is cleared when the child
> is gone, I have no idea either.

Yeah, need some help from someone who wrote hw-breakpoints support in
kernel (i don't remember the details).

	Cyrill

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-07 21:51             ` Cyrill Gorcunov
@ 2012-02-08 12:30               ` Pedro Alves
  2012-02-08 12:42                 ` Cyrill Gorcunov
  2012-02-08 17:31                 ` Oleg Nesterov
  0 siblings, 2 replies; 22+ messages in thread
From: Pedro Alves @ 2012-02-08 12:30 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: Oleg Nesterov, Pavel Emelyanov, Jan Kratochvil, Tejun Heo,
	Andrew Vagin, linux-kernel

On 02/07/2012 09:51 PM, Cyrill Gorcunov wrote:
> On Tue, Feb 07, 2012 at 09:15:07PM +0000, Pedro Alves wrote:
>> On 02/07/2012 08:56 PM, Cyrill Gorcunov wrote:
>>> On Tue, Feb 07, 2012 at 08:07:38PM +0000, Pedro Alves wrote:
>>>> On 02/03/2012 04:51 PM, Oleg Nesterov wrote:
>>>>> On 02/03, Pavel Emelyanov wrote:
>>>>
>>>>>> Because there's no need for current to get this value of himself, but can
>>>>>> be useful for e.g. gdb.
>>>>>
>>>>> OK, perhaps this makes sense, I do not know.
>>>>>
>>>>> Jan, Pedro, do you think gdb can use PTRACE_GET_TID_ADDRESS (returns
>>>>> tracee->clear_child_tid) ?
>>>>
>>>> Off hand, I'm not picturing a use.  But that may well just mean I'm lacking
>>>> imagination.  Andrew, Pavel, did you have a particular idea in mind when you
>>>> said it may be useful for debugging a multithreading program / gdb?
>>>>
>>>
>>> Might not we set up hw watchpoint on this address and get interrupt
>>> before pthread-join will find it? (To be fair I'm not sure if such
>>> trick will work, didn't test ;)
>>
>> For a debugger wanting to know when a pthread_join was about to return?
>> Might be simpler to put a breakpoint (or stap probe, or some such) inside
>> pthread_join.
> 
> Yes, could be, but it means you have to install pthread debug libs, right?
> (have no idea actually since I personally use debug printing instead of
>  breakpoints).

Not really more than what we need today.  Just some exported function name
in the elf symbol tables.  Assuming a the program is using clear_child_tid
address for pthread_join as glibc is may not be a good idea.  It's doing
things at the wrong layer.  Also, hardware watchpoints are a scarse
resource.

>> It's the kernel that writes to this address, so I've no
>> idea if the watchpoint trap ends up visible on userspace. Which thread
>> would it be reported to, given that this is cleared when the child
>> is gone, I have no idea either.
> 
> Yeah, need some help from someone who wrote hw-breakpoints support in
> kernel (i don't remember the details).

I just tried it.  This is &pthread->tid in glibc/libpthread, so with debug
info it's easy to figure out where to set the watchpoint manually with gdb
without asking the kernel.  Doesn't work.  ptrace doesn't show any trap
for the kernel writes.

-- 
Pedro Alves

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-08 12:30               ` Pedro Alves
@ 2012-02-08 12:42                 ` Cyrill Gorcunov
  2012-02-08 17:31                 ` Oleg Nesterov
  1 sibling, 0 replies; 22+ messages in thread
From: Cyrill Gorcunov @ 2012-02-08 12:42 UTC (permalink / raw)
  To: Pedro Alves
  Cc: Oleg Nesterov, Pavel Emelyanov, Jan Kratochvil, Tejun Heo,
	Andrew Vagin, linux-kernel

On Wed, Feb 08, 2012 at 12:30:47PM +0000, Pedro Alves wrote:
> > 
> > Yes, could be, but it means you have to install pthread debug libs, right?
> > (have no idea actually since I personally use debug printing instead of
> >  breakpoints).
> 
> Not really more than what we need today.  Just some exported function name
> in the elf symbol tables.  Assuming a the program is using clear_child_tid
> address for pthread_join as glibc is may not be a good idea.  It's doing
> things at the wrong layer.  Also, hardware watchpoints are a scarse
> resource.

It's pretty precious resource still incredibly useful. ok, i see
what you mean, thanks.

> 
> >> It's the kernel that writes to this address, so I've no
> >> idea if the watchpoint trap ends up visible on userspace. Which thread
> >> would it be reported to, given that this is cleared when the child
> >> is gone, I have no idea either.
> > 
> > Yeah, need some help from someone who wrote hw-breakpoints support in
> > kernel (i don't remember the details).
> 
> I just tried it.  This is &pthread->tid in glibc/libpthread, so with debug
> info it's easy to figure out where to set the watchpoint manually with gdb
> without asking the kernel.  Doesn't work.  ptrace doesn't show any trap
> for the kernel writes.
>

Thanks for info. 

	Cyrill

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-07 20:07       ` Pedro Alves
  2012-02-07 20:56         ` Cyrill Gorcunov
@ 2012-02-08 13:41         ` Andrew Vagin
  2012-02-08 18:12           ` Jan Kratochvil
  1 sibling, 1 reply; 22+ messages in thread
From: Andrew Vagin @ 2012-02-08 13:41 UTC (permalink / raw)
  To: Pedro Alves
  Cc: Oleg Nesterov, Pavel Emelyanov, Jan Kratochvil, Tejun Heo,
	Andrew Vagin, linux-kernel, Cyrill Gorcunov

Hi All,
> Off hand, I'm not picturing a use.  But that may well just mean I'm lacking
> imagination.  Andrew, Pavel, did you have a particular idea in mind when you
> said it may be useful for debugging a multithreading program / gdb?
For example:

pthread_join() waits on a futex (child_tid_address), but a thread is 
dead already.

Where is the problem? At first I would want to check, that 
pthread_join() uses the correct address of the futex. The simple way is 
to connect to this process via gdb
and get it.

I want to say, that when you have trouble with child_tid_address, you 
may want to get it.
If the code is your, you may get it via prctl, but if it's not, what 
will you do?

Yes, we have lived without this for a long time, so I can assume that 
all what I tell is useless.

But one more reason why I want to add this in ptrace.
I want use this functionality to dump a process state.
Now we do a few actions in a context of the process which we want to 
dump. A parasite code is injected for that. This way is dangerous, 
because it may affect a target process (It may occur due to a bug in 
parasite). We use this way, because we want to add minimum functionality 
in the kernel. Our current goal is to make a full functional prototype 
and when everyone will understand that this project works and it's 
usefull, we will do improvements. And I hope in future we will save 
state of processes without parasite.

For this reason I avoid adding new actions in a parasite code, but 
prctl() can be executed only from parasite code.

If after all you are not sure that this functionality should be in 
ptrace, I will add it in prctl, it's not a problem.

Thanks.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-08 12:30               ` Pedro Alves
  2012-02-08 12:42                 ` Cyrill Gorcunov
@ 2012-02-08 17:31                 ` Oleg Nesterov
  2012-02-08 18:04                   ` Pedro Alves
  1 sibling, 1 reply; 22+ messages in thread
From: Oleg Nesterov @ 2012-02-08 17:31 UTC (permalink / raw)
  To: Pedro Alves
  Cc: Cyrill Gorcunov, Pavel Emelyanov, Jan Kratochvil, Tejun Heo,
	Andrew Vagin, linux-kernel

On 02/08, Pedro Alves wrote:
>
> I just tried it.  This is &pthread->tid in glibc/libpthread, so with debug
> info it's easy to figure out where to set the watchpoint manually with gdb
> without asking the kernel.  Doesn't work.  ptrace doesn't show any trap
> for the kernel writes.

The tracee simply can't report this trap. it is already dead ;) and
hw breakpoint (used by ptrace) is "pinned" to the thread.

Oleg.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-08 17:31                 ` Oleg Nesterov
@ 2012-02-08 18:04                   ` Pedro Alves
  2012-02-08 19:02                     ` Oleg Nesterov
  0 siblings, 1 reply; 22+ messages in thread
From: Pedro Alves @ 2012-02-08 18:04 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: Cyrill Gorcunov, Pavel Emelyanov, Jan Kratochvil, Tejun Heo,
	Andrew Vagin, linux-kernel

On 02/08/2012 05:31 PM, Oleg Nesterov wrote:
> On 02/08, Pedro Alves wrote:
>>
>> I just tried it.  This is &pthread->tid in glibc/libpthread, so with debug
>> info it's easy to figure out where to set the watchpoint manually with gdb
>> without asking the kernel.  Doesn't work.  ptrace doesn't show any trap
>> for the kernel writes.
> 
> The tracee simply can't report this trap. it is already dead ;) and
> hw breakpoint (used by ptrace) is "pinned" to the thread.

Right, as I said.  :-)  I saw that a watchpoint trap isn't reported either
for the CLONE_CHILD_SETTID case (that is, within clone, when the kernel
writes the tid to the memory address passed in to the clone syscall).
I wouldn't have been surprised to see the trap in userspace in either
the parent or the child, though I'm not really surprised to not
see it either.

-- 
Pedro Alves

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-08 13:41         ` Andrew Vagin
@ 2012-02-08 18:12           ` Jan Kratochvil
  2012-02-10  3:02             ` Jamie Lokier
  0 siblings, 1 reply; 22+ messages in thread
From: Jan Kratochvil @ 2012-02-08 18:12 UTC (permalink / raw)
  To: Andrew Vagin
  Cc: Pedro Alves, Oleg Nesterov, Pavel Emelyanov, Tejun Heo,
	Andrew Vagin, linux-kernel, Cyrill Gorcunov

On Wed, 08 Feb 2012 14:41:45 +0100, Andrew Vagin wrote:
> I want to say, that when you have trouble with child_tid_address,
> you may want to get it.
> If the code is your, you may get it via prctl, but if it's not, what
> will you do?

GDB does PTRACE_ARCH_PRCTL (amd64-linux-nat.c) - without inserting any code
into the debuggee.  How it can be simplified more?


Jan

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-08 18:04                   ` Pedro Alves
@ 2012-02-08 19:02                     ` Oleg Nesterov
  2012-02-08 19:20                       ` Cyrill Gorcunov
                                         ` (2 more replies)
  0 siblings, 3 replies; 22+ messages in thread
From: Oleg Nesterov @ 2012-02-08 19:02 UTC (permalink / raw)
  To: Pedro Alves
  Cc: Cyrill Gorcunov, Pavel Emelyanov, Jan Kratochvil, Tejun Heo,
	Andrew Vagin, linux-kernel

On 02/08, Pedro Alves wrote:
>
> On 02/08/2012 05:31 PM, Oleg Nesterov wrote:
> > On 02/08, Pedro Alves wrote:
> >>
> >> I just tried it.  This is &pthread->tid in glibc/libpthread, so with debug
> >> info it's easy to figure out where to set the watchpoint manually with gdb
> >> without asking the kernel.  Doesn't work.  ptrace doesn't show any trap
> >> for the kernel writes.
> >
> > The tracee simply can't report this trap. it is already dead ;) and
> > hw breakpoint (used by ptrace) is "pinned" to the thread.
>
> Right, as I said.  :-)  I saw that a watchpoint trap isn't reported either
> for the CLONE_CHILD_SETTID case (that is, within clone, when the kernel
> writes the tid to the memory address passed in to the clone syscall).

Yes. But in this case the new thread has no bps even if it is auto-
attached.

IOW, I think that hw bp can detect the write from the kernel space,
but I didn't check.

> I wouldn't have been surprised to see the trap in userspace in either
> the parent

It would be just wrong. Please note that it is child, not parent, who
does the write.




If only I understood why do we need CLONE_CHILD_SETTID... at least
I certainly do not understand why glibc translates fork() into
clone(CLONE_CHILD_SETTID) on my system. The child write into its
memory, the parent can't see this change. IIRC, initially
CLONE_CHILD_SETTID wrote child->pid into the parent's memory, and
even before the child was actually created.

Oleg.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-08 19:02                     ` Oleg Nesterov
@ 2012-02-08 19:20                       ` Cyrill Gorcunov
  2012-02-08 19:21                       ` Jan Kratochvil
  2012-02-08 19:42                       ` Pedro Alves
  2 siblings, 0 replies; 22+ messages in thread
From: Cyrill Gorcunov @ 2012-02-08 19:20 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: Pedro Alves, Pavel Emelyanov, Jan Kratochvil, Tejun Heo,
	Andrew Vagin, linux-kernel

On Wed, Feb 08, 2012 at 08:02:50PM +0100, Oleg Nesterov wrote:
> > Right, as I said.  :-)  I saw that a watchpoint trap isn't reported either
> > for the CLONE_CHILD_SETTID case (that is, within clone, when the kernel
> > writes the tid to the memory address passed in to the clone syscall).
> 
> Yes. But in this case the new thread has no bps even if it is auto-
> attached.
> 
> IOW, I think that hw bp can detect the write from the kernel space,
> but I didn't check.

yes, that's how kgdb work (if only I'm not missing something obvious)

	Cyrill

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-08 19:02                     ` Oleg Nesterov
  2012-02-08 19:20                       ` Cyrill Gorcunov
@ 2012-02-08 19:21                       ` Jan Kratochvil
  2012-02-08 19:42                       ` Pedro Alves
  2 siblings, 0 replies; 22+ messages in thread
From: Jan Kratochvil @ 2012-02-08 19:21 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: Pedro Alves, Cyrill Gorcunov, Pavel Emelyanov, Tejun Heo,
	Andrew Vagin, linux-kernel

On Wed, 08 Feb 2012 20:02:50 +0100, Oleg Nesterov wrote:
> If only I understood why do we need CLONE_CHILD_SETTID... at least
> I certainly do not understand why glibc translates fork() into
> clone(CLONE_CHILD_SETTID) on my system. The child write into its
> memory, the parent can't see this change. IIRC, initially
> CLONE_CHILD_SETTID wrote child->pid into the parent's memory, and
> even before the child was actually created.

IIUC your question correctly it is because if you PTRACE_SYSCALL SYS_fork
(therefore you PTRACE_SYSCALL SYS_clone) twice (therefore you stop on the
fork/clone syscall exit) you should have struct pthread contents valid for
iterating and examinating the thread structures via libthread_db.

This cannot be achieved by any userland code.


Regards,
Jan

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-08 19:02                     ` Oleg Nesterov
  2012-02-08 19:20                       ` Cyrill Gorcunov
  2012-02-08 19:21                       ` Jan Kratochvil
@ 2012-02-08 19:42                       ` Pedro Alves
  2 siblings, 0 replies; 22+ messages in thread
From: Pedro Alves @ 2012-02-08 19:42 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: Cyrill Gorcunov, Pavel Emelyanov, Jan Kratochvil, Tejun Heo,
	Andrew Vagin, linux-kernel

On 02/08/2012 07:02 PM, Oleg Nesterov wrote:
> On 02/08, Pedro Alves wrote:
>>
>> On 02/08/2012 05:31 PM, Oleg Nesterov wrote:
>>> On 02/08, Pedro Alves wrote:
>>>>
>>>> I just tried it.  This is &pthread->tid in glibc/libpthread, so with debug
>>>> info it's easy to figure out where to set the watchpoint manually with gdb
>>>> without asking the kernel.  Doesn't work.  ptrace doesn't show any trap
>>>> for the kernel writes.
>>>
>>> The tracee simply can't report this trap. it is already dead ;) and
>>> hw breakpoint (used by ptrace) is "pinned" to the thread.
>>
>> Right, as I said.  :-)  I saw that a watchpoint trap isn't reported either
>> for the CLONE_CHILD_SETTID case (that is, within clone, when the kernel
>> writes the tid to the memory address passed in to the clone syscall).
> 
> Yes. But in this case the new thread has no bps even if it is auto-
> attached.

Ah, right.  It used to be the kernel copied the debug registers from
parent->child, but they're always cleared in the child nowadays
(since 72f674d203cd230426437cdcf7dd6f681dad8b0d).

>> I wouldn't have been surprised to see the trap in userspace in either
>> the parent
> 
> It would be just wrong. Please note that it is child, not parent, who
> does the write.

Okay, I didn't know which it was that touched the memory,
hence the "either".  Thanks.  Paired with the
we-now-clear-debug-regs-on-clone thing, it makes sense.

-- 
Pedro Alves

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH] ptrace: add ability to get clear_tid_address
  2012-02-08 18:12           ` Jan Kratochvil
@ 2012-02-10  3:02             ` Jamie Lokier
  0 siblings, 0 replies; 22+ messages in thread
From: Jamie Lokier @ 2012-02-10  3:02 UTC (permalink / raw)
  To: Jan Kratochvil
  Cc: Andrew Vagin, Pedro Alves, Oleg Nesterov, Pavel Emelyanov,
	Tejun Heo, Andrew Vagin, linux-kernel, Cyrill Gorcunov

Jan Kratochvil wrote:
> On Wed, 08 Feb 2012 14:41:45 +0100, Andrew Vagin wrote:
> > I want to say, that when you have trouble with child_tid_address,
> > you may want to get it.
> > If the code is your, you may get it via prctl, but if it's not, what
> > will you do?
> 
> GDB does PTRACE_ARCH_PRCTL (amd64-linux-nat.c) - without inserting any code
> into the debuggee.  How it can be simplified more?

That's x86-64 only, (although bizarrely it looks like 32-bit tasks can
use it too, if running on a 64-bit kernel).

Whereas child_tid_address is for all architectures.

We've already got a whole syscall, get_robust_list(), which fetches
that address from a remote process if you have ptrace permission, and
you don't even need to be ptracing it!  get_robust_list() is quite
large, and most of it is permission checks.  How often is that useful?

I don't see why getting the child_tid_address should be a big deal.

On the other hand, lots of little bits of info would be handy to a
ptracer sometimes, such as the current signal mask and prctl settings.

Maybe what's needed is a generic PTRACE_PRCTL, allowed to call a
subset of prctl() functions from outside, or maybe even all of them.

Then add child_tid_address as a prctl.

( Then again maybe just skip the messing around that everyone does with
"parasite" code, and go straight for PTRACE_CALL_SYSCALL.  It'd save a
lot of bother :-) )

All the best,
-- Jamie

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2012-02-10  3:03 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-02-03 11:11 [PATCH] ptrace: add ability to get clear_tid_address Andrew Vagin
2012-02-03 16:25 ` Tejun Heo
2012-02-03 16:30   ` Cyrill Gorcunov
2012-02-03 16:41     ` Oleg Nesterov
2012-02-03 16:54       ` Cyrill Gorcunov
2012-02-03 16:45   ` Pavel Emelyanov
2012-02-03 16:51     ` Oleg Nesterov
2012-02-07 20:07       ` Pedro Alves
2012-02-07 20:56         ` Cyrill Gorcunov
2012-02-07 21:15           ` Pedro Alves
2012-02-07 21:51             ` Cyrill Gorcunov
2012-02-08 12:30               ` Pedro Alves
2012-02-08 12:42                 ` Cyrill Gorcunov
2012-02-08 17:31                 ` Oleg Nesterov
2012-02-08 18:04                   ` Pedro Alves
2012-02-08 19:02                     ` Oleg Nesterov
2012-02-08 19:20                       ` Cyrill Gorcunov
2012-02-08 19:21                       ` Jan Kratochvil
2012-02-08 19:42                       ` Pedro Alves
2012-02-08 13:41         ` Andrew Vagin
2012-02-08 18:12           ` Jan Kratochvil
2012-02-10  3:02             ` Jamie Lokier

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.