Commit b7cc001a authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Ben Walker
Browse files

bdev/ocssd: find_io_path() returns bdev_ocssd_ns and spdk_nvme_ns pointers directly



Signed-off-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: Ifd5a3f5ab2e87d383da1c3b94949fa2ffd916ecc
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8150


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
parent 55e4be34
Loading
Loading
Loading
Loading
+51 −44
Original line number Diff line number Diff line
@@ -107,14 +107,16 @@ bdev_ocssd_get_ns_from_nvme(struct nvme_bdev_ns *nvme_ns)

static inline bool
bdev_ocssd_find_io_path(struct nvme_bdev *nbdev, struct nvme_io_path *io_path,
			struct nvme_bdev_ns **_nvme_ns, struct spdk_nvme_qpair **_qpair)
			struct bdev_ocssd_ns **_ocssd_ns,
			struct spdk_nvme_ns **_ns, struct spdk_nvme_qpair **_qpair)
{
	if (spdk_unlikely(io_path->qpair == NULL)) {
		/* The device is currently resetting. */
		return false;
	}

	*_nvme_ns = nbdev->nvme_ns;
	*_ocssd_ns = bdev_ocssd_get_ns_from_nvme(nbdev->nvme_ns);
	*_ns = nbdev->nvme_ns->ns;
	*_qpair = io_path->qpair;
	return true;
}
@@ -383,12 +385,11 @@ bdev_ocssd_read_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
}

static int
bdev_ocssd_read(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
		struct spdk_nvme_qpair *qpair,
bdev_ocssd_read(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
		struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
		struct bdev_ocssd_io *ocdev_io, struct iovec *iov, int iovcnt,
		void *md, uint64_t lba_count, uint64_t lba)
{
	struct bdev_ocssd_ns *ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);
	const size_t zone_size = bdev_ocssd_get_zone_size(ocssd_bdev);

	if ((lba % zone_size) + lba_count > zone_size) {
@@ -403,7 +404,7 @@ bdev_ocssd_read(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,

	lba = bdev_ocssd_to_disk_lba(ocssd_ns, lba);

	return spdk_nvme_ns_cmd_readv_with_md(nvme_ns->ns, qpair, lba,
	return spdk_nvme_ns_cmd_readv_with_md(ns, qpair, lba,
					      lba_count, bdev_ocssd_read_cb,
					      ocdev_io, 0, bdev_ocssd_reset_sgl,
					      bdev_ocssd_next_sge, md, 0, 0);
@@ -424,12 +425,11 @@ bdev_ocssd_write_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
}

static int
bdev_ocssd_write(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
		 struct spdk_nvme_qpair *qpair,
bdev_ocssd_write(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
		 struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
		 struct bdev_ocssd_io *ocdev_io, struct iovec *iov, int iovcnt,
		 void *md, uint64_t lba_count, uint64_t lba)
{
	struct bdev_ocssd_ns *ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);
	const size_t zone_size = bdev_ocssd_get_zone_size(ocssd_bdev);
	struct bdev_ocssd_zone *zone;
	int rc;
@@ -452,7 +452,7 @@ bdev_ocssd_write(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,

	lba = bdev_ocssd_to_disk_lba(ocssd_ns, lba);

	rc = spdk_nvme_ns_cmd_writev_with_md(nvme_ns->ns, qpair, lba,
	rc = spdk_nvme_ns_cmd_writev_with_md(ns, qpair, lba,
					     lba_count, bdev_ocssd_write_cb,
					     ocdev_io, 0, bdev_ocssd_reset_sgl,
					     bdev_ocssd_next_sge, md, 0, 0);
@@ -479,12 +479,11 @@ bdev_ocssd_append_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
}

static int
bdev_ocssd_zone_append(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
		       struct spdk_nvme_qpair *qpair,
bdev_ocssd_zone_append(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
		       struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
		       struct bdev_ocssd_io *ocdev_io, struct iovec *iov, int iovcnt,
		       void *md, uint64_t lba_count, uint64_t lba)
{
	struct bdev_ocssd_ns *ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);
	struct bdev_ocssd_zone *zone;
	int rc = 0;

@@ -512,7 +511,7 @@ bdev_ocssd_zone_append(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_

	lba = bdev_ocssd_to_disk_lba(ocssd_ns, zone->write_pointer);

	rc = spdk_nvme_ns_cmd_writev_with_md(nvme_ns->ns, qpair, lba,
	rc = spdk_nvme_ns_cmd_writev_with_md(ns, qpair, lba,
					     lba_count, bdev_ocssd_append_cb,
					     ocdev_io, 0, bdev_ocssd_reset_sgl,
					     bdev_ocssd_next_sge, md, 0, 0);
@@ -529,7 +528,8 @@ bdev_ocssd_io_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i
{
	struct ocssd_bdev *ocssd_bdev = (struct ocssd_bdev *)bdev_io->bdev->ctxt;
	struct nvme_io_path *io_path = spdk_io_channel_get_ctx(ch);
	struct nvme_bdev_ns *nvme_ns;
	struct bdev_ocssd_ns *ocssd_ns;
	struct spdk_nvme_ns *ns;
	struct spdk_nvme_qpair *qpair;
	int rc;

@@ -539,13 +539,14 @@ bdev_ocssd_io_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i
	}

	if (spdk_unlikely(!bdev_ocssd_find_io_path(&ocssd_bdev->nvme_bdev, io_path,
			  &nvme_ns, &qpair))) {
			  &ocssd_ns, &ns, &qpair))) {
		spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
		return;
	}

	rc = bdev_ocssd_read(ocssd_bdev,
			     nvme_ns,
			     ocssd_ns,
			     ns,
			     qpair,
			     (struct bdev_ocssd_io *)bdev_io->driver_ctx,
			     bdev_io->u.bdev.iovs,
@@ -575,11 +576,10 @@ bdev_ocssd_reset_zone_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
}

static int
bdev_ocssd_reset_zone(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
		      struct spdk_nvme_qpair *qpair,
bdev_ocssd_reset_zone(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
		      struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
		      struct bdev_ocssd_io *ocdev_io, uint64_t slba, size_t num_zones)
{
	struct bdev_ocssd_ns *ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);
	uint64_t offset, zone_size = bdev_ocssd_get_zone_size(ocssd_bdev);
	struct bdev_ocssd_zone *zone;
	int rc;
@@ -601,7 +601,7 @@ bdev_ocssd_reset_zone(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_n

	ocdev_io->io.zone = zone;

	rc = spdk_nvme_ocssd_ns_cmd_vector_reset(nvme_ns->ns, qpair,
	rc = spdk_nvme_ocssd_ns_cmd_vector_reset(ns, qpair,
			ocdev_io->io.lba, num_zones, NULL,
			bdev_ocssd_reset_zone_cb, ocdev_io);
	if (spdk_unlikely(rc != 0)) {
@@ -611,8 +611,8 @@ bdev_ocssd_reset_zone(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_n
	return rc;
}

static int _bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev,
				     struct nvme_bdev_ns *nvme_ns,
static int _bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
				     struct spdk_nvme_ns *ns,
				     struct bdev_ocssd_io *ocdev_io, uint64_t zone_id);

static void
@@ -654,7 +654,7 @@ bdev_ocssd_zone_info_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
	struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx(ctx);
	struct ocssd_bdev *ocssd_bdev = bdev_io->bdev->ctxt;
	struct nvme_io_path *io_path;
	struct nvme_bdev_ns *nvme_ns;
	struct spdk_nvme_ns *ns;
	struct spdk_nvme_qpair *qpair;
	struct bdev_ocssd_ns *ocssd_ns;
	struct spdk_bdev_zone_info *zone_info;
@@ -667,13 +667,12 @@ bdev_ocssd_zone_info_cb(void *ctx, const struct spdk_nvme_cpl *cpl)

	io_path = spdk_io_channel_get_ctx(spdk_bdev_io_get_io_channel(bdev_io));

	if (spdk_unlikely(!bdev_ocssd_find_io_path(&ocssd_bdev->nvme_bdev, io_path, &nvme_ns, &qpair))) {
	if (spdk_unlikely(!bdev_ocssd_find_io_path(&ocssd_bdev->nvme_bdev, io_path, &ocssd_ns, &ns,
			  &qpair))) {
		spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
		return;
	}

	ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);

	zone_info = ((struct spdk_bdev_zone_info *)bdev_io->u.zone_mgmt.buf) +
		    ocdev_io->zone_info.chunk_offset;
	bdev_ocssd_fill_zone_info(ocssd_bdev, ocssd_ns, zone_info, chunk_info);
@@ -681,7 +680,7 @@ bdev_ocssd_zone_info_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
	if (++ocdev_io->zone_info.chunk_offset == bdev_io->u.zone_mgmt.num_zones) {
		spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_SUCCESS);
	} else {
		rc = _bdev_ocssd_get_zone_info(ocssd_bdev, nvme_ns, ocdev_io,
		rc = _bdev_ocssd_get_zone_info(ocssd_bdev, ocssd_ns, ns, ocdev_io,
					       bdev_io->u.zone_mgmt.zone_id);
		if (spdk_unlikely(rc != 0)) {
			if (rc == -ENOMEM) {
@@ -694,18 +693,18 @@ bdev_ocssd_zone_info_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
}

static int
_bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
_bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
			  struct spdk_nvme_ns *ns,
			  struct bdev_ocssd_io *ocdev_io, uint64_t zone_id)
{
	struct bdev_ocssd_ns *ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);
	uint64_t lba, offset, zone_size = bdev_ocssd_get_zone_size(ocssd_bdev);

	lba = zone_id + ocdev_io->zone_info.chunk_offset * zone_size;
	offset = bdev_ocssd_to_chunk_info_offset(ocssd_ns, lba);

	return spdk_nvme_ctrlr_cmd_get_log_page(spdk_nvme_ns_get_ctrlr(nvme_ns->ns),
	return spdk_nvme_ctrlr_cmd_get_log_page(spdk_nvme_ns_get_ctrlr(ns),
						SPDK_OCSSD_LOG_CHUNK_INFO,
						spdk_nvme_ns_get_id(nvme_ns->ns),
						spdk_nvme_ns_get_id(ns),
						&ocdev_io->zone_info.chunk_info,
						sizeof(ocdev_io->zone_info.chunk_info),
						offset * sizeof(ocdev_io->zone_info.chunk_info),
@@ -713,7 +712,8 @@ _bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nv
}

static int
bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
			 struct spdk_nvme_ns *ns,
			 struct bdev_ocssd_io *ocdev_io, uint64_t zone_id, uint32_t num_zones)
{
	uint64_t zone_size = bdev_ocssd_get_zone_size(ocssd_bdev);
@@ -730,17 +730,19 @@ bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvm

	ocdev_io->zone_info.chunk_offset = 0;

	return _bdev_ocssd_get_zone_info(ocssd_bdev, nvme_ns, ocdev_io, zone_id);
	return _bdev_ocssd_get_zone_info(ocssd_bdev, ocssd_ns, ns, ocdev_io, zone_id);
}

static int
bdev_ocssd_zone_management(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
			   struct spdk_nvme_qpair *qpair, struct spdk_bdev_io *bdev_io)
bdev_ocssd_zone_management(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
			   struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
			   struct spdk_bdev_io *bdev_io)
{
	switch (bdev_io->u.zone_mgmt.zone_action) {
	case SPDK_BDEV_ZONE_RESET:
		return bdev_ocssd_reset_zone(ocssd_bdev,
					     nvme_ns,
					     ocssd_ns,
					     ns,
					     qpair,
					     (struct bdev_ocssd_io *)bdev_io->driver_ctx,
					     bdev_io->u.zone_mgmt.zone_id,
@@ -797,11 +799,12 @@ _bdev_ocssd_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev
	struct nvme_io_path *io_path = spdk_io_channel_get_ctx(ch);
	struct ocssd_bdev *ocssd_bdev = (struct ocssd_bdev *)bdev_io->bdev->ctxt;
	struct bdev_ocssd_io *ocdev_io = (struct bdev_ocssd_io *)bdev_io->driver_ctx;
	struct nvme_bdev_ns *nvme_ns;
	struct bdev_ocssd_ns *ocssd_ns;
	struct spdk_nvme_ns *ns;
	struct spdk_nvme_qpair *qpair;

	if (spdk_unlikely(!bdev_ocssd_find_io_path(&ocssd_bdev->nvme_bdev, io_path,
			  &nvme_ns, &qpair))) {
			  &ocssd_ns, &ns, &qpair))) {
		return -1;
	}

@@ -809,7 +812,8 @@ _bdev_ocssd_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev
	case SPDK_BDEV_IO_TYPE_READ:
		if (bdev_io->u.bdev.iovs && bdev_io->u.bdev.iovs[0].iov_base) {
			return bdev_ocssd_read(ocssd_bdev,
					       nvme_ns,
					       ocssd_ns,
					       ns,
					       qpair,
					       ocdev_io,
					       bdev_io->u.bdev.iovs,
@@ -825,7 +829,8 @@ _bdev_ocssd_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev

	case SPDK_BDEV_IO_TYPE_WRITE:
		return bdev_ocssd_write(ocssd_bdev,
					nvme_ns,
					ocssd_ns,
					ns,
					qpair,
					ocdev_io,
					bdev_io->u.bdev.iovs,
@@ -835,18 +840,20 @@ _bdev_ocssd_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev
					bdev_io->u.bdev.offset_blocks);

	case SPDK_BDEV_IO_TYPE_ZONE_MANAGEMENT:
		return bdev_ocssd_zone_management(ocssd_bdev, nvme_ns, qpair, bdev_io);
		return bdev_ocssd_zone_management(ocssd_bdev, ocssd_ns, ns, qpair, bdev_io);

	case SPDK_BDEV_IO_TYPE_GET_ZONE_INFO:
		return bdev_ocssd_get_zone_info(ocssd_bdev,
						nvme_ns,
						ocssd_ns,
						ns,
						ocdev_io,
						bdev_io->u.zone_mgmt.zone_id,
						bdev_io->u.zone_mgmt.num_zones);

	case SPDK_BDEV_IO_TYPE_ZONE_APPEND:
		return bdev_ocssd_zone_append(ocssd_bdev,
					      nvme_ns,
					      ocssd_ns,
					      ns,
					      qpair,
					      ocdev_io,
					      bdev_io->u.bdev.iovs,