diff --git a/include/spdk/bdev_module.h b/include/spdk/bdev_module.h index 568e5b85a..a946aa86b 100644 --- a/include/spdk/bdev_module.h +++ b/include/spdk/bdev_module.h @@ -616,9 +616,8 @@ void spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb * \param buf The buffer to set as the active data buffer. * \param len The length of the buffer. * - * \return The usable size of the buffer, after adjustments of alignment. */ -size_t spdk_bdev_io_set_buf(struct spdk_bdev_io *bdev_io, void *buf, size_t len); +void spdk_bdev_io_set_buf(struct spdk_bdev_io *bdev_io, void *buf, size_t len); /** * Complete a bdev_io diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 44a25d515..ae3f9e742 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -377,33 +377,18 @@ spdk_bdev_get_by_name(const char *bdev_name) return NULL; } -size_t +void spdk_bdev_io_set_buf(struct spdk_bdev_io *bdev_io, void *buf, size_t len) { - struct iovec **iovs; - int *iovcnt; - void *aligned_buf; + struct iovec *iovs; - iovs = &bdev_io->u.bdev.iovs; - iovcnt = &bdev_io->u.bdev.iovcnt; + iovs = bdev_io->u.bdev.iovs; - if (*iovs == NULL || *iovcnt == 0) { - *iovs = &bdev_io->iov; - *iovcnt = 1; - } + assert(iovs != NULL); + assert(bdev_io->u.bdev.iovcnt >= 1); - if (buf != NULL) { - aligned_buf = (void *)(((uintptr_t)buf + 511) & ~511UL); - len = len - ((uintptr_t)aligned_buf - (uintptr_t)buf); - } else { - aligned_buf = NULL; - assert(len == 0); - } - - (*iovs)[0].iov_base = aligned_buf; - (*iovs)[0].iov_len = len; - - return len; + iovs[0].iov_base = buf; + iovs[0].iov_len = len; } static void @@ -411,38 +396,34 @@ spdk_bdev_io_put_buf(struct spdk_bdev_io *bdev_io) { struct spdk_mempool *pool; struct spdk_bdev_io *tmp; - void *buf; + void *buf, *aligned_buf; bdev_io_stailq_t *stailq; struct spdk_bdev_mgmt_channel *ch; - size_t len; assert(bdev_io->u.bdev.iovcnt == 1); buf = bdev_io->internal.buf; ch = bdev_io->internal.ch->shared_resource->mgmt_ch; + bdev_io->internal.buf = NULL; + if (bdev_io->internal.buf_len <= SPDK_BDEV_SMALL_BUF_MAX_SIZE) { pool = g_bdev_mgr.buf_small_pool; stailq = &ch->need_buf_small; - len = SPDK_BDEV_SMALL_BUF_MAX_SIZE + 512; } else { pool = g_bdev_mgr.buf_large_pool; stailq = &ch->need_buf_large; - len = SPDK_BDEV_LARGE_BUF_MAX_SIZE + 512; } if (STAILQ_EMPTY(stailq)) { spdk_mempool_put(pool, buf); } else { tmp = STAILQ_FIRST(stailq); + + aligned_buf = (void *)(((uintptr_t)buf + 511) & ~511UL); + spdk_bdev_io_set_buf(bdev_io, aligned_buf, tmp->internal.buf_len); + STAILQ_REMOVE_HEAD(stailq, internal.buf_link); - len = spdk_bdev_io_set_buf(tmp, buf, len); - if (len < tmp->internal.buf_len) { - SPDK_ERRLOG("Unable to use buffer due to alignment\n"); - spdk_mempool_put(pool, buf); - spdk_bdev_io_set_buf(tmp, NULL, 0); - return; - } tmp->internal.buf = buf; tmp->internal.get_buf_cb(tmp->internal.ch->channel, tmp); } @@ -453,9 +434,8 @@ 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 = NULL; + void *buf, *aligned_buf; struct spdk_bdev_mgmt_channel *mgmt_ch; - size_t buf_len; assert(cb != NULL); assert(bdev_io->u.bdev.iovs != NULL); @@ -474,11 +454,9 @@ spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, u if (len <= SPDK_BDEV_SMALL_BUF_MAX_SIZE) { pool = g_bdev_mgr.buf_small_pool; stailq = &mgmt_ch->need_buf_small; - buf_len = SPDK_BDEV_SMALL_BUF_MAX_SIZE + 512; } else { pool = g_bdev_mgr.buf_large_pool; stailq = &mgmt_ch->need_buf_large; - buf_len = SPDK_BDEV_LARGE_BUF_MAX_SIZE + 512; } buf = spdk_mempool_get(pool); @@ -486,16 +464,8 @@ spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, u if (!buf) { STAILQ_INSERT_TAIL(stailq, bdev_io, internal.buf_link); } else { - size_t aligned_len; - - aligned_len = spdk_bdev_io_set_buf(bdev_io, buf, buf_len); - if (aligned_len < len) { - SPDK_ERRLOG("Unable to use buffer after alignment calculations.\n"); - spdk_mempool_put(pool, buf); - spdk_bdev_io_set_buf(bdev_io, NULL, 0); - STAILQ_INSERT_TAIL(stailq, bdev_io, internal.buf_link); - return; - } + aligned_buf = (void *)(((uintptr_t)buf + 511) & ~511UL); + 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);