aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);
}