pid: add pidfd_get_task() helper
The number of system calls making use of pidfds is constantly increasing. Some of those new system calls duplicate the code to turn a pidfd into task_struct it refers to. Give them a simple helper for this. Link: https://lore.kernel.org/r/20211004125050.1153693-2-christian.brauner@ubuntu.com Link: https://lore.kernel.org/r/20211011133245.1703103-2-brauner@kernel.org Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Matthew Bobrowski <repnop@google.com> Cc: Alexander Duyck <alexander.h.duyck@linux.intel.com> Cc: David Hildenbrand <david@redhat.com> Cc: Jan Kara <jack@suse.cz> Cc: Minchan Kim <minchan@kernel.org> Reviewed-by: Matthew Bobrowski <repnop@google.com> Acked-by: David Hildenbrand <david@redhat.com> Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
parent
64570fbc14
commit
e9bdcdbf69
2 changed files with 37 additions and 0 deletions
|
@ -78,6 +78,7 @@ struct file;
|
||||||
|
|
||||||
extern struct pid *pidfd_pid(const struct file *file);
|
extern struct pid *pidfd_pid(const struct file *file);
|
||||||
struct pid *pidfd_get_pid(unsigned int fd, unsigned int *flags);
|
struct pid *pidfd_get_pid(unsigned int fd, unsigned int *flags);
|
||||||
|
struct task_struct *pidfd_get_task(int pidfd, unsigned int *flags);
|
||||||
int pidfd_create(struct pid *pid, unsigned int flags);
|
int pidfd_create(struct pid *pid, unsigned int flags);
|
||||||
|
|
||||||
static inline struct pid *get_pid(struct pid *pid)
|
static inline struct pid *get_pid(struct pid *pid)
|
||||||
|
|
36
kernel/pid.c
36
kernel/pid.c
|
@ -539,6 +539,42 @@ struct pid *pidfd_get_pid(unsigned int fd, unsigned int *flags)
|
||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pidfd_get_task() - Get the task associated with a pidfd
|
||||||
|
*
|
||||||
|
* @pidfd: pidfd for which to get the task
|
||||||
|
* @flags: flags associated with this pidfd
|
||||||
|
*
|
||||||
|
* Return the task associated with @pidfd. The function takes a reference on
|
||||||
|
* the returned task. The caller is responsible for releasing that reference.
|
||||||
|
*
|
||||||
|
* Currently, the process identified by @pidfd is always a thread-group leader.
|
||||||
|
* This restriction currently exists for all aspects of pidfds including pidfd
|
||||||
|
* creation (CLONE_PIDFD cannot be used with CLONE_THREAD) and pidfd polling
|
||||||
|
* (only supports thread group leaders).
|
||||||
|
*
|
||||||
|
* Return: On success, the task_struct associated with the pidfd.
|
||||||
|
* On error, a negative errno number will be returned.
|
||||||
|
*/
|
||||||
|
struct task_struct *pidfd_get_task(int pidfd, unsigned int *flags)
|
||||||
|
{
|
||||||
|
unsigned int f_flags;
|
||||||
|
struct pid *pid;
|
||||||
|
struct task_struct *task;
|
||||||
|
|
||||||
|
pid = pidfd_get_pid(pidfd, &f_flags);
|
||||||
|
if (IS_ERR(pid))
|
||||||
|
return ERR_CAST(pid);
|
||||||
|
|
||||||
|
task = get_pid_task(pid, PIDTYPE_TGID);
|
||||||
|
put_pid(pid);
|
||||||
|
if (!task)
|
||||||
|
return ERR_PTR(-ESRCH);
|
||||||
|
|
||||||
|
*flags = f_flags;
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pidfd_create() - Create a new pid file descriptor.
|
* pidfd_create() - Create a new pid file descriptor.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue