From: Christoph Hellwig <hch@lst.de>
To: Hannes Reinecke <hare@suse.de>
Cc: Christoph Hellwig <hch@lst.de>, Sagi Grimberg <sagi@grimberg.me>,
Keith Busch <kbusch@kernel.org>,
linux-nvme@lists.infradead.org
Subject: Re: [PATCH 2/2] nvme-auth: use xarray instead of linked list
Date: Sun, 30 Oct 2022 09:00:18 +0100 [thread overview]
Message-ID: <20221030080018.GE4214@lst.de> (raw)
In-Reply-To: <20221028135027.116044-3-hare@suse.de>
On Fri, Oct 28, 2022 at 03:50:27PM +0200, Hannes Reinecke wrote:
> The current design of holding the chap context is slightly awkward,
> as the context is allocated on demand, and we have to lock the list
> when looking up contexts as we wouldn't know if the context is
> allocated.
>
> This patch moves the allocation out of the chap context before starting
> authentication and stores it into an xarray. With that we can do
> away with the lock and access the context directly via the queue number.
>
> Signed-off-by: Hannes Reinecke <hare@suse.de>
> ---
> drivers/nvme/host/auth.c | 116 ++++++++++++++++++++++-----------------
> drivers/nvme/host/nvme.h | 3 +-
> 2 files changed, 66 insertions(+), 53 deletions(-)
>
> diff --git a/drivers/nvme/host/auth.c b/drivers/nvme/host/auth.c
> index b68fb2c764f6..7b974bd0fa64 100644
> --- a/drivers/nvme/host/auth.c
> +++ b/drivers/nvme/host/auth.c
> @@ -72,10 +72,12 @@ static int nvme_auth_submit(struct nvme_ctrl *ctrl, int qid,
> 0, flags, nvme_max_retries);
> if (ret > 0)
> dev_warn(ctrl->device,
> - "qid %d auth_send failed with status %d\n", qid, ret);
> + "qid %d auth_%s failed with status %d\n",
> + qid, auth_send ? "send" : "recv", ret);
> else if (ret < 0)
> dev_err(ctrl->device,
> - "qid %d auth_send failed with error %d\n", qid, ret);
> + "qid %d auth_%s failed with error %d\n",
> + qid, auth_send ? "send" : "recv", ret);
> return ret;
This looks like an unrelated message fixup.
> @@ -870,29 +872,42 @@ int nvme_auth_negotiate(struct nvme_ctrl *ctrl, int qid)
> return -ENOKEY;
> }
>
> - mutex_lock(&ctrl->dhchap_auth_mutex);
> + if (qid == NVME_QID_ANY)
> + qid = 0;
I can't see how NVME_QID_ANY would ever be passed here.
> + chap = xa_load(&ctrl->dhchap_auth_xa, qid);
> if (!chap) {
> + int ret;
> +
> + chap = kzalloc(sizeof(*chap), GFP_KERNEL);
> + if (!chap) {
> + dev_warn(ctrl->device,
> + "qid %d: error allocation authentication", qid);
> + return -ENOMEM;
> + }
> + chap->qid = qid;
> + chap->ctrl = ctrl;
>
> + INIT_WORK(&chap->auth_work, __nvme_auth_work);
> + ret = xa_insert(&ctrl->dhchap_auth_xa, qid, chap, GFP_KERNEL);
GFP_NOFS?
Also xa_insert can fail with -EBUSY here if someone concurrently inserted
an entry now that there is no locking.
> + } else {
> + if (chap->qid != qid) {
> + dev_warn(ctrl->device,
> + "qid %d: authentication qid mismatch (%d)!",
> + chap->qid, qid);
> + chap = xa_erase(&ctrl->dhchap_auth_xa, qid);
> + __nvme_auth_free(chap);
> + return -ENOENT;
> + }
How can the qid not match given that the lookup is by qid?
> + flush_work(&chap->auth_work);
> + __nvme_auth_reset(chap);
> + }
What protects us against someone concurrently freeing the entry here?
> @@ -901,33 +916,35 @@ EXPORT_SYMBOL_GPL(nvme_auth_negotiate);
> int nvme_auth_wait(struct nvme_ctrl *ctrl, int qid)
> {
> struct nvme_dhchap_queue_context *chap;
>
> + if (qid == NVME_QID_ANY)
> + qid = 0;
I can't see how NVME_QID_ANY gets passed here ever.
> + chap = xa_load(&ctrl->dhchap_auth_xa, qid);
> + if (!chap) {
> + dev_warn(ctrl->device,
> + "qid %d: authentication not initialized!",
> + qid);
> + return -ENOENT;
> + } else if (chap->qid != qid) {
No need for an return after an else. But I can't see how the qid
makes sense here. But once again, what protects the entry from
being freed?
> @@ -947,7 +964,7 @@ static void nvme_dhchap_auth_work(struct work_struct *work)
> ret = nvme_auth_wait(ctrl, 0);
> if (ret) {
> dev_warn(ctrl->device,
> - "qid 0: authentication failed\n");
> + "qid 0: authentication failed with %d\n", ret);
This looks like an unrelated message cleanup.
prev parent reply other threads:[~2022-10-30 8:00 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-28 13:50 [PATCH 0/2] nvme-auth: avoid locking during authentication Hannes Reinecke
2022-10-28 13:50 ` [PATCH 1/2] nvme-auth: allocate authentication buffer only during transaction Hannes Reinecke
2022-10-30 7:52 ` Christoph Hellwig
2022-10-31 17:46 ` Hannes Reinecke
2022-10-28 13:50 ` [PATCH 2/2] nvme-auth: use xarray instead of linked list Hannes Reinecke
2022-10-30 8:00 ` Christoph Hellwig [this message]
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=20221030080018.GE4214@lst.de \
--to=hch@lst.de \
--cc=hare@suse.de \
--cc=kbusch@kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=sagi@grimberg.me \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox