use io_complete var to avoid the rbd_aio_is_complete lock and context switch
authorKetor Meng <d.ketor@gmail.com>
Wed, 29 Oct 2014 15:57:02 +0000 (15:57 +0000)
committerKetor Meng <d.ketor@gmail.com>
Wed, 29 Oct 2014 15:57:02 +0000 (15:57 +0000)
Signed-off-by: Ketor Meng <d.ketor@gmail.com>
engines/rbd.c

index 363be65bea58ded83e37eb7b867283d6aada67f8..52fc8c9f566e174b0c8d3173713233d25a66271e 100644 (file)
@@ -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);