Implement current_work() function in the LinuxKPI.

Tested by:	Johannes Lundberg <johalun0@gmail.com>
MFC after:	1 week
Sponsored by:	Mellanox Technologies
This commit is contained in:
Hans Petter Selasky 2018-08-06 10:48:20 +00:00
parent 936b2b64ae
commit 549dcdb34e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=337376
3 changed files with 20 additions and 1 deletions

View File

@ -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 ({ \

View File

@ -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_ */

View File

@ -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) {
@ -579,6 +586,12 @@ linux_init_delayed_work(struct delayed_work *dwork, work_func_t func)
callout_init_mtx(&dwork->timer.callout, &dwork->timer.mtx, 0);
}
struct work_struct *
linux_current_work(void)
{
return (current->work);
}
static void
linux_work_init(void *arg)
{