From: Jens Axboe Date: Mon, 6 Jul 2009 11:43:46 +0000 (+0200) Subject: Improve async verify offload efficiency X-Git-Tag: fio-1.31~8 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=e53ab27c7425241d64e8d64ad77850a776c01375;ds=sidebyside Improve async verify offload efficiency Signed-off-by: Jens Axboe --- diff --git a/flist.h b/flist.h index e62f4b29..95023c75 100644 --- a/flist.h +++ b/flist.h @@ -117,6 +117,36 @@ static inline int flist_empty(const struct flist_head *head) return head->next == head; } +static inline void __flist_splice(const struct flist_head *list, + struct flist_head *prev, + struct flist_head *next) +{ + struct flist_head *first = list->next; + struct flist_head *last = list->prev; + + first->prev = prev; + prev->next = first; + + last->next = next; + next->prev = last; +} + +static inline void flist_splice(const struct flist_head *list, + struct flist_head *head) +{ + if (!flist_empty(list)) + __flist_splice(list, head, head->next); +} + +static inline void flist_splice_init(struct flist_head *list, + struct flist_head *head) +{ + if (!flist_empty(list)) { + __flist_splice(list, head, head->next); + INIT_FLIST_HEAD(list); + } +} + /** * flist_entry - get the struct for this entry * @ptr: the &struct flist_head pointer. diff --git a/verify.c b/verify.c index 5dd9ee33..978e77b8 100644 --- a/verify.c +++ b/verify.c @@ -756,6 +756,8 @@ static void *verify_async_thread(void *data) } do { + FLIST_HEAD(list); + read_barrier(); if (td->verify_thread_exit) break; @@ -771,17 +773,19 @@ static void *verify_async_thread(void *data) } } - if (flist_empty(&td->verify_list)) { - pthread_mutex_unlock(&td->io_u_lock); + flist_splice_init(&td->verify_list, &list); + pthread_mutex_unlock(&td->io_u_lock); + + if (flist_empty(&list)) continue; - } - io_u = flist_entry(td->verify_list.next, struct io_u, list); - flist_del_init(&io_u->list); - pthread_mutex_unlock(&td->io_u_lock); + while (!flist_empty(&list)) { + io_u = flist_entry(list.next, struct io_u, list); + flist_del_init(&io_u->list); - ret = verify_io_u(td, io_u); - put_io_u(td, io_u); + ret |= verify_io_u(td, io_u); + put_io_u(td, io_u); + } } while (!ret); done: