svn commit: r337376 - in head/sys/compat/linuxkpi/common: include/linux src
Hans Petter Selasky
hselasky at FreeBSD.org
Mon Aug 6 10:48:22 UTC 2018
Author: hselasky
Date: Mon Aug 6 10:48:20 2018
New Revision: 337376
URL: https://svnweb.freebsd.org/changeset/base/337376
Log:
Implement current_work() function in the LinuxKPI.
Tested by: Johannes Lundberg <johalun0 at gmail.com>
MFC after: 1 week
Sponsored by: Mellanox Technologies
Modified:
head/sys/compat/linuxkpi/common/include/linux/sched.h
head/sys/compat/linuxkpi/common/include/linux/workqueue.h
head/sys/compat/linuxkpi/common/src/linux_work.c
Modified: head/sys/compat/linuxkpi/common/include/linux/sched.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/sched.h Mon Aug 6 09:22:07 2018 (r337375)
+++ head/sys/compat/linuxkpi/common/include/linux/sched.h Mon Aug 6 10:48:20 2018 (r337376)
@@ -60,6 +60,7 @@
#define TASK_COMM_LEN (MAXCOMLEN + 1)
+struct work_struct;
struct task_struct {
struct thread *task_thread;
struct mm_struct *mm;
@@ -78,6 +79,7 @@ struct task_struct {
TAILQ_ENTRY(task_struct) rcu_entry;
int rcu_recurse;
int bsd_interrupt_value;
+ struct work_struct *work; /* current work struct, if set */
};
#define current ({ \
Modified: head/sys/compat/linuxkpi/common/include/linux/workqueue.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/workqueue.h Mon Aug 6 09:22:07 2018 (r337375)
+++ head/sys/compat/linuxkpi/common/include/linux/workqueue.h Mon Aug 6 10:48:20 2018 (r337376)
@@ -209,6 +209,9 @@ do { \
#define destroy_workqueue(wq) \
linux_destroy_workqueue(wq)
+#define current_work() \
+ linux_current_work()
+
/* prototypes */
extern struct workqueue_struct *system_wq;
@@ -232,5 +235,6 @@ extern bool linux_flush_work(struct work_struct *);
extern bool linux_flush_delayed_work(struct delayed_work *);
extern bool linux_work_pending(struct work_struct *);
extern bool linux_work_busy(struct work_struct *);
+extern struct work_struct *linux_current_work(void);
#endif /* _LINUX_WORKQUEUE_H_ */
Modified: head/sys/compat/linuxkpi/common/src/linux_work.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_work.c Mon Aug 6 09:22:07 2018 (r337375)
+++ head/sys/compat/linuxkpi/common/src/linux_work.c Mon Aug 6 10:48:20 2018 (r337376)
@@ -220,8 +220,9 @@ linux_work_fn(void *context, int pending)
struct work_struct *work;
struct workqueue_struct *wq;
struct work_exec exec;
+ struct task_struct *task;
- linux_set_current(curthread);
+ task = current;
/* setup local variables */
work = context;
@@ -240,9 +241,15 @@ linux_work_fn(void *context, int pending)
case WORK_ST_CANCEL:
WQ_EXEC_UNLOCK(wq);
+ /* set current work structure */
+ task->work = work;
+
/* call work function */
work->func(work);
+ /* set current work structure */
+ task->work = NULL;
+
WQ_EXEC_LOCK(wq);
/* check if unblocked */
if (exec.target != work) {
@@ -577,6 +584,12 @@ linux_init_delayed_work(struct delayed_work *dwork, wo
mtx_init(&dwork->timer.mtx, spin_lock_name("lkpi-dwork"), NULL,
MTX_DEF | MTX_NOWITNESS);
callout_init_mtx(&dwork->timer.callout, &dwork->timer.mtx, 0);
+}
+
+struct work_struct *
+linux_current_work(void)
+{
+ return (current->work);
}
static void
More information about the svn-src-head
mailing list