svn commit: r337897 - in stable/11/sys/compat/linuxkpi/common: include/linux src
Hans Petter Selasky
hselasky at FreeBSD.org
Thu Aug 16 08:11:19 UTC 2018
Author: hselasky
Date: Thu Aug 16 08:11:17 2018
New Revision: 337897
URL: https://svnweb.freebsd.org/changeset/base/337897
Log:
MFC r337376:
Implement current_work() function in the LinuxKPI.
Tested by: Johannes Lundberg <johalun0 at gmail.com>
Sponsored by: Mellanox Technologies
Modified:
stable/11/sys/compat/linuxkpi/common/include/linux/sched.h
stable/11/sys/compat/linuxkpi/common/include/linux/workqueue.h
stable/11/sys/compat/linuxkpi/common/src/linux_work.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/compat/linuxkpi/common/include/linux/sched.h
==============================================================================
--- stable/11/sys/compat/linuxkpi/common/include/linux/sched.h Thu Aug 16 08:10:11 2018 (r337896)
+++ stable/11/sys/compat/linuxkpi/common/include/linux/sched.h Thu Aug 16 08:11:17 2018 (r337897)
@@ -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: stable/11/sys/compat/linuxkpi/common/include/linux/workqueue.h
==============================================================================
--- stable/11/sys/compat/linuxkpi/common/include/linux/workqueue.h Thu Aug 16 08:10:11 2018 (r337896)
+++ stable/11/sys/compat/linuxkpi/common/include/linux/workqueue.h Thu Aug 16 08:11:17 2018 (r337897)
@@ -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: stable/11/sys/compat/linuxkpi/common/src/linux_work.c
==============================================================================
--- stable/11/sys/compat/linuxkpi/common/src/linux_work.c Thu Aug 16 08:10:11 2018 (r337896)
+++ stable/11/sys/compat/linuxkpi/common/src/linux_work.c Thu Aug 16 08:11:17 2018 (r337897)
@@ -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-all
mailing list