From: Andrew Morton <akpm@linux-foundation.org>
To: john stultz <johnstul@us.ibm.com>
Cc: Andi Kleen <andi@firstfloor.org>,
Arjan van de Ven <arjan@infradead.org>,
lkml <linux-kernel@vger.kernel.org>,
Mike Fulton <fultonm@ca.ibm.com>,
Sean Foley <Sean_Foley@ca.ibm.com>,
Darren Hart <dvhltc@us.ibm.com>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Subject: Re: [PATCH] Allow threads to rename siblings via /proc/pid/tasks/tid/comm
Date: Wed, 18 Nov 2009 13:54:57 -0800 [thread overview]
Message-ID: <20091118135457.6471af1f.akpm@linux-foundation.org> (raw)
In-Reply-To: <1258405867.10576.2.camel@work-vm>
On Mon, 16 Nov 2009 13:11:07 -0800
john stultz <johnstul@us.ibm.com> wrote:
> Setting a thread's comm to be something unique is a very useful ability
> and is helpful for debugging complicated threaded applications. However
> currently the only way to set a thread name is for the thread to name
> itself via the PR_SET_NAME prctl.
>
> However, there may be situations where it would be advantageous for a
> thread dispatcher to be naming the threads its managing, rather then
> having the threads self-describe themselves. This sort of behavior is
> available on other systems via the pthread_setname_np() interface.
>
> This patch exports a task's comm via proc/pid/comm and
> proc/pid/task/tid/comm interfaces, and allows thread siblings to write
> to these values.
>
Would be nice to document the new userspace interface.
Documentation/filesystems/proc.txt, perhaps.
>
> diff --git a/fs/exec.c b/fs/exec.c
> index d49be6b..90003f8 100644
> --- a/fs/exec.c
> +++ b/fs/exec.c
> @@ -926,6 +926,15 @@ char *get_task_comm(char *buf, struct task_struct *tsk)
> void set_task_comm(struct task_struct *tsk, char *buf)
> {
> task_lock(tsk);
> +
> + /*
> + * Threads may access current->comm without holding
> + * the task lock, so write the string carefully.
> + * Readers without a lock may see incomplete new
> + * names but are safe from non-terminating string reads.
> + */
> + memset(tsk->comm, 0, TASK_COMM_LEN);
> + wmb();
OK.
> strlcpy(tsk->comm, buf, sizeof(tsk->comm));
> task_unlock(tsk);
> perf_event_comm(tsk);
> diff --git a/fs/proc/base.c b/fs/proc/base.c
> index 837469a..7f59af1 100644
> --- a/fs/proc/base.c
> +++ b/fs/proc/base.c
> @@ -1265,6 +1265,78 @@ static const struct file_operations proc_pid_sched_operations = {
>
> #endif
>
> +
> +
> +static ssize_t
> +comm_write(struct file *file, const char __user *buf,
> + size_t count, loff_t *offset)
> +{
> + struct inode *inode = file->f_path.dentry->d_inode;
> + struct task_struct *p;
> + char buffer[TASK_COMM_LEN];
> +
> + memset(buffer, 0, sizeof(buffer));
> + if (count > sizeof(buffer) - 1)
> + count = sizeof(buffer) - 1;
Is this the best policy? If userspace tries to apply a too-long name
to a thread, the kernel will silently truncate (ie: corrupt) it? I'd
have thought that returning an error would be more robust?
> + if (copy_from_user(buffer, buf, count))
> + return -EFAULT;
> +
> + p = get_proc_task(inode);
> + if (!p)
> + return -ESRCH;
> +
> + if (same_thread_group(current, p))
> + set_task_comm(p, buffer);
> + else
> + count = -EINVAL;
> +
> + put_task_struct(p);
> +
> + return count;
> +}
Is same_thread_group() sufficient? Are any security/permission-related
checks appropriate here, for example?
The restriction to a separate thread group seems a bit arbitrary,
really. There's no reason I can see why we cannot permit unrelated
(but suitably authorised) processes to do this.
This patch makes task->comm inconsistent with /prod/pid/cmdline. What
are the implications of that for userspace? None, I guess, given that
this can already be done.
> +
> +static int comm_show(struct seq_file *m, void *v)
> +{
> + struct inode *inode = m->private;
> + struct task_struct *p;
> +
> + p = get_proc_task(inode);
> + if (!p)
> + return -ESRCH;
> +
> + task_lock(p);
> + seq_printf(m, "%s\n", p->comm);
> + task_unlock(p);
> +
> + put_task_struct(p);
> +
> + return 0;
> +}
> +
> +static int comm_open(struct inode *inode, struct file *filp)
> +{
> + int ret;
> +
> + ret = single_open(filp, comm_show, NULL);
> + if (!ret) {
> + struct seq_file *m = filp->private_data;
> +
> + m->private = inode;
> + }
> + return ret;
> +}
> +
> +
The patch has a seemingly-random inexplicable mixture of \n and \n\n.
> +static const struct file_operations proc_pid_set_comm_operations = {
> + .open = comm_open,
> + .read = seq_read,
> + .write = comm_write,
> + .llseek = seq_lseek,
> + .release = single_release,
> +};
> +
> +
> /*
> * We added or removed a vma mapping the executable. The vmas are only mapped
> * during exec and are not mapped with the mmap system call.
> @@ -2504,6 +2576,7 @@ static const struct pid_entry tgid_base_stuff[] = {
> #ifdef CONFIG_SCHED_DEBUG
> REG("sched", S_IRUGO|S_IWUSR, proc_pid_sched_operations),
> #endif
> + REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations),
> #ifdef CONFIG_HAVE_ARCH_TRACEHOOK
> INF("syscall", S_IRUSR, proc_pid_syscall),
> #endif
> @@ -2839,6 +2912,7 @@ static const struct pid_entry tid_base_stuff[] = {
> #ifdef CONFIG_SCHED_DEBUG
> REG("sched", S_IRUGO|S_IWUSR, proc_pid_sched_operations),
> #endif
> + REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations),
> #ifdef CONFIG_HAVE_ARCH_TRACEHOOK
> INF("syscall", S_IRUSR, proc_pid_syscall),
> #endif
next prev parent reply other threads:[~2009-11-18 21:55 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-24 1:21 [RFC][PATCH] Add prctl to set sibling thread names (take two) john stultz
2009-10-24 3:45 ` Darren Hart
2009-10-30 19:54 ` john stultz
2009-10-30 20:06 ` [RFC][PATCH] Allow threads to rename siblings via /proc/pid/tasks/tid/comm john stultz
2009-11-07 1:38 ` [PATCH] " john stultz
2009-11-07 22:52 ` Andi Kleen
2009-11-08 20:45 ` Arjan van de Ven
2009-11-10 1:26 ` john stultz
2009-11-16 21:11 ` john stultz
2009-11-18 21:54 ` Andrew Morton [this message]
2009-11-19 1:04 ` KOSAKI Motohiro
2009-11-21 0:33 ` john stultz
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=20091118135457.6471af1f.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=Sean_Foley@ca.ibm.com \
--cc=andi@firstfloor.org \
--cc=arjan@infradead.org \
--cc=dvhltc@us.ibm.com \
--cc=fultonm@ca.ibm.com \
--cc=johnstul@us.ibm.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
/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.