mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
pidfd: add PIDFD_SELF* sentinels to refer to own thread/process
It is useful to be able to utilise the pidfd mechanism to reference the current thread or process (from a userland point of view - thread group leader from the kernel's point of view). Therefore introduce PIDFD_SELF_THREAD to refer to the current thread, and PIDFD_SELF_THREAD_GROUP to refer to the current thread group leader. For convenience and to avoid confusion from userland's perspective we alias these: * PIDFD_SELF is an alias for PIDFD_SELF_THREAD - This is nearly always what the user will want to use, as they would find it surprising if for instance fd's were unshared()'d and they wanted to invoke pidfd_getfd() and that failed. * PIDFD_SELF_PROCESS is an alias for PIDFD_SELF_THREAD_GROUP - Most users have no concept of thread groups or what a thread group leader is, and from userland's perspective and nomenclature this is what userland considers to be a process. We adjust pidfd_get_task() and the pidfd_send_signal() system call with specific handling for this, implementing this functionality for process_madvise(), process_mrelease() (albeit, using it here wouldn't really make sense) and pidfd_send_signal(). Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Link: https://lore.kernel.org/r/24315a16a3d01a548dd45c7515f7d51c767e954e.1738268370.git.lorenzo.stoakes@oracle.com Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
committed by
Christian Brauner
parent
2014c95afe
commit
f08d0c3a71
24
kernel/pid.c
24
kernel/pid.c
@@ -564,15 +564,29 @@ struct pid *pidfd_get_pid(unsigned int fd, unsigned int *flags)
|
||||
*/
|
||||
struct task_struct *pidfd_get_task(int pidfd, unsigned int *flags)
|
||||
{
|
||||
unsigned int f_flags;
|
||||
unsigned int f_flags = 0;
|
||||
struct pid *pid;
|
||||
struct task_struct *task;
|
||||
enum pid_type type;
|
||||
|
||||
pid = pidfd_get_pid(pidfd, &f_flags);
|
||||
if (IS_ERR(pid))
|
||||
return ERR_CAST(pid);
|
||||
switch (pidfd) {
|
||||
case PIDFD_SELF_THREAD:
|
||||
type = PIDTYPE_PID;
|
||||
pid = get_task_pid(current, type);
|
||||
break;
|
||||
case PIDFD_SELF_THREAD_GROUP:
|
||||
type = PIDTYPE_TGID;
|
||||
pid = get_task_pid(current, type);
|
||||
break;
|
||||
default:
|
||||
pid = pidfd_get_pid(pidfd, &f_flags);
|
||||
if (IS_ERR(pid))
|
||||
return ERR_CAST(pid);
|
||||
type = PIDTYPE_TGID;
|
||||
break;
|
||||
}
|
||||
|
||||
task = get_pid_task(pid, PIDTYPE_TGID);
|
||||
task = get_pid_task(pid, type);
|
||||
put_pid(pid);
|
||||
if (!task)
|
||||
return ERR_PTR(-ESRCH);
|
||||
|
||||
Reference in New Issue
Block a user