bdev/malloc: create a malloc_task context
This prepares for future scatter-gather support. Signed-off-by: Jim Harris <james.r.harris@intel.com> Change-Id: Ie21c4d86c1e932dcaf63cf13d7a7198890595d79
This commit is contained in:
parent
52d2405f70
commit
8e03aa1f3c
@ -54,18 +54,35 @@ struct malloc_disk {
|
|||||||
struct malloc_disk *next;
|
struct malloc_disk *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct malloc_task {
|
||||||
|
int num_outstanding;
|
||||||
|
enum spdk_bdev_io_status status;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct malloc_task *
|
||||||
|
__malloc_task_from_copy_task(struct copy_task *ct)
|
||||||
|
{
|
||||||
|
return (struct malloc_task *)((uintptr_t)ct - sizeof(struct malloc_task));
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct copy_task *
|
||||||
|
__copy_task_from_malloc_task(struct malloc_task *mt)
|
||||||
|
{
|
||||||
|
return (struct copy_task *)((uintptr_t)mt + sizeof(struct malloc_task));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
malloc_done(void *ref, int status)
|
malloc_done(void *ref, int status)
|
||||||
{
|
{
|
||||||
struct copy_task *cp_task = (struct copy_task *)ref;
|
struct malloc_task *task = __malloc_task_from_copy_task(ref);
|
||||||
enum spdk_bdev_io_status bdev_status;
|
|
||||||
|
|
||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
bdev_status = SPDK_BDEV_IO_STATUS_FAILED;
|
task->status = SPDK_BDEV_IO_STATUS_FAILED;
|
||||||
} else {
|
}
|
||||||
bdev_status = SPDK_BDEV_IO_STATUS_SUCCESS;
|
|
||||||
|
if (--task->num_outstanding == 0) {
|
||||||
|
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(task), task->status);
|
||||||
}
|
}
|
||||||
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(cp_task), bdev_status);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct malloc_disk *g_malloc_disk_head = NULL;
|
static struct malloc_disk *g_malloc_disk_head = NULL;
|
||||||
@ -79,7 +96,7 @@ static void blockdev_malloc_get_spdk_running_config(FILE *fp);
|
|||||||
static int
|
static int
|
||||||
blockdev_malloc_get_ctx_size(void)
|
blockdev_malloc_get_ctx_size(void)
|
||||||
{
|
{
|
||||||
return spdk_copy_module_get_max_ctx_size();
|
return sizeof(struct malloc_task) + spdk_copy_module_get_max_ctx_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
SPDK_BDEV_MODULE_REGISTER(blockdev_malloc_initialize, blockdev_malloc_finish,
|
SPDK_BDEV_MODULE_REGISTER(blockdev_malloc_initialize, blockdev_malloc_finish,
|
||||||
@ -120,7 +137,7 @@ blockdev_malloc_destruct(struct spdk_bdev *bdev)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
blockdev_malloc_read(struct malloc_disk *mdisk, struct spdk_io_channel *ch,
|
blockdev_malloc_read(struct malloc_disk *mdisk, struct spdk_io_channel *ch,
|
||||||
struct copy_task *copy_req,
|
struct malloc_task *task,
|
||||||
void *buf, uint64_t nbytes, uint64_t offset)
|
void *buf, uint64_t nbytes, uint64_t offset)
|
||||||
{
|
{
|
||||||
int64_t rc;
|
int64_t rc;
|
||||||
@ -128,40 +145,47 @@ blockdev_malloc_read(struct malloc_disk *mdisk, struct spdk_io_channel *ch,
|
|||||||
SPDK_TRACELOG(SPDK_TRACE_MALLOC, "read %lu bytes from offset %#lx to %p\n",
|
SPDK_TRACELOG(SPDK_TRACE_MALLOC, "read %lu bytes from offset %#lx to %p\n",
|
||||||
nbytes, offset, buf);
|
nbytes, offset, buf);
|
||||||
|
|
||||||
rc = spdk_copy_submit(copy_req, ch, buf, mdisk->malloc_buf + offset, nbytes, malloc_done);
|
task->status = SPDK_BDEV_IO_STATUS_SUCCESS;
|
||||||
|
task->num_outstanding = 1;
|
||||||
|
|
||||||
|
rc = spdk_copy_submit(__copy_task_from_malloc_task(task), ch, buf,
|
||||||
|
mdisk->malloc_buf + offset, nbytes, malloc_done);
|
||||||
|
|
||||||
if (rc != (int64_t)nbytes) {
|
if (rc != (int64_t)nbytes) {
|
||||||
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(copy_req), SPDK_BDEV_IO_STATUS_FAILED);
|
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(task), SPDK_BDEV_IO_STATUS_FAILED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
blockdev_malloc_writev(struct malloc_disk *mdisk, struct spdk_io_channel *ch,
|
blockdev_malloc_writev(struct malloc_disk *mdisk, struct spdk_io_channel *ch,
|
||||||
struct copy_task *copy_req,
|
struct malloc_task *task,
|
||||||
struct iovec *iov, int iovcnt, size_t len, uint64_t offset)
|
struct iovec *iov, int iovcnt, size_t len, uint64_t offset)
|
||||||
{
|
{
|
||||||
int64_t rc;
|
int64_t rc;
|
||||||
|
|
||||||
if ((iovcnt != 1) || (iov->iov_len != len)) {
|
if ((iovcnt != 1) || (iov->iov_len != len)) {
|
||||||
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(copy_req), SPDK_BDEV_IO_STATUS_FAILED);
|
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(task), SPDK_BDEV_IO_STATUS_FAILED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SPDK_TRACELOG(SPDK_TRACE_MALLOC, "wrote %lu bytes to offset %#lx from %p\n",
|
SPDK_TRACELOG(SPDK_TRACE_MALLOC, "wrote %lu bytes to offset %#lx from %p\n",
|
||||||
iov->iov_len, offset, iov->iov_base);
|
iov->iov_len, offset, iov->iov_base);
|
||||||
|
|
||||||
rc = spdk_copy_submit(copy_req, ch, mdisk->malloc_buf + offset,
|
task->status = SPDK_BDEV_IO_STATUS_SUCCESS;
|
||||||
|
task->num_outstanding = 1;
|
||||||
|
|
||||||
|
rc = spdk_copy_submit(__copy_task_from_malloc_task(task), ch, mdisk->malloc_buf + offset,
|
||||||
iov->iov_base, len, malloc_done);
|
iov->iov_base, len, malloc_done);
|
||||||
|
|
||||||
if (rc != (int64_t)len) {
|
if (rc != (int64_t)len) {
|
||||||
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(copy_req), SPDK_BDEV_IO_STATUS_FAILED);
|
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(task), SPDK_BDEV_IO_STATUS_FAILED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
blockdev_malloc_unmap(struct malloc_disk *mdisk,
|
blockdev_malloc_unmap(struct malloc_disk *mdisk,
|
||||||
struct spdk_io_channel *ch,
|
struct spdk_io_channel *ch,
|
||||||
struct copy_task *copy_req,
|
struct malloc_task *task,
|
||||||
struct spdk_scsi_unmap_bdesc *unmap_d,
|
struct spdk_scsi_unmap_bdesc *unmap_d,
|
||||||
uint16_t bdesc_count)
|
uint16_t bdesc_count)
|
||||||
{
|
{
|
||||||
@ -185,22 +209,26 @@ blockdev_malloc_unmap(struct malloc_disk *mdisk,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return spdk_copy_submit_fill(copy_req, ch, mdisk->malloc_buf + offset, 0, byte_count, malloc_done);
|
task->status = SPDK_BDEV_IO_STATUS_SUCCESS;
|
||||||
|
task->num_outstanding = 1;
|
||||||
|
|
||||||
|
return spdk_copy_submit_fill(__copy_task_from_malloc_task(task), ch,
|
||||||
|
mdisk->malloc_buf + offset, 0, byte_count, malloc_done);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int64_t
|
static int64_t
|
||||||
blockdev_malloc_flush(struct malloc_disk *mdisk, struct copy_task *copy_req,
|
blockdev_malloc_flush(struct malloc_disk *mdisk, struct malloc_task *task,
|
||||||
uint64_t offset, uint64_t nbytes)
|
uint64_t offset, uint64_t nbytes)
|
||||||
{
|
{
|
||||||
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(copy_req), SPDK_BDEV_IO_STATUS_SUCCESS);
|
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(task), SPDK_BDEV_IO_STATUS_SUCCESS);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
blockdev_malloc_reset(struct malloc_disk *mdisk, struct copy_task *copy_req)
|
blockdev_malloc_reset(struct malloc_disk *mdisk, struct malloc_task *task)
|
||||||
{
|
{
|
||||||
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(copy_req), SPDK_BDEV_IO_STATUS_SUCCESS);
|
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(task), SPDK_BDEV_IO_STATUS_SUCCESS);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -219,7 +247,7 @@ static int _blockdev_malloc_submit_request(struct spdk_bdev_io *bdev_io)
|
|||||||
|
|
||||||
blockdev_malloc_read((struct malloc_disk *)bdev_io->ctx,
|
blockdev_malloc_read((struct malloc_disk *)bdev_io->ctx,
|
||||||
bdev_io->ch,
|
bdev_io->ch,
|
||||||
(struct copy_task *)bdev_io->driver_ctx,
|
(struct malloc_task *)bdev_io->driver_ctx,
|
||||||
bdev_io->u.read.buf,
|
bdev_io->u.read.buf,
|
||||||
bdev_io->u.read.nbytes,
|
bdev_io->u.read.nbytes,
|
||||||
bdev_io->u.read.offset);
|
bdev_io->u.read.offset);
|
||||||
@ -228,7 +256,7 @@ static int _blockdev_malloc_submit_request(struct spdk_bdev_io *bdev_io)
|
|||||||
case SPDK_BDEV_IO_TYPE_WRITE:
|
case SPDK_BDEV_IO_TYPE_WRITE:
|
||||||
blockdev_malloc_writev((struct malloc_disk *)bdev_io->ctx,
|
blockdev_malloc_writev((struct malloc_disk *)bdev_io->ctx,
|
||||||
bdev_io->ch,
|
bdev_io->ch,
|
||||||
(struct copy_task *)bdev_io->driver_ctx,
|
(struct malloc_task *)bdev_io->driver_ctx,
|
||||||
bdev_io->u.write.iovs,
|
bdev_io->u.write.iovs,
|
||||||
bdev_io->u.write.iovcnt,
|
bdev_io->u.write.iovcnt,
|
||||||
bdev_io->u.write.len,
|
bdev_io->u.write.len,
|
||||||
@ -237,18 +265,18 @@ static int _blockdev_malloc_submit_request(struct spdk_bdev_io *bdev_io)
|
|||||||
|
|
||||||
case SPDK_BDEV_IO_TYPE_RESET:
|
case SPDK_BDEV_IO_TYPE_RESET:
|
||||||
return blockdev_malloc_reset((struct malloc_disk *)bdev_io->ctx,
|
return blockdev_malloc_reset((struct malloc_disk *)bdev_io->ctx,
|
||||||
(struct copy_task *)bdev_io->driver_ctx);
|
(struct malloc_task *)bdev_io->driver_ctx);
|
||||||
|
|
||||||
case SPDK_BDEV_IO_TYPE_FLUSH:
|
case SPDK_BDEV_IO_TYPE_FLUSH:
|
||||||
return blockdev_malloc_flush((struct malloc_disk *)bdev_io->ctx,
|
return blockdev_malloc_flush((struct malloc_disk *)bdev_io->ctx,
|
||||||
(struct copy_task *)bdev_io->driver_ctx,
|
(struct malloc_task *)bdev_io->driver_ctx,
|
||||||
bdev_io->u.flush.offset,
|
bdev_io->u.flush.offset,
|
||||||
bdev_io->u.flush.length);
|
bdev_io->u.flush.length);
|
||||||
|
|
||||||
case SPDK_BDEV_IO_TYPE_UNMAP:
|
case SPDK_BDEV_IO_TYPE_UNMAP:
|
||||||
return blockdev_malloc_unmap((struct malloc_disk *)bdev_io->ctx,
|
return blockdev_malloc_unmap((struct malloc_disk *)bdev_io->ctx,
|
||||||
bdev_io->ch,
|
bdev_io->ch,
|
||||||
(struct copy_task *)bdev_io->driver_ctx,
|
(struct malloc_task *)bdev_io->driver_ctx,
|
||||||
bdev_io->u.unmap.unmap_bdesc,
|
bdev_io->u.unmap.unmap_bdesc,
|
||||||
bdev_io->u.unmap.bdesc_count);
|
bdev_io->u.unmap.bdesc_count);
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user