projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
use io_complete var to avoid the rbd_aio_is_complete lock and context switch
[fio.git]
/
engines
/
rbd.c
diff --git
a/engines/rbd.c
b/engines/rbd.c
index 363be65bea58ded83e37eb7b867283d6aada67f8..52fc8c9f566e174b0c8d3173713233d25a66271e 100644
(file)
--- a/
engines/rbd.c
+++ b/
engines/rbd.c
@@
-13,6
+13,7
@@
struct fio_rbd_iou {
struct io_u *io_u;
rbd_completion_t completion;
int io_seen;
struct io_u *io_u;
rbd_completion_t completion;
int io_seen;
+ int io_complete;
};
struct rbd_data {
};
struct rbd_data {
@@
-186,6
+187,8
@@
static void _fio_rbd_finish_aiocb(rbd_completion_t comp, void *data)
* a specific error. So we have to assume that it can't do
* partial completions.
*/
* a specific error. So we have to assume that it can't do
* partial completions.
*/
+ fri->io_complete = 1;
+
ret = rbd_aio_get_return_value(fri->completion);
if (ret < 0) {
io_u->error = ret;
ret = rbd_aio_get_return_value(fri->completion);
if (ret < 0) {
io_u->error = ret;
@@
-207,7
+210,7
@@
static inline int fri_check_complete(struct rbd_data *rbd_data,
{
struct fio_rbd_iou *fri = io_u->engine_data;
{
struct fio_rbd_iou *fri = io_u->engine_data;
- if (
rbd_aio_is_complete(fri->completion)
) {
+ if (
fri->io_complete
) {
fri->io_seen = 1;
rbd_data->aio_events[*events] = io_u;
(*events)++;
fri->io_seen = 1;
rbd_data->aio_events[*events] = io_u;
(*events)++;
@@
-283,6
+286,7
@@
static int fio_rbd_queue(struct thread_data *td, struct io_u *io_u)
fio_ro_check(td, io_u);
fri->io_seen = 0;
fio_ro_check(td, io_u);
fri->io_seen = 0;
+ fri->io_complete = 0;
r = rbd_aio_create_completion(fri, _fio_rbd_finish_aiocb,
&fri->completion);
r = rbd_aio_create_completion(fri, _fio_rbd_finish_aiocb,
&fri->completion);