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 <konrad.sztyber@intel.com> Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/451466 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Paul Luse <paul.e.luse@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
parent
598ba408a2
commit
2fac8bc76b
@ -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
|
static void
|
||||||
spdk_bdev_io_put_buf(struct spdk_bdev_io *bdev_io)
|
spdk_bdev_io_put_buf(struct spdk_bdev_io *bdev_io)
|
||||||
{
|
{
|
||||||
struct spdk_mempool *pool;
|
struct spdk_mempool *pool;
|
||||||
struct spdk_bdev_io *tmp;
|
struct spdk_bdev_io *tmp;
|
||||||
void *buf, *aligned_buf;
|
|
||||||
bdev_io_stailq_t *stailq;
|
bdev_io_stailq_t *stailq;
|
||||||
struct spdk_bdev_mgmt_channel *ch;
|
struct spdk_bdev_mgmt_channel *ch;
|
||||||
uint64_t buf_len;
|
uint64_t buf_len, alignment;
|
||||||
uint64_t alignment;
|
void *buf;
|
||||||
bool buf_allocated;
|
|
||||||
|
|
||||||
buf = bdev_io->internal.buf;
|
buf = bdev_io->internal.buf;
|
||||||
buf_len = bdev_io->internal.buf_len;
|
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);
|
spdk_mempool_put(pool, buf);
|
||||||
} else {
|
} else {
|
||||||
tmp = STAILQ_FIRST(stailq);
|
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);
|
STAILQ_REMOVE_HEAD(stailq, internal.buf_link);
|
||||||
tmp->internal.buf = buf;
|
_bdev_io_set_buf(tmp, buf, tmp->internal.buf_len);
|
||||||
tmp->internal.get_buf_cb(tmp->internal.ch->channel, tmp, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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;
|
struct spdk_mempool *pool;
|
||||||
bdev_io_stailq_t *stailq;
|
bdev_io_stailq_t *stailq;
|
||||||
void *buf, *aligned_buf;
|
|
||||||
struct spdk_bdev_mgmt_channel *mgmt_ch;
|
struct spdk_bdev_mgmt_channel *mgmt_ch;
|
||||||
uint64_t alignment;
|
uint64_t alignment;
|
||||||
bool buf_allocated;
|
void *buf;
|
||||||
|
|
||||||
assert(cb != NULL);
|
assert(cb != NULL);
|
||||||
|
|
||||||
alignment = spdk_bdev_get_buf_align(bdev_io->bdev);
|
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)) {
|
_are_iovs_aligned(bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt, alignment)) {
|
||||||
/* Buffer already present and aligned */
|
/* Buffer already present and aligned */
|
||||||
cb(bdev_io->internal.ch->channel, bdev_io, true);
|
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);
|
buf = spdk_mempool_get(pool);
|
||||||
|
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
STAILQ_INSERT_TAIL(stailq, bdev_io, internal.buf_link);
|
STAILQ_INSERT_TAIL(stailq, bdev_io, internal.buf_link);
|
||||||
} else {
|
} else {
|
||||||
aligned_buf = (void *)(((uintptr_t)buf + (alignment - 1)) & ~(alignment - 1));
|
_bdev_io_set_buf(bdev_io, buf, len);
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user