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 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.