aboutsummaryrefslogtreecommitdiff
path: root/sys/ofed/include/linux/workqueue.h
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2014-10-30 15:41:25 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2014-10-30 15:41:25 +0000
commitf5b416b52dfc022f915ae19d84241c8aa58c4f93 (patch)
treef057614bd45d6a34e50a994327f9c54b89655553 /sys/ofed/include/linux/workqueue.h
parentf3ed73a52cb6b2229270f75178af6a86b78624df (diff)
Notes
Diffstat (limited to 'sys/ofed/include/linux/workqueue.h')
-rw-r--r--sys/ofed/include/linux/workqueue.h42
1 files changed, 36 insertions, 6 deletions
diff --git a/sys/ofed/include/linux/workqueue.h b/sys/ofed/include/linux/workqueue.h
index ce5759bf01a6..38cd2feddb60 100644
--- a/sys/ofed/include/linux/workqueue.h
+++ b/sys/ofed/include/linux/workqueue.h
@@ -2,6 +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.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -80,7 +81,7 @@ do { \
callout_init(&(_work)->timer, CALLOUT_MPSAFE); \
} while (0)
-#define INIT_DELAYED_WORK_DEFERRABLE INIT_DELAYED_WORK
+#define INIT_DEFERRABLE_WORK INIT_DELAYED_WORK
#define schedule_work(work) \
do { \
@@ -90,11 +91,12 @@ do { \
#define flush_scheduled_work() flush_taskqueue(taskqueue_thread)
-#define queue_work(q, work) \
-do { \
- (work)->taskqueue = (q)->taskqueue; \
- taskqueue_enqueue((q)->taskqueue, &(work)->work_task); \
-} while (0)
+static inline int queue_work (struct workqueue_struct *q, struct work_struct *work)
+{
+ (work)->taskqueue = (q)->taskqueue;
+ /* Return opposite val to align with Linux logic */
+ return !taskqueue_enqueue((q)->taskqueue, &(work)->work_task);
+}
static inline void
_delayed_work_fn(void *arg)
@@ -121,6 +123,14 @@ queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work,
return (!pending);
}
+static inline bool schedule_delayed_work(struct delayed_work *dwork,
+ unsigned long delay)
+{
+ struct workqueue_struct wq;
+ wq.taskqueue = taskqueue_thread;
+ return queue_delayed_work(&wq, dwork, delay);
+}
+
static inline struct workqueue_struct *
_create_workqueue_common(char *name, int cpus)
{
@@ -190,4 +200,24 @@ cancel_delayed_work(struct delayed_work *work)
return 0;
}
+static inline int
+cancel_delayed_work_sync(struct delayed_work *work)
+{
+
+ callout_drain(&work->timer);
+ if (work->work.taskqueue &&
+ taskqueue_cancel(work->work.taskqueue, &work->work.work_task, NULL))
+ taskqueue_drain(work->work.taskqueue, &work->work.work_task);
+ return 0;
+}
+
+static inline bool
+mod_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork,
+ unsigned long delay)
+{
+ cancel_delayed_work(dwork);
+ queue_delayed_work(wq, dwork, delay);
+ return false;
+}
+
#endif /* _LINUX_WORKQUEUE_H_ */