* /proc visibility patch breaks GDB, etc.
@ 2004-02-26 6:27 Peter Chubb
2004-02-26 6:44 ` Andrew Morton
0 siblings, 1 reply; 11+ messages in thread
From: Peter Chubb @ 2004-02-26 6:27 UTC (permalink / raw)
To: akpm, kingsley; +Cc: linux-kernel
In fs/proc/base.c:proc_pid_lookup(), the patch
read_unlock(&tasklist_lock);
if (!task)
goto out;
+ if (!thread_group_leader(task))
+ goto out_drop_task;
inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO);
means that threads other than the thread group leader don't appear in
the /proc top-level directory. Programs that are informed via pid of
events can no longer find the appropriate process -- for example,
using gdb on a multi-threaded process, or profiling using perfmon.
The immediate symptom is GDB saying:
Could not open /proc/757/status
when 757 is a TID not a PID.
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: /proc visibility patch breaks GDB, etc. 2004-02-26 6:27 /proc visibility patch breaks GDB, etc Peter Chubb @ 2004-02-26 6:44 ` Andrew Morton 2004-02-26 16:02 ` Daniel Jacobowitz 2004-02-26 19:39 ` David Mosberger 0 siblings, 2 replies; 11+ messages in thread From: Andrew Morton @ 2004-02-26 6:44 UTC (permalink / raw) To: Peter Chubb; +Cc: kingsley, linux-kernel Peter Chubb <peter@chubb.wattle.id.au> wrote: > > > In fs/proc/base.c:proc_pid_lookup(), the patch > > read_unlock(&tasklist_lock); > if (!task) > goto out; > + if (!thread_group_leader(task)) > + goto out_drop_task; > > inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); > > means that threads other than the thread group leader don't appear in > the /proc top-level directory. Programs that are informed via pid of > events can no longer find the appropriate process -- for example, > using gdb on a multi-threaded process, or profiling using perfmon. > > The immediate symptom is GDB saying: > Could not open /proc/757/status > when 757 is a TID not a PID. What does `ls /proc/757' say? Presumably no such file or directory? It's fairly bizare behaviour to be able to open files which don't exist according to readdir, which is why we made that change. The node to tid 757 should appear under its thread group leader's directory: /proc/NNN/757. That node should be visible to readdir, and that is the node which gdb and perfmon should be looking for. Of course, we may have burnt our boats with the initial silliness. It's a shame that gdb and perfmon went and used it. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: /proc visibility patch breaks GDB, etc. 2004-02-26 6:44 ` Andrew Morton @ 2004-02-26 16:02 ` Daniel Jacobowitz 2004-02-26 19:39 ` David Mosberger 1 sibling, 0 replies; 11+ messages in thread From: Daniel Jacobowitz @ 2004-02-26 16:02 UTC (permalink / raw) To: Andrew Morton; +Cc: Peter Chubb, kingsley, linux-kernel On Wed, Feb 25, 2004 at 10:44:10PM -0800, Andrew Morton wrote: > Peter Chubb <peter@chubb.wattle.id.au> wrote: > > > > > > In fs/proc/base.c:proc_pid_lookup(), the patch > > > > read_unlock(&tasklist_lock); > > if (!task) > > goto out; > > + if (!thread_group_leader(task)) > > + goto out_drop_task; > > > > inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); > > > > means that threads other than the thread group leader don't appear in > > the /proc top-level directory. Programs that are informed via pid of > > events can no longer find the appropriate process -- for example, > > using gdb on a multi-threaded process, or profiling using perfmon. > > > > The immediate symptom is GDB saying: > > Could not open /proc/757/status > > when 757 is a TID not a PID. > > What does `ls /proc/757' say? Presumably no such file or directory? > It's fairly bizare behaviour to be able to open files which don't exist > according to readdir, which is why we made that change. > > The node to tid 757 should appear under its thread group leader's > directory: /proc/NNN/757. That node should be visible to readdir, and that > is the node which gdb and perfmon should be looking for. > > Of course, we may have burnt our boats with the initial silliness. It's a > shame that gdb and perfmon went and used it. GDB has used it since long before any of this happened. LinuxThreads didn't use thread groups, remember? There is no way from GDB to figure out which thread is the thread group leader, either, so I don't know how you propose it find the proc directory now. -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: /proc visibility patch breaks GDB, etc. 2004-02-26 6:44 ` Andrew Morton 2004-02-26 16:02 ` Daniel Jacobowitz @ 2004-02-26 19:39 ` David Mosberger 2004-02-26 20:09 ` Andrew Morton 2004-02-26 20:10 ` Peter Chubb 1 sibling, 2 replies; 11+ messages in thread From: David Mosberger @ 2004-02-26 19:39 UTC (permalink / raw) To: Andrew Morton; +Cc: Peter Chubb, kingsley, linux-kernel >>>>> On Wed, 25 Feb 2004 22:44:10 -0800, Andrew Morton <akpm@osdl.org> said: Andrew> Peter Chubb <peter@chubb.wattle.id.au> wrote: >> >> >> In fs/proc/base.c:proc_pid_lookup(), the patch >> >> read_unlock(&tasklist_lock); if (!task) goto out; + if >> (!thread_group_leader(task)) + goto out_drop_task; >> >> inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); >> >> means that threads other than the thread group leader don't >> appear in the /proc top-level directory. Programs that are >> informed via pid of events can no longer find the appropriate >> process -- for example, using gdb on a multi-threaded process, or >> profiling using perfmon. >> >> The immediate symptom is GDB saying: Could not open >> /proc/757/status when 757 is a TID not a PID. Andrew> What does `ls /proc/757' say? Presumably no such file or Andrew> directory? It's fairly bizare behaviour to be able to open Andrew> files which don't exist according to readdir, which is why Andrew> we made that change. Excuse, but this seems seriously FOOBAR. I understand that it's interesting to see the thread-leader/thread relationship, but surely that's no reason to break backwards compatibility and the ability to look up _any_ task's info via /proc/PID/. A program that only wants to show "processes" (thread-group leaders) can simply read /proc/PID/status and ignore the entries for which Tgid != PPid. Perhaps you could put relative symlinks in task/? Something like this: $ ls -l /proc/self/task dr-xr-xr-x 3 davidm users 0 Feb 26 11:37 13494 -> .. dr-xr-xr-x 3 davidm users 0 Feb 26 11:37 13495 -> ../../13495 perhaps? --david ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: /proc visibility patch breaks GDB, etc. 2004-02-26 19:39 ` David Mosberger @ 2004-02-26 20:09 ` Andrew Morton 2004-02-26 21:59 ` Kingsley Cheung 2004-02-26 20:10 ` Peter Chubb 1 sibling, 1 reply; 11+ messages in thread From: Andrew Morton @ 2004-02-26 20:09 UTC (permalink / raw) To: davidm; +Cc: davidm, peter, kingsley, linux-kernel, Daniel Jacobowitz David Mosberger <davidm@napali.hpl.hp.com> wrote: > > >>>>> On Wed, 25 Feb 2004 22:44:10 -0800, Andrew Morton <akpm@osdl.org> said: > > Andrew> Peter Chubb <peter@chubb.wattle.id.au> wrote: > >> > >> > >> In fs/proc/base.c:proc_pid_lookup(), the patch > >> > >> read_unlock(&tasklist_lock); if (!task) goto out; + if > >> (!thread_group_leader(task)) + goto out_drop_task; > >> > >> inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); > >> > >> means that threads other than the thread group leader don't > >> appear in the /proc top-level directory. Programs that are > >> informed via pid of events can no longer find the appropriate > >> process -- for example, using gdb on a multi-threaded process, or > >> profiling using perfmon. > >> > >> The immediate symptom is GDB saying: Could not open > >> /proc/757/status when 757 is a TID not a PID. > > Andrew> What does `ls /proc/757' say? Presumably no such file or > Andrew> directory? It's fairly bizare behaviour to be able to open > Andrew> files which don't exist according to readdir, which is why > Andrew> we made that change. > > Excuse, but this seems seriously FOOBAR. I understand that it's > interesting to see the thread-leader/thread relationship, but surely > that's no reason to break backwards compatibility and the ability to > look up _any_ task's info via /proc/PID/. Well you can't look them up - you can only open them. But I take your point. In another life, these things would appear under a special /proc/magical_directory_which_has_dopey_semantics. > A program that only wants > to show "processes" (thread-group leaders) can simply read > /proc/PID/status and ignore the entries for which Tgid != PPid. > > Perhaps you could put relative symlinks in task/? Something like > this: > > $ ls -l /proc/self/task > dr-xr-xr-x 3 davidm users 0 Feb 26 11:37 13494 -> .. > dr-xr-xr-x 3 davidm users 0 Feb 26 11:37 13495 -> ../../13495 > > perhaps? Well the contents of /proc/pid/task are OK at present. I guess we should revert that change. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: /proc visibility patch breaks GDB, etc. 2004-02-26 20:09 ` Andrew Morton @ 2004-02-26 21:59 ` Kingsley Cheung 2004-02-26 22:14 ` Peter Chubb 2004-02-26 23:19 ` Andrew Morton 0 siblings, 2 replies; 11+ messages in thread From: Kingsley Cheung @ 2004-02-26 21:59 UTC (permalink / raw) To: Andrew Morton; +Cc: davidm, davidm, peter, linux-kernel, Daniel Jacobowitz On Thu, Feb 26, 2004 at 12:09:59PM -0800, Andrew Morton wrote: > David Mosberger <davidm@napali.hpl.hp.com> wrote: > > > > >>>>> On Wed, 25 Feb 2004 22:44:10 -0800, Andrew Morton <akpm@osdl.org> said: > > > > Andrew> Peter Chubb <peter@chubb.wattle.id.au> wrote: > > >> > > >> > > >> In fs/proc/base.c:proc_pid_lookup(), the patch > > >> > > >> read_unlock(&tasklist_lock); if (!task) goto out; + if > > >> (!thread_group_leader(task)) + goto out_drop_task; > > >> > > >> inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); > > >> > > >> means that threads other than the thread group leader don't > > >> appear in the /proc top-level directory. Programs that are > > >> informed via pid of events can no longer find the appropriate > > >> process -- for example, using gdb on a multi-threaded process, or > > >> profiling using perfmon. > > >> > > >> The immediate symptom is GDB saying: Could not open > > >> /proc/757/status when 757 is a TID not a PID. > > > > Andrew> What does `ls /proc/757' say? Presumably no such file or > > Andrew> directory? It's fairly bizare behaviour to be able to open > > Andrew> files which don't exist according to readdir, which is why > > Andrew> we made that change. > > > > Excuse, but this seems seriously FOOBAR. I understand that it's > > interesting to see the thread-leader/thread relationship, but surely > > that's no reason to break backwards compatibility and the ability to > > look up _any_ task's info via /proc/PID/. > > Well you can't look them up - you can only open them. But I take your > point. In another life, these things would appear under a special > /proc/magical_directory_which_has_dopey_semantics. > > > A program that only wants > > to show "processes" (thread-group leaders) can simply read > > /proc/PID/status and ignore the entries for which Tgid != PPid. > > > > Perhaps you could put relative symlinks in task/? Something like > > this: > > > > $ ls -l /proc/self/task > > dr-xr-xr-x 3 davidm users 0 Feb 26 11:37 13494 -> .. > > dr-xr-xr-x 3 davidm users 0 Feb 26 11:37 13495 -> ../../13495 > > > > perhaps? > > Well the contents of /proc/pid/task are OK at present. > > I guess we should revert that change. Ah, so there was some fundamental reason behind that behaviour! Perhaps then a comment or two in the code to explain that such behaviour (prior to change) is intended in proc_pid_lookup()? That way it will be clear that is intended behaviour. Am I correct to assume though that the corresponding change in proc_task_lookup() should stay? The existing behaviour there was that one could do say, cat /proc/<pid>/task/<tid>/stat, where tid could be any thread and not a part of the thread group pid. The patch that broke backwards compatibility for GDB likewise changed that. It enforces that tid must be a part of the pid thread group. -- Kingsley ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: /proc visibility patch breaks GDB, etc. 2004-02-26 21:59 ` Kingsley Cheung @ 2004-02-26 22:14 ` Peter Chubb 2004-02-26 23:19 ` Andrew Morton 1 sibling, 0 replies; 11+ messages in thread From: Peter Chubb @ 2004-02-26 22:14 UTC (permalink / raw) To: Kingsley Cheung Cc: Andrew Morton, davidm, davidm, peter, linux-kernel, Daniel Jacobowitz >>>>> "Kingsley" == Kingsley Cheung <kingsley@aurema.com> writes: Kingsley> On Thu, Feb 26, 2004 at 12:09:59PM -0800, Andrew Morton Kingsley> wrote: Kingsley> The patch that broke backwards compatibility for GDB Kingsley> likewise changed that. It enforces that tid must be a part Kingsley> of the pid thread group. For what it's worth, the patch also breaks JVM 1.4re2. Peter C ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: /proc visibility patch breaks GDB, etc. 2004-02-26 21:59 ` Kingsley Cheung 2004-02-26 22:14 ` Peter Chubb @ 2004-02-26 23:19 ` Andrew Morton 2004-02-26 23:29 ` Kingsley Cheung 2004-02-26 23:48 ` Peter Chubb 1 sibling, 2 replies; 11+ messages in thread From: Andrew Morton @ 2004-02-26 23:19 UTC (permalink / raw) To: Kingsley Cheung; +Cc: davidm, peter, linux-kernel, dan Kingsley Cheung <kingsley@aurema.com> wrote: > > Am I correct to assume though that the corresponding change in > proc_task_lookup() should stay? The existing behaviour there was that > one could do say, > > cat /proc/<pid>/task/<tid>/stat, where tid could be any thread and not > a part of the thread group pid. That sounds especially broken - let's hope that nobody has started using it (but how did you even discover this? Code audit?) How's this? diff -puN fs/proc/base.c~proc-thread-visibility-revert fs/proc/base.c --- 25/fs/proc/base.c~proc-thread-visibility-revert Thu Feb 26 15:17:48 2004 +++ 25-akpm/fs/proc/base.c Thu Feb 26 15:17:48 2004 @@ -1582,13 +1582,14 @@ struct dentry *proc_pid_lookup(struct in read_unlock(&tasklist_lock); if (!task) goto out; - if (!thread_group_leader(task)) - goto out_drop_task; inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); - if (!inode) - goto out_drop_task; + + if (!inode) { + put_task_struct(task); + goto out; + } inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; inode->i_op = &proc_tgid_base_inode_operations; inode->i_fop = &proc_tgid_base_operations; @@ -1613,8 +1614,6 @@ struct dentry *proc_pid_lookup(struct in goto out; } return NULL; -out_drop_task: - put_task_struct(task); out: return ERR_PTR(-ENOENT); } _ ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: /proc visibility patch breaks GDB, etc. 2004-02-26 23:19 ` Andrew Morton @ 2004-02-26 23:29 ` Kingsley Cheung 2004-02-26 23:48 ` Peter Chubb 1 sibling, 0 replies; 11+ messages in thread From: Kingsley Cheung @ 2004-02-26 23:29 UTC (permalink / raw) To: Andrew Morton; +Cc: davidm, peter, linux-kernel, dan On Thu, Feb 26, 2004 at 03:19:17PM -0800, Andrew Morton wrote: > Kingsley Cheung <kingsley@aurema.com> wrote: > > > > Am I correct to assume though that the corresponding change in > > proc_task_lookup() should stay? The existing behaviour there was that > > one could do say, > > > > cat /proc/<pid>/task/<tid>/stat, where tid could be any thread and not > > a part of the thread group pid. > > That sounds especially broken - let's hope that nobody has started using it > (but how did you even discover this? Code audit?) Completely an accident on my part. While writing code to traverse threads in a group and obtain their data usage, I was comparing what I could see from the output with the shell and I just happened to do a typo on the tid value... To my suprise it worked. > > How's this? Looks like proc_pid_lookup() was never changed at all :) > > diff -puN fs/proc/base.c~proc-thread-visibility-revert fs/proc/base.c > --- 25/fs/proc/base.c~proc-thread-visibility-revert Thu Feb 26 15:17:48 2004 > +++ 25-akpm/fs/proc/base.c Thu Feb 26 15:17:48 2004 > @@ -1582,13 +1582,14 @@ struct dentry *proc_pid_lookup(struct in > read_unlock(&tasklist_lock); > if (!task) > goto out; > - if (!thread_group_leader(task)) > - goto out_drop_task; > > inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); > > - if (!inode) > - goto out_drop_task; > + > + if (!inode) { > + put_task_struct(task); > + goto out; > + } > inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; > inode->i_op = &proc_tgid_base_inode_operations; > inode->i_fop = &proc_tgid_base_operations; > @@ -1613,8 +1614,6 @@ struct dentry *proc_pid_lookup(struct in > goto out; > } > return NULL; > -out_drop_task: > - put_task_struct(task); > out: > return ERR_PTR(-ENOENT); > } > > _ -- Kingsley ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: /proc visibility patch breaks GDB, etc. 2004-02-26 23:19 ` Andrew Morton 2004-02-26 23:29 ` Kingsley Cheung @ 2004-02-26 23:48 ` Peter Chubb 1 sibling, 0 replies; 11+ messages in thread From: Peter Chubb @ 2004-02-26 23:48 UTC (permalink / raw) To: Andrew Morton; +Cc: Kingsley Cheung, davidm, peter, linux-kernel, dan >>>>> "Andrew" == Andrew Morton <akpm@osdl.org> writes: Andrew> Kingsley Cheung <kingsley@aurema.com> wrote: >> Am I correct to assume though that the corresponding change in >> proc_task_lookup() should stay? The existing behaviour there was >> that one could do say, >> >> cat /proc/<pid>/task/<tid>/stat, where tid could be any thread and >> not a part of the thread group pid. Andrew> That sounds especially broken - let's hope that nobody has Andrew> started using it (but how did you even discover this? Code Andrew> audit?) Andrew> How's this? Looks fine to me --- should fix my immediate problems. But maybe we *want* (in 2.7?) to deprecate /proc/tid where tid is a thread ID not a process ID. -- Dr Peter Chubb http://www.gelato.unsw.edu.au peterc AT gelato.unsw.edu.au The technical we do immediately, the political takes *forever* ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: /proc visibility patch breaks GDB, etc. 2004-02-26 19:39 ` David Mosberger 2004-02-26 20:09 ` Andrew Morton @ 2004-02-26 20:10 ` Peter Chubb 1 sibling, 0 replies; 11+ messages in thread From: Peter Chubb @ 2004-02-26 20:10 UTC (permalink / raw) To: davidm; +Cc: Andrew Morton, Peter Chubb, kingsley, linux-kernel >>>>> "David" == David Mosberger <davidm@napali.hpl.hp.com> writes: >>>>> On Wed, 25 Feb 2004 22:44:10 -0800, Andrew Morton <akpm@osdl.org> said: Andrew> Peter Chubb <peter@chubb.wattle.id.au> wrote: >> >> The immediate symptom is GDB saying: Could not open >> /proc/757/status when 757 is a TID not a PID. Andrew> What does `ls /proc/757' say? Presumably no such file or Andrew> directory? It's fairly bizare behaviour to be able to open Andrew> files which don't exist according to readdir, which is why Andrew> we made that change. David> Excuse, but this seems seriously FOOBAR. I understand that David> it's interesting to see the thread-leader/thread relationship, David> but surely that's no reason to break backwards compatibility David> and the ability to look up _any_ task's info via /proc/PID/. A David> program that only wants to show "processes" (thread-group David> leaders) can simply read /proc/PID/status and ignore the David> entries for which Tgid != PPid. Think of scanning /proc on a large SMP machine (e.g., Altix with >512 processors) running lots and lots of multithreaded processes to find all processes --- like ps(1) does --- and you can see why not cluttering up /proc with threads is a good idea. -- Dr Peter Chubb http://www.gelato.unsw.edu.au peterc AT gelato.unsw.edu.au The technical we do immediately, the political takes *forever* ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2004-02-26 23:51 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2004-02-26 6:27 /proc visibility patch breaks GDB, etc Peter Chubb 2004-02-26 6:44 ` Andrew Morton 2004-02-26 16:02 ` Daniel Jacobowitz 2004-02-26 19:39 ` David Mosberger 2004-02-26 20:09 ` Andrew Morton 2004-02-26 21:59 ` Kingsley Cheung 2004-02-26 22:14 ` Peter Chubb 2004-02-26 23:19 ` Andrew Morton 2004-02-26 23:29 ` Kingsley Cheung 2004-02-26 23:48 ` Peter Chubb 2004-02-26 20:10 ` Peter Chubb
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox