aboutsummaryrefslogtreecommitdiff
path: root/sys/compat/linuxkpi/common/include
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2016-05-12 09:06:54 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2016-05-12 09:06:54 +0000
commit464d20bcc8f97b24863cb5d1ad1defb30e71260a (patch)
tree4bf5c1d60d177f901efd06667fc94b41ce960f3e /sys/compat/linuxkpi/common/include
parentdc77866517235877c87e2d95c6faa424a3277f48 (diff)
downloadsrc-464d20bcc8f97b24863cb5d1ad1defb30e71260a.tar.gz
src-464d20bcc8f97b24863cb5d1ad1defb30e71260a.zip
Create a dummy "task_struct" on the stack which is returned by
"current" inside all LinuxKPI file operation callbacks. The "current" is frequently used for various debug prints, printing the thread name and thread ID for example. Obtained from: kmacy @ MFC after: 1 week Sponsored by: Mellanox Technologies
Notes
Notes: svn path=/head/; revision=299526
Diffstat (limited to 'sys/compat/linuxkpi/common/include')
-rw-r--r--sys/compat/linuxkpi/common/include/linux/kthread.h11
-rw-r--r--sys/compat/linuxkpi/common/include/linux/sched.h19
2 files changed, 21 insertions, 9 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/kthread.h b/sys/compat/linuxkpi/common/include/linux/kthread.h
index f85a3f40ac55..61cdc3b8060a 100644
--- a/sys/compat/linuxkpi/common/include/linux/kthread.h
+++ b/sys/compat/linuxkpi/common/include/linux/kthread.h
@@ -2,7 +2,7 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2016 Mellanox Technologies, Ltd.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -45,15 +45,18 @@ static inline void
linux_kthread_fn(void *arg)
{
struct task_struct *task;
+ struct thread *td = curthread;
task = arg;
- task_struct_set(curthread, task);
+ task_struct_fill(td, task);
+ task_struct_set(td, task);
if (task->should_stop == 0)
task->task_ret = task->task_fn(task->task_data);
- PROC_LOCK(task->task_thread->td_proc);
+ PROC_LOCK(td->td_proc);
task->should_stop = TASK_STOPPED;
wakeup(task);
- PROC_UNLOCK(task->task_thread->td_proc);
+ PROC_UNLOCK(td->td_proc);
+ task_struct_set(td, NULL);
kthread_exit();
}
diff --git a/sys/compat/linuxkpi/common/include/linux/sched.h b/sys/compat/linuxkpi/common/include/linux/sched.h
index c2d66d7fa6dd..ca1effe88600 100644
--- a/sys/compat/linuxkpi/common/include/linux/sched.h
+++ b/sys/compat/linuxkpi/common/include/linux/sched.h
@@ -2,7 +2,7 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2016 Mellanox Technologies, Ltd.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -50,10 +50,12 @@
#define TASK_STOPPED 2
/*
- * A task_struct is only provided for those tasks created with kthread.
- * Using these routines with threads not started via kthread will cause
- * panics because no task_struct is allocated and td_retval[1] is
- * overwritten by syscalls which kernel threads will not make use of.
+ * A task_struct is only provided for threads created by kthread() and
+ * file operation callbacks.
+ *
+ * Using these routines outside the above mentioned contexts will
+ * cause panics because no task_struct is assigned and td_retval[1] is
+ * overwritten by syscalls.
*/
struct task_struct {
struct thread *task_thread;
@@ -62,10 +64,17 @@ struct task_struct {
int task_ret;
int state;
int should_stop;
+ pid_t pid;
+ const char *comm;
};
#define current task_struct_get(curthread)
#define task_struct_get(x) ((struct task_struct *)(uintptr_t)(x)->td_retval[1])
+#define task_struct_fill(x, y) do { \
+ (y)->task_thread = (x); \
+ (y)->comm = (x)->td_name; \
+ (y)->pid = (x)->td_tid; \
+} while (0)
#define task_struct_set(x, y) (x)->td_retval[1] = (uintptr_t)(y)
/* ensure the task_struct pointer fits into the td_retval[1] field */