Commit | Line | Data |
---|---|---|
a9da8ab2 JA |
1 | #ifndef FIO_RATE_H |
2 | #define FIO_RATE_H | |
3 | ||
4 | #include "flist.h" | |
5 | ||
88271841 JA |
6 | struct workqueue_work { |
7 | struct flist_head list; | |
8 | }; | |
9 | ||
ee2b6d6e JA |
10 | struct submit_worker { |
11 | pthread_t thread; | |
12 | pthread_mutex_t lock; | |
13 | pthread_cond_t cond; | |
14 | struct flist_head work_list; | |
15 | unsigned int flags; | |
16 | unsigned int index; | |
17 | uint64_t seq; | |
18 | struct workqueue *wq; | |
19 | void *private; | |
20 | }; | |
21 | ||
22 | typedef void (workqueue_work_fn)(struct submit_worker *, struct workqueue_work *); | |
23 | typedef bool (workqueue_pre_sleep_flush_fn)(struct submit_worker *); | |
24 | typedef void (workqueue_pre_sleep_fn)(struct submit_worker *); | |
25 | typedef int (workqueue_alloc_worker_fn)(struct submit_worker *); | |
26 | typedef void (workqueue_free_worker_fn)(struct submit_worker *); | |
80ea26a8 | 27 | typedef int (workqueue_init_worker_fn)(struct submit_worker *); |
df8472e1 | 28 | typedef void (workqueue_exit_worker_fn)(struct submit_worker *); |
5bb79f69 JA |
29 | |
30 | struct workqueue_ops { | |
31 | workqueue_work_fn *fn; | |
32 | workqueue_pre_sleep_flush_fn *pre_sleep_flush_fn; | |
33 | workqueue_pre_sleep_fn *pre_sleep_fn; | |
df8472e1 | 34 | |
ee2b6d6e JA |
35 | workqueue_alloc_worker_fn *alloc_worker_fn; |
36 | workqueue_free_worker_fn *free_worker_fn; | |
df8472e1 | 37 | |
80ea26a8 | 38 | workqueue_init_worker_fn *init_worker_fn; |
df8472e1 | 39 | workqueue_exit_worker_fn *exit_worker_fn; |
5bb79f69 | 40 | }; |
a9da8ab2 JA |
41 | |
42 | struct workqueue { | |
43 | unsigned int max_workers; | |
44 | ||
45 | struct thread_data *td; | |
5bb79f69 | 46 | struct workqueue_ops ops; |
a9da8ab2 JA |
47 | |
48 | uint64_t work_seq; | |
49 | struct submit_worker *workers; | |
50 | unsigned int next_free_worker; | |
51 | ||
52 | pthread_cond_t flush_cond; | |
53 | pthread_mutex_t flush_lock; | |
2a274336 | 54 | pthread_mutex_t stat_lock; |
a9da8ab2 JA |
55 | volatile int wake_idle; |
56 | }; | |
57 | ||
5bb79f69 | 58 | int workqueue_init(struct thread_data *td, struct workqueue *wq, struct workqueue_ops *ops, unsigned int max_workers); |
a9da8ab2 JA |
59 | void workqueue_exit(struct workqueue *wq); |
60 | ||
88271841 | 61 | bool workqueue_enqueue(struct workqueue *wq, struct workqueue_work *work); |
a9da8ab2 JA |
62 | void workqueue_flush(struct workqueue *wq); |
63 | ||
ee2b6d6e | 64 | static inline bool workqueue_pre_sleep_check(struct submit_worker *sw) |
5bb79f69 | 65 | { |
ee2b6d6e JA |
66 | struct workqueue *wq = sw->wq; |
67 | ||
5bb79f69 JA |
68 | if (!wq->ops.pre_sleep_flush_fn) |
69 | return false; | |
70 | ||
ee2b6d6e | 71 | return wq->ops.pre_sleep_flush_fn(sw); |
5bb79f69 JA |
72 | } |
73 | ||
ee2b6d6e | 74 | static inline void workqueue_pre_sleep(struct submit_worker *sw) |
5bb79f69 | 75 | { |
ee2b6d6e JA |
76 | struct workqueue *wq = sw->wq; |
77 | ||
5bb79f69 | 78 | if (wq->ops.pre_sleep_fn) |
ee2b6d6e | 79 | wq->ops.pre_sleep_fn(sw); |
5bb79f69 JA |
80 | } |
81 | ||
80ea26a8 JA |
82 | static inline int workqueue_init_worker(struct submit_worker *sw) |
83 | { | |
84 | struct workqueue *wq = sw->wq; | |
85 | ||
86 | if (!wq->ops.init_worker_fn) | |
87 | return 0; | |
88 | ||
89 | return wq->ops.init_worker_fn(sw); | |
90 | } | |
91 | ||
df8472e1 JA |
92 | static inline void workqueue_exit_worker(struct submit_worker *sw) |
93 | { | |
94 | struct workqueue *wq = sw->wq; | |
95 | ||
96 | if (!wq->ops.exit_worker_fn) | |
97 | return; | |
98 | ||
99 | wq->ops.exit_worker_fn(sw); | |
100 | } | |
a9da8ab2 | 101 | #endif |