From: Christoph Hellwig <hch@lst.de>
To: Logan Gunthorpe <logang@deltatee.com>
Cc: Sagi Grimberg <sagi@grimberg.me>,
Chaitanya Kulkarni <Chaitanya.Kulkarni@wdc.com>,
linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org,
Stephen Bates <sbates@raithlin.com>, Jens Axboe <axboe@fb.com>,
Keith Busch <kbusch@kernel.org>, Max Gurtovoy <maxg@mellanox.com>,
Christoph Hellwig <hch@lst.de>
Subject: Re: [PATCH v15 7/9] nvmet-passthru: Add passthru code to process commands
Date: Mon, 20 Jul 2020 16:16:06 +0200 [thread overview]
Message-ID: <20200720141606.GF4627@lst.de> (raw)
In-Reply-To: <20200716203319.16022-8-logang@deltatee.com>
On Thu, Jul 16, 2020 at 02:33:17PM -0600, Logan Gunthorpe wrote:
> Add passthru command handling capability for the NVMeOF target and
> export passthru APIs which are used to integrate passthru
> code with nvmet-core.
>
> The new file passthru.c handles passthru cmd parsing and execution.
> In the passthru mode, we create a block layer request from the nvmet
> request and map the data on to the block layer request.
>
> Admin commands and features are on a white list as there are a number
> of each that don't make too much sense with passthrough. We use a
> white list so that new commands can be considered before being blindly
> passed through. In both cases, vendor specific commands are always
> allowed.
>
> We also blacklist reservation IO commands as the underlying device
> cannot differentiate between multiple hosts behind a fabric.
I'm still not so happy about having to look up the namespace and still
wonder if we should generalize the connect_q to a passthrough_q. But
I guess we can do that later and then reduce some of the exports here..
A few more comments below:
> + struct {
> + struct request *rq;
> + struct work_struct work;
> + u16 (*end_req)(struct nvmet_req *req);
> + } p;
Do we really need the callback for the two identify fixups, or
should we just hardcode them to avoid indirection function calls?
> +++ b/drivers/nvme/target/passthru.c
> @@ -0,0 +1,457 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * NVMe Over Fabrics Target Passthrough command implementation.
> + *
> + * Copyright (c) 2017-2018 Western Digital Corporation or its
> + * affiliates.
> + */
I think you forgot to add your own copyrights here.
> +static int nvmet_passthru_map_sg(struct nvmet_req *req, struct request *rq)
> +{
> + int sg_cnt = req->sg_cnt;
> + struct scatterlist *sg;
> + int op_flags = 0;
> + struct bio *bio;
> + int i, ret;
> +
> + if (req->cmd->common.opcode == nvme_cmd_flush)
> + op_flags = REQ_FUA;
> + else if (nvme_is_write(req->cmd))
> + op_flags = REQ_SYNC | REQ_IDLE;
> +
> +
Double empty line here..
> + bio = bio_alloc(GFP_KERNEL, min(sg_cnt, BIO_MAX_PAGES));
> + bio->bi_end_io = bio_put;
> +
> + for_each_sg(req->sg, sg, req->sg_cnt, i) {
> + if (bio_add_page(bio, sg_page(sg), sg->length,
> + sg->offset) != sg->length) {
bio_add_pages is only for non-passthrough requests, this needs to use
bio_add_pc_page.
> + if (blk_rq_nr_phys_segments(rq) > queue_max_segments(rq->q)) {
> + status = NVME_SC_INVALID_FIELD;
> + goto fail_out;
> + }
> +
> + if ((blk_rq_payload_bytes(rq) >> 9) > queue_max_hw_sectors(rq->q)) {
> + status = NVME_SC_INVALID_FIELD;
> + goto fail_out;
> + }
Which should also take care of these checks.
> +static void nvmet_passthru_set_host_behaviour(struct nvmet_req *req)
> +{
> + struct nvme_ctrl *ctrl = nvmet_req_passthru_ctrl(req);
> + struct nvme_feat_host_behavior *host;
> + u16 status;
> + int ret;
> +
> + host = kzalloc(sizeof(*host) * 2, GFP_KERNEL);
> + ret = nvme_get_features(ctrl, NVME_FEAT_HOST_BEHAVIOR, 0,
> + host, sizeof(*host), NULL);
Mising kzalloc return check.
_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme
WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de>
To: Logan Gunthorpe <logang@deltatee.com>
Cc: linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org,
Christoph Hellwig <hch@lst.de>, Sagi Grimberg <sagi@grimberg.me>,
Keith Busch <kbusch@kernel.org>, Jens Axboe <axboe@fb.com>,
Chaitanya Kulkarni <Chaitanya.Kulkarni@wdc.com>,
Max Gurtovoy <maxg@mellanox.com>,
Stephen Bates <sbates@raithlin.com>
Subject: Re: [PATCH v15 7/9] nvmet-passthru: Add passthru code to process commands
Date: Mon, 20 Jul 2020 16:16:06 +0200 [thread overview]
Message-ID: <20200720141606.GF4627@lst.de> (raw)
In-Reply-To: <20200716203319.16022-8-logang@deltatee.com>
On Thu, Jul 16, 2020 at 02:33:17PM -0600, Logan Gunthorpe wrote:
> Add passthru command handling capability for the NVMeOF target and
> export passthru APIs which are used to integrate passthru
> code with nvmet-core.
>
> The new file passthru.c handles passthru cmd parsing and execution.
> In the passthru mode, we create a block layer request from the nvmet
> request and map the data on to the block layer request.
>
> Admin commands and features are on a white list as there are a number
> of each that don't make too much sense with passthrough. We use a
> white list so that new commands can be considered before being blindly
> passed through. In both cases, vendor specific commands are always
> allowed.
>
> We also blacklist reservation IO commands as the underlying device
> cannot differentiate between multiple hosts behind a fabric.
I'm still not so happy about having to look up the namespace and still
wonder if we should generalize the connect_q to a passthrough_q. But
I guess we can do that later and then reduce some of the exports here..
A few more comments below:
> + struct {
> + struct request *rq;
> + struct work_struct work;
> + u16 (*end_req)(struct nvmet_req *req);
> + } p;
Do we really need the callback for the two identify fixups, or
should we just hardcode them to avoid indirection function calls?
> +++ b/drivers/nvme/target/passthru.c
> @@ -0,0 +1,457 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * NVMe Over Fabrics Target Passthrough command implementation.
> + *
> + * Copyright (c) 2017-2018 Western Digital Corporation or its
> + * affiliates.
> + */
I think you forgot to add your own copyrights here.
> +static int nvmet_passthru_map_sg(struct nvmet_req *req, struct request *rq)
> +{
> + int sg_cnt = req->sg_cnt;
> + struct scatterlist *sg;
> + int op_flags = 0;
> + struct bio *bio;
> + int i, ret;
> +
> + if (req->cmd->common.opcode == nvme_cmd_flush)
> + op_flags = REQ_FUA;
> + else if (nvme_is_write(req->cmd))
> + op_flags = REQ_SYNC | REQ_IDLE;
> +
> +
Double empty line here..
> + bio = bio_alloc(GFP_KERNEL, min(sg_cnt, BIO_MAX_PAGES));
> + bio->bi_end_io = bio_put;
> +
> + for_each_sg(req->sg, sg, req->sg_cnt, i) {
> + if (bio_add_page(bio, sg_page(sg), sg->length,
> + sg->offset) != sg->length) {
bio_add_pages is only for non-passthrough requests, this needs to use
bio_add_pc_page.
> + if (blk_rq_nr_phys_segments(rq) > queue_max_segments(rq->q)) {
> + status = NVME_SC_INVALID_FIELD;
> + goto fail_out;
> + }
> +
> + if ((blk_rq_payload_bytes(rq) >> 9) > queue_max_hw_sectors(rq->q)) {
> + status = NVME_SC_INVALID_FIELD;
> + goto fail_out;
> + }
Which should also take care of these checks.
> +static void nvmet_passthru_set_host_behaviour(struct nvmet_req *req)
> +{
> + struct nvme_ctrl *ctrl = nvmet_req_passthru_ctrl(req);
> + struct nvme_feat_host_behavior *host;
> + u16 status;
> + int ret;
> +
> + host = kzalloc(sizeof(*host) * 2, GFP_KERNEL);
> + ret = nvme_get_features(ctrl, NVME_FEAT_HOST_BEHAVIOR, 0,
> + host, sizeof(*host), NULL);
Mising kzalloc return check.
next prev parent reply other threads:[~2020-07-20 14:16 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-16 20:33 [PATCH v15 0/9] nvmet: add target passthru commands support Logan Gunthorpe
2020-07-16 20:33 ` Logan Gunthorpe
2020-07-16 20:33 ` [PATCH v15 1/9] nvme-core: Clear any SGL flags in passthru commands Logan Gunthorpe
2020-07-16 20:33 ` Logan Gunthorpe
2020-07-20 14:01 ` Christoph Hellwig
2020-07-20 14:01 ` Christoph Hellwig
2020-07-16 20:33 ` [PATCH v15 2/9] nvme: Create helper function to obtain command effects Logan Gunthorpe
2020-07-16 20:33 ` Logan Gunthorpe
2020-07-20 14:04 ` Christoph Hellwig
2020-07-20 14:04 ` Christoph Hellwig
2020-07-16 20:33 ` [PATCH v15 3/9] nvme: Move nvme_passthru_[start|end]() calls to common helper Logan Gunthorpe
2020-07-16 20:33 ` Logan Gunthorpe
2020-07-20 14:06 ` Christoph Hellwig
2020-07-20 14:06 ` Christoph Hellwig
2020-07-16 20:33 ` [PATCH v15 4/9] nvmet-passthru: Introduce NVMet passthru Kconfig option Logan Gunthorpe
2020-07-16 20:33 ` Logan Gunthorpe
2020-07-20 14:06 ` Christoph Hellwig
2020-07-20 14:06 ` Christoph Hellwig
2020-07-16 20:33 ` [PATCH v15 5/9] nvme-core: Introduce nvme_ctrl_get_by_path() Logan Gunthorpe
2020-07-16 20:33 ` Logan Gunthorpe
2020-07-20 14:09 ` Christoph Hellwig
2020-07-20 14:09 ` Christoph Hellwig
2020-07-16 20:33 ` [PATCH v15 6/9] nvme: Export existing nvme core functions Logan Gunthorpe
2020-07-16 20:33 ` Logan Gunthorpe
2020-07-16 20:33 ` [PATCH v15 7/9] nvmet-passthru: Add passthru code to process commands Logan Gunthorpe
2020-07-16 20:33 ` Logan Gunthorpe
2020-07-20 14:16 ` Christoph Hellwig [this message]
2020-07-20 14:16 ` Christoph Hellwig
2020-07-20 19:35 ` Sagi Grimberg
2020-07-20 19:35 ` Sagi Grimberg
2020-07-20 21:41 ` Logan Gunthorpe
2020-07-20 21:41 ` Logan Gunthorpe
2020-07-20 21:58 ` Chaitanya Kulkarni
2020-07-20 21:58 ` Chaitanya Kulkarni
2020-07-20 22:35 ` Sagi Grimberg
2020-07-20 22:35 ` Sagi Grimberg
2020-07-20 23:01 ` Logan Gunthorpe
2020-07-20 23:01 ` Logan Gunthorpe
2020-07-20 23:15 ` Sagi Grimberg
2020-07-20 23:15 ` Sagi Grimberg
2020-07-20 23:17 ` Keith Busch
2020-07-20 23:17 ` Keith Busch
2020-07-20 23:28 ` Sagi Grimberg
2020-07-20 23:28 ` Sagi Grimberg
2020-07-21 0:06 ` Keith Busch
2020-07-21 0:06 ` Keith Busch
2020-07-21 0:39 ` Sagi Grimberg
2020-07-21 0:39 ` Sagi Grimberg
2020-07-22 21:09 ` Logan Gunthorpe
2020-07-22 21:09 ` Logan Gunthorpe
2020-07-22 22:31 ` Sagi Grimberg
2020-07-22 22:31 ` Sagi Grimberg
2020-07-16 20:33 ` [PATCH v15 8/9] nvmet-passthru: Add enable/disable helpers Logan Gunthorpe
2020-07-16 20:33 ` Logan Gunthorpe
2020-07-16 20:33 ` [PATCH v15 9/9] nvmet-configfs: Introduce passthru configfs interface Logan Gunthorpe
2020-07-16 20:33 ` Logan Gunthorpe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200720141606.GF4627@lst.de \
--to=hch@lst.de \
--cc=Chaitanya.Kulkarni@wdc.com \
--cc=axboe@fb.com \
--cc=kbusch@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=logang@deltatee.com \
--cc=maxg@mellanox.com \
--cc=sagi@grimberg.me \
--cc=sbates@raithlin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.