/*
- * Rated submission helpers
+ * Generic workqueue offload mechanism
*
* Copyright (C) 2015 Jens Axboe <axboe@kernel.dk>
*
#include "fio.h"
#include "flist.h"
#include "workqueue.h"
-#include "lib/getrusage.h"
enum {
SW_F_IDLE = 1 << 0,
/*
* Must be serialized by caller. Returns true for queued, false for busy.
*/
-bool workqueue_enqueue(struct workqueue *wq, struct workqueue_work *work)
+void workqueue_enqueue(struct workqueue *wq, struct workqueue_work *work)
{
struct submit_worker *sw;
sw = get_submit_worker(wq);
- if (sw) {
- pthread_mutex_lock(&sw->lock);
- flist_add_tail(&work->list, &sw->work_list);
- sw->seq = ++wq->work_seq;
- sw->flags &= ~SW_F_IDLE;
- pthread_mutex_unlock(&sw->lock);
+ assert(sw);
- pthread_cond_signal(&sw->cond);
- return true;
- }
+ pthread_mutex_lock(&sw->lock);
+ flist_add_tail(&work->list, &sw->work_list);
+ sw->seq = ++wq->work_seq;
+ sw->flags &= ~SW_F_IDLE;
+ pthread_mutex_unlock(&sw->lock);
- return false;
+ pthread_cond_signal(&sw->cond);
}
static void handle_list(struct submit_worker *sw, struct flist_head *list)
{
struct submit_worker *sw = data;
struct workqueue *wq = sw->wq;
- unsigned int eflags = 0, ret;
+ unsigned int eflags = 0, ret = 0;
FLIST_HEAD(local_list);
- ret = workqueue_init_worker(sw);
+ if (wq->ops.nice) {
+ if (nice(wq->ops.nice) < 0) {
+ log_err("workqueue: nice %s\n", strerror(errno));
+ ret = 1;
+ }
+ }
+
+ if (!ret)
+ ret = workqueue_init_worker(sw);
+
pthread_mutex_lock(&sw->lock);
sw->flags |= SW_F_RUNNING;
if (ret)
struct submit_worker *sw;
int i;
+ if (!wq->workers)
+ return;
+
for (i = 0; i < wq->max_workers; i++) {
sw = &wq->workers[i];
} while (shutdown && shutdown != wq->max_workers);
free(wq->workers);
+ wq->workers = NULL;
pthread_mutex_destroy(&wq->flush_lock);
pthread_cond_destroy(&wq->flush_cond);
pthread_mutex_destroy(&wq->stat_lock);