aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2017-04-06 10:26:03 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2017-04-06 10:26:03 +0000
commit8402f058ad4e5ae6176dd7e8c87d3700fa3f1653 (patch)
tree24b80e99f0569e872e620c5e837950e19a072138
parent1ea4c85781e9404e78b9444f27cf4f8ed3915649 (diff)
downloadsrc-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
-rw-r--r--sys/compat/linuxkpi/common/include/linux/sched.h3
-rw-r--r--sys/compat/linuxkpi/common/src/linux_current.c31
2 files changed, 32 insertions, 2 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/sched.h b/sys/compat/linuxkpi/common/include/linux/sched.h
index 4439fc00c092..677e18e3ff5d 100644
--- a/sys/compat/linuxkpi/common/include/linux/sched.h
+++ b/sys/compat/linuxkpi/common/include/linux/sched.h
@@ -74,8 +74,7 @@ struct task_struct {
#define current ((struct task_struct *)curthread->td_lkpi_task)
-#define task_pid_group_leader(task) \
- FIRST_THREAD_IN_PROC((task)->task_thread->td_proc)->td_tid
+#define task_pid_group_leader(task) (task)->task_thread->td_proc->p_pid
#define task_pid(task) ((task)->pid)
#define task_pid_nr(task) ((task)->pid)
#define get_pid(x) (x)
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);
}