Don't pass in a struct io_u, that's specific to the use case of
using this for queueing IO. Use a generic work type, so we can reuse
this helper code for other purposes.
Signed-off-by: Jens Axboe <axboe@fb.com>
- ret = workqueue_enqueue(&td->io_wq, io_u);
+ ret = workqueue_enqueue(&td->io_wq, &io_u->work);
if (ret)
ret = FIO_Q_QUEUED;
else
if (ret)
ret = FIO_Q_QUEUED;
else
return td->bytes_done[DDIR_WRITE] + td->bytes_done[DDIR_TRIM];
}
return td->bytes_done[DDIR_WRITE] + td->bytes_done[DDIR_TRIM];
}
-static void io_workqueue_fn(struct thread_data *td, struct io_u *io_u)
+static void io_workqueue_fn(struct thread_data *td, struct workqueue_work *work)
+ struct io_u *io_u = container_of(work, struct io_u, work);
const enum fio_ddir ddir = io_u->ddir;
int ret;
const enum fio_ddir ddir = io_u->ddir;
int ret;
#include "io_ddir.h"
#include "debug.h"
#include "file.h"
#include "io_ddir.h"
#include "debug.h"
#include "file.h"
#ifdef CONFIG_LIBAIO
#include <libaio.h>
#ifdef CONFIG_LIBAIO
#include <libaio.h>
- struct flist_head verify_list;
+ union {
+ struct flist_head verify_list;
+ struct workqueue_work work;
+ };
/*
* Callback for io completion
/*
* Callback for io completion
#include <unistd.h>
#include "fio.h"
#include <unistd.h>
#include "fio.h"
#include "flist.h"
#include "workqueue.h"
#include "lib/getrusage.h"
#include "flist.h"
#include "workqueue.h"
#include "lib/getrusage.h"
/*
* Must be serialized by caller. Returns true for queued, false for busy.
*/
/*
* Must be serialized by caller. Returns true for queued, false for busy.
*/
-bool workqueue_enqueue(struct workqueue *wq, struct io_u *io_u)
+bool 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);
{
struct submit_worker *sw;
sw = get_submit_worker(wq);
if (sw) {
pthread_mutex_lock(&sw->lock);
- flist_add_tail(&io_u->verify_list, &sw->work_list);
+ flist_add_tail(&work->list, &sw->work_list);
sw->seq = ++wq->work_seq;
sw->flags &= ~SW_F_IDLE;
pthread_mutex_unlock(&sw->lock);
sw->seq = ++wq->work_seq;
sw->flags &= ~SW_F_IDLE;
pthread_mutex_unlock(&sw->lock);
static void handle_list(struct submit_worker *sw, struct flist_head *list)
{
struct workqueue *wq = sw->wq;
static void handle_list(struct submit_worker *sw, struct flist_head *list)
{
struct workqueue *wq = sw->wq;
+ struct workqueue_work *work;
while (!flist_empty(list)) {
while (!flist_empty(list)) {
- io_u = flist_first_entry(list, struct io_u, verify_list);
- flist_del_init(&io_u->verify_list);
- wq->fn(&sw->td, io_u);
+ work = flist_first_entry(list, struct workqueue_work, list);
+ flist_del_init(&work->list);
+ wq->fn(&sw->td, work);
-typedef void (workqueue_fn)(struct thread_data *, struct io_u *);
+struct workqueue_work {
+ struct flist_head list;
+};
+
+typedef void (workqueue_fn)(struct thread_data *, struct workqueue_work *);
struct workqueue {
unsigned int max_workers;
struct workqueue {
unsigned int max_workers;
int workqueue_init(struct thread_data *td, struct workqueue *wq, workqueue_fn *fn, unsigned int max_workers);
void workqueue_exit(struct workqueue *wq);
int workqueue_init(struct thread_data *td, struct workqueue *wq, workqueue_fn *fn, unsigned int max_workers);
void workqueue_exit(struct workqueue *wq);
-bool workqueue_enqueue(struct workqueue *wq, struct io_u *io_u);
+bool workqueue_enqueue(struct workqueue *wq, struct workqueue_work *work);
void workqueue_flush(struct workqueue *wq);
#endif
void workqueue_flush(struct workqueue *wq);
#endif