bdev: Generalize buffer allocation
Make the buffer allocation work for all types of commands, not just read. Change-Id: I72d8f67a724566630e7c4a74759fcb08449f7de4 Signed-off-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
8ff1c0298d
commit
58734f5222
@ -157,15 +157,14 @@ struct spdk_bdev_io {
|
|||||||
/** Generation value for each I/O. */
|
/** Generation value for each I/O. */
|
||||||
uint32_t gencnt;
|
uint32_t gencnt;
|
||||||
|
|
||||||
|
/** bdev allocated memory associated with this request */
|
||||||
|
void *buf;
|
||||||
|
|
||||||
/** Enumerated value representing the I/O type. */
|
/** Enumerated value representing the I/O type. */
|
||||||
enum spdk_bdev_io_type type;
|
enum spdk_bdev_io_type type;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
|
|
||||||
/** The unaligned buf originally allocated. */
|
|
||||||
void *buf_unaligned;
|
|
||||||
|
|
||||||
/** For basic read case, use our own iovec element. */
|
/** For basic read case, use our own iovec element. */
|
||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
|
|
||||||
@ -175,14 +174,11 @@ struct spdk_bdev_io {
|
|||||||
/** For SG buffer cases, number of iovecs in iovec array. */
|
/** For SG buffer cases, number of iovecs in iovec array. */
|
||||||
int iovcnt;
|
int iovcnt;
|
||||||
|
|
||||||
/** For SG buffer cases, total size of data to be transferred. */
|
/** Total size of data to be transferred. */
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
/** Starting offset (in bytes) of the blockdev for this I/O. */
|
/** Starting offset (in bytes) of the blockdev for this I/O. */
|
||||||
uint64_t offset;
|
uint64_t offset;
|
||||||
|
|
||||||
/** Indicate whether the blockdev layer to put buf or not. */
|
|
||||||
bool put_buf;
|
|
||||||
} read;
|
} read;
|
||||||
struct {
|
struct {
|
||||||
/** For basic write case, use our own iovec element */
|
/** For basic write case, use our own iovec element */
|
||||||
@ -194,7 +190,7 @@ struct spdk_bdev_io {
|
|||||||
/** For SG buffer cases, number of iovecs in iovec array. */
|
/** For SG buffer cases, number of iovecs in iovec array. */
|
||||||
int iovcnt;
|
int iovcnt;
|
||||||
|
|
||||||
/** For SG buffer cases, total size of data to be transferred. */
|
/** Total size of data to be transferred. */
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
/** Starting offset (in bytes) of the blockdev for this I/O. */
|
/** Starting offset (in bytes) of the blockdev for this I/O. */
|
||||||
|
@ -120,10 +120,9 @@ spdk_bdev_io_set_buf(struct spdk_bdev_io *bdev_io, void *buf)
|
|||||||
assert(buf != NULL);
|
assert(buf != NULL);
|
||||||
assert(bdev_io->u.read.iovs != NULL);
|
assert(bdev_io->u.read.iovs != NULL);
|
||||||
|
|
||||||
bdev_io->u.read.buf_unaligned = buf;
|
bdev_io->buf = buf;
|
||||||
bdev_io->u.read.iovs[0].iov_base = (void *)((unsigned long)((char *)buf + 512) & ~511UL);
|
bdev_io->u.read.iovs[0].iov_base = (void *)((unsigned long)((char *)buf + 512) & ~511UL);
|
||||||
bdev_io->u.read.iovs[0].iov_len = bdev_io->u.read.len;
|
bdev_io->u.read.iovs[0].iov_len = bdev_io->u.read.len;
|
||||||
bdev_io->u.read.put_buf = true;
|
|
||||||
bdev_io->get_buf_cb(bdev_io->ch->channel, bdev_io);
|
bdev_io->get_buf_cb(bdev_io->ch->channel, bdev_io);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,7 +138,7 @@ spdk_bdev_io_put_buf(struct spdk_bdev_io *bdev_io)
|
|||||||
assert(bdev_io->u.read.iovcnt == 1);
|
assert(bdev_io->u.read.iovcnt == 1);
|
||||||
|
|
||||||
length = bdev_io->u.read.len;
|
length = bdev_io->u.read.len;
|
||||||
buf = bdev_io->u.read.buf_unaligned;
|
buf = bdev_io->buf;
|
||||||
|
|
||||||
if (length <= SPDK_BDEV_SMALL_BUF_MAX_SIZE) {
|
if (length <= SPDK_BDEV_SMALL_BUF_MAX_SIZE) {
|
||||||
pool = g_buf_small_pool;
|
pool = g_buf_small_pool;
|
||||||
@ -344,7 +343,7 @@ spdk_bdev_put_io(struct spdk_bdev_io *bdev_io)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bdev_io->type == SPDK_BDEV_IO_TYPE_READ && bdev_io->u.read.put_buf) {
|
if (bdev_io->buf != NULL) {
|
||||||
spdk_bdev_io_put_buf(bdev_io);
|
spdk_bdev_io_put_buf(bdev_io);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -476,9 +475,7 @@ spdk_bdev_get_child_io(struct spdk_bdev_io *parent,
|
|||||||
|
|
||||||
child->type = parent->type;
|
child->type = parent->type;
|
||||||
memcpy(&child->u, &parent->u, sizeof(child->u));
|
memcpy(&child->u, &parent->u, sizeof(child->u));
|
||||||
if (child->type == SPDK_BDEV_IO_TYPE_READ) {
|
child->buf = NULL;
|
||||||
child->u.read.put_buf = false;
|
|
||||||
}
|
|
||||||
child->get_buf_cb = NULL;
|
child->get_buf_cb = NULL;
|
||||||
child->parent = parent;
|
child->parent = parent;
|
||||||
|
|
||||||
@ -580,7 +577,6 @@ spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
|
|||||||
bdev_io->u.read.iovcnt = 1;
|
bdev_io->u.read.iovcnt = 1;
|
||||||
bdev_io->u.read.len = nbytes;
|
bdev_io->u.read.len = nbytes;
|
||||||
bdev_io->u.read.offset = offset;
|
bdev_io->u.read.offset = offset;
|
||||||
bdev_io->u.read.put_buf = false;
|
|
||||||
spdk_bdev_io_init(bdev_io, bdev, cb_arg, cb);
|
spdk_bdev_io_init(bdev_io, bdev, cb_arg, cb);
|
||||||
|
|
||||||
rc = spdk_bdev_io_submit(bdev_io);
|
rc = spdk_bdev_io_submit(bdev_io);
|
||||||
@ -619,7 +615,6 @@ spdk_bdev_readv(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
|
|||||||
bdev_io->u.read.iovcnt = iovcnt;
|
bdev_io->u.read.iovcnt = iovcnt;
|
||||||
bdev_io->u.read.len = nbytes;
|
bdev_io->u.read.len = nbytes;
|
||||||
bdev_io->u.read.offset = offset;
|
bdev_io->u.read.offset = offset;
|
||||||
bdev_io->u.read.put_buf = false;
|
|
||||||
spdk_bdev_io_init(bdev_io, bdev, cb_arg, cb);
|
spdk_bdev_io_init(bdev_io, bdev, cb_arg, cb);
|
||||||
|
|
||||||
rc = spdk_bdev_io_submit(bdev_io);
|
rc = spdk_bdev_io_submit(bdev_io);
|
||||||
|
@ -280,7 +280,6 @@ static int _blockdev_malloc_submit_request(struct spdk_io_channel *ch, struct sp
|
|||||||
((struct malloc_disk *)bdev_io->bdev->ctxt)->malloc_buf +
|
((struct malloc_disk *)bdev_io->bdev->ctxt)->malloc_buf +
|
||||||
bdev_io->u.read.offset;
|
bdev_io->u.read.offset;
|
||||||
bdev_io->u.read.iovs[0].iov_len = bdev_io->u.read.len;
|
bdev_io->u.read.iovs[0].iov_len = bdev_io->u.read.len;
|
||||||
bdev_io->u.read.put_buf = false;
|
|
||||||
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(bdev_io->driver_ctx),
|
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(bdev_io->driver_ctx),
|
||||||
SPDK_BDEV_IO_STATUS_SUCCESS);
|
SPDK_BDEV_IO_STATUS_SUCCESS);
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user