diff options
author | Hans Petter Selasky <hselasky@FreeBSD.org> | 2017-04-06 10:26:03 +0000 |
---|---|---|
committer | Hans Petter Selasky <hselasky@FreeBSD.org> | 2017-04-06 10:26:03 +0000 |
commit | 8402f058ad4e5ae6176dd7e8c87d3700fa3f1653 (patch) | |
tree | 24b80e99f0569e872e620c5e837950e19a072138 /sys/compat/linuxkpi/common/src/linux_current.c | |
parent | 1ea4c85781e9404e78b9444f27cf4f8ed3915649 (diff) | |
download | src-8402f058ad4e5ae6176dd7e8c87d3700fa3f1653.tar.gz src-8402f058ad4e5ae6176dd7e8c87d3700fa3f1653.zip |
Fix implementation of task_pid_group_leader() in the LinuxKPI.
In FreeBSD thread IDs and procedure IDs have distinct number
spaces. When asking for the group leader task ID in the LinuxKPI,
return the procedure ID and let this resolve to the first task in the
procedure having a valid LinuxKPI task structure pointer.
MFC after: 1 week
Sponsored by: Mellanox Technologies
Notes
Notes:
svn path=/head/; revision=316563
Diffstat (limited to 'sys/compat/linuxkpi/common/src/linux_current.c')
-rw-r--r-- | sys/compat/linuxkpi/common/src/linux_current.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/sys/compat/linuxkpi/common/src/linux_current.c b/sys/compat/linuxkpi/common/src/linux_current.c index fb33aed92846..ca0fb0c4f327 100644 --- a/sys/compat/linuxkpi/common/src/linux_current.c +++ b/sys/compat/linuxkpi/common/src/linux_current.c @@ -158,13 +158,28 @@ struct task_struct * linux_pid_task(pid_t pid) { struct thread *td; + struct proc *p; + /* try to find corresponding thread */ td = tdfind(pid, -1); if (td != NULL) { struct task_struct *ts = td->td_lkpi_task; PROC_UNLOCK(td->td_proc); return (ts); } + + /* try to find corresponding procedure */ + p = pfind(pid); + if (p != NULL) { + FOREACH_THREAD_IN_PROC(p, td) { + struct task_struct *ts = td->td_lkpi_task; + if (ts != NULL) { + PROC_UNLOCK(p); + return (ts); + } + } + PROC_UNLOCK(p); + } return (NULL); } @@ -172,7 +187,9 @@ struct task_struct * linux_get_pid_task(pid_t pid) { struct thread *td; + struct proc *p; + /* try to find corresponding thread */ td = tdfind(pid, -1); if (td != NULL) { struct task_struct *ts = td->td_lkpi_task; @@ -181,6 +198,20 @@ linux_get_pid_task(pid_t pid) PROC_UNLOCK(td->td_proc); return (ts); } + + /* try to find corresponding procedure */ + p = pfind(pid); + if (p != NULL) { + FOREACH_THREAD_IN_PROC(p, td) { + struct task_struct *ts = td->td_lkpi_task; + if (ts != NULL) { + get_task_struct(ts); + PROC_UNLOCK(p); + return (ts); + } + } + PROC_UNLOCK(p); + } return (NULL); } |