aboutsummaryrefslogtreecommitdiff
path: root/sys/compat/linuxkpi/common/src/linux_current.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/compat/linuxkpi/common/src/linux_current.c')
-rw-r--r--sys/compat/linuxkpi/common/src/linux_current.c31
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);
}