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.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/sys/compat/linuxkpi/common/src/linux_current.c b/sys/compat/linuxkpi/common/src/linux_current.c
index 01ddc0e5dcc9..19f9e47c9758 100644
--- a/sys/compat/linuxkpi/common/src/linux_current.c
+++ b/sys/compat/linuxkpi/common/src/linux_current.c
@@ -62,6 +62,7 @@ linux_alloc_current(struct thread *td, int flags)
ts->comm = td->td_name;
ts->pid = td->td_tid;
ts->mm = mm;
+ atomic_set(&ts->usage, 1);
ts->state = TASK_RUNNING;
/* setup mm_struct */
@@ -113,7 +114,37 @@ linuxkpi_thread_dtor(void *arg __unused, struct thread *td)
return;
td->td_lkpi_task = NULL;
- linux_free_current(ts);
+ put_task_struct(ts);
+}
+
+struct task_struct *
+linux_pid_task(pid_t pid)
+{
+ struct thread *td;
+
+ td = tdfind(pid, -1);
+ if (td != NULL) {
+ struct task_struct *ts = td->td_lkpi_task;
+ PROC_UNLOCK(td->td_proc);
+ return (ts);
+ }
+ return (NULL);
+}
+
+struct task_struct *
+linux_get_pid_task(pid_t pid)
+{
+ struct thread *td;
+
+ td = tdfind(pid, -1);
+ if (td != NULL) {
+ struct task_struct *ts = td->td_lkpi_task;
+ if (ts != NULL)
+ get_task_struct(ts);
+ PROC_UNLOCK(td->td_proc);
+ return (ts);
+ }
+ return (NULL);
}
static void