From 2fac8bc76bfabf6fe3ee4afc060d7ca2bce4419f Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Mon, 15 Apr 2019 17:07:18 +0200 Subject: [PATCH] lib/bdev: merge buffer allocation in get_buf/put_buf These two paths do the same thing, only spdk_bdev_io_get_buf tries to allocate the buffer directly, while spdk_bdev_io_put_buf reuses the returned buffer for one of the waiting requests. Change-Id: I341a011f3a16a99de399c8b56fa73ccd9c7fe4fa Signed-off-by: Konrad Sztyber Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/451466 Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Paul Luse Reviewed-by: Jim Harris Reviewed-by: Tomasz Zawadzki --- lib/bdev/bdev.c | 61 +++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 33d5fe7c2..fdf2cae42 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -514,17 +514,37 @@ _bdev_io_set_bounce_buf(struct spdk_bdev_io *bdev_io, void *buf, size_t len) } } +static void +_bdev_io_set_buf(struct spdk_bdev_io *bdev_io, void *buf, uint64_t len) +{ + struct spdk_bdev *bdev = bdev_io->bdev; + bool buf_allocated; + uint64_t alignment; + void *aligned_buf; + + alignment = spdk_bdev_get_buf_align(bdev); + buf_allocated = _is_buf_allocated(bdev_io->u.bdev.iovs); + aligned_buf = (void *)(((uintptr_t)buf + (alignment - 1)) & ~(alignment - 1)); + + if (buf_allocated) { + _bdev_io_set_bounce_buf(bdev_io, aligned_buf, len); + } else { + spdk_bdev_io_set_buf(bdev_io, aligned_buf, len); + } + + bdev_io->internal.buf = buf; + bdev_io->internal.get_buf_cb(bdev_io->internal.ch->channel, bdev_io, true); +} + static void spdk_bdev_io_put_buf(struct spdk_bdev_io *bdev_io) { struct spdk_mempool *pool; struct spdk_bdev_io *tmp; - void *buf, *aligned_buf; bdev_io_stailq_t *stailq; struct spdk_bdev_mgmt_channel *ch; - uint64_t buf_len; - uint64_t alignment; - bool buf_allocated; + uint64_t buf_len, alignment; + void *buf; buf = bdev_io->internal.buf; buf_len = bdev_io->internal.buf_len; @@ -546,21 +566,8 @@ spdk_bdev_io_put_buf(struct spdk_bdev_io *bdev_io) spdk_mempool_put(pool, buf); } else { tmp = STAILQ_FIRST(stailq); - - alignment = spdk_bdev_get_buf_align(tmp->bdev); - buf_allocated = _is_buf_allocated(tmp->u.bdev.iovs); - - aligned_buf = (void *)(((uintptr_t)buf + - (alignment - 1)) & ~(alignment - 1)); - if (buf_allocated) { - _bdev_io_set_bounce_buf(tmp, aligned_buf, tmp->internal.buf_len); - } else { - spdk_bdev_io_set_buf(tmp, aligned_buf, tmp->internal.buf_len); - } - STAILQ_REMOVE_HEAD(stailq, internal.buf_link); - tmp->internal.buf = buf; - tmp->internal.get_buf_cb(tmp->internal.ch->channel, tmp, true); + _bdev_io_set_buf(tmp, buf, tmp->internal.buf_len); } } @@ -588,17 +595,14 @@ spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, u { struct spdk_mempool *pool; bdev_io_stailq_t *stailq; - void *buf, *aligned_buf; struct spdk_bdev_mgmt_channel *mgmt_ch; uint64_t alignment; - bool buf_allocated; + void *buf; assert(cb != NULL); - alignment = spdk_bdev_get_buf_align(bdev_io->bdev); - buf_allocated = _is_buf_allocated(bdev_io->u.bdev.iovs); - if (buf_allocated && + if (_is_buf_allocated(bdev_io->u.bdev.iovs) && _are_iovs_aligned(bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt, alignment)) { /* Buffer already present and aligned */ cb(bdev_io->internal.ch->channel, bdev_io, true); @@ -628,19 +632,10 @@ spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, u } buf = spdk_mempool_get(pool); - if (!buf) { STAILQ_INSERT_TAIL(stailq, bdev_io, internal.buf_link); } else { - aligned_buf = (void *)(((uintptr_t)buf + (alignment - 1)) & ~(alignment - 1)); - - if (buf_allocated) { - _bdev_io_set_bounce_buf(bdev_io, aligned_buf, len); - } else { - spdk_bdev_io_set_buf(bdev_io, aligned_buf, len); - } - bdev_io->internal.buf = buf; - bdev_io->internal.get_buf_cb(bdev_io->internal.ch->channel, bdev_io, true); + _bdev_io_set_buf(bdev_io, buf, len); } }