All of lore.kernel.org
 help / color / mirror / Atom feed
From: Minwoo Im <minwoo.im.dev@gmail.com>
To: Klaus Jensen <its@irrelevant.dk>
Cc: Keith Busch <kbusch@kernel.org>, Kevin Wolf <kwolf@redhat.com>,
	qemu-devel@nongnu.org, qemu-block@nongnu.org,
	Max Reitz <mreitz@redhat.com>
Subject: Re: [PATCH V3 7/8] hw/block/nvme: support changed namespace asyncrohous event
Date: Tue, 2 Mar 2021 18:26:43 +0900	[thread overview]
Message-ID: <20210302092643.GA2136@localhost.localdomain> (raw)
In-Reply-To: <YDyB8m//9Mh3whCI@apples.localdomain>

On 21-03-01 06:56:02, Klaus Jensen wrote:
> On Mar  1 01:10, Minwoo Im wrote:
> > If namespace inventory is changed due to some reasons (e.g., namespace
> > attachment/detachment), controller can send out event notifier to the
> > host to manage namespaces.
> > 
> > This patch sends out the AEN to the host after either attach or detach
> > namespaces from controllers.  To support clear of the event from the
> > controller, this patch also implemented Get Log Page command for Changed
> > Namespace List log type.  To return namespace id list through the
> > command, when namespace inventory is updated, id is added to the
> > per-controller list (changed_ns_list).
> > 
> > To indicate the support of this async event, this patch set
> > OAES(Optional Asynchronous Events Supported) in Identify Controller data
> > structure.
> > 
> > Signed-off-by: Minwoo Im <minwoo.im.dev@gmail.com>
> > ---
> >  hw/block/nvme.c      | 44 ++++++++++++++++++++++++++++++++++++++++++++
> >  hw/block/nvme.h      |  7 +++++++
> >  include/block/nvme.h |  7 +++++++
> >  3 files changed, 58 insertions(+)
> > 
> > diff --git a/hw/block/nvme.c b/hw/block/nvme.c
> > index 68c2e63d9412..fc06f806e58e 100644
> > --- a/hw/block/nvme.c
> > +++ b/hw/block/nvme.c
> > @@ -2980,6 +2980,32 @@ static uint16_t nvme_error_info(NvmeCtrl *n, uint8_t rae, uint32_t buf_len,
> >                      DMA_DIRECTION_FROM_DEVICE, req);
> >  }
> >  
> > +static uint16_t nvme_changed_nslist(NvmeCtrl *n, uint8_t rae, uint32_t buf_len,
> > +                                    uint64_t off, NvmeRequest *req)
> > +{
> > +    uint32_t nslist[1024];
> > +    uint32_t trans_len;
> > +    NvmeChangedNs *ns, *next;
> > +    int i = 0;
> > +
> > +    memset(nslist, 0x0, sizeof(nslist));
> > +    trans_len = MIN(sizeof(nslist) - off, buf_len);
> > +
> > +    QTAILQ_FOREACH_SAFE(ns, &n->changed_ns_list, entry, next) {
> > +        nslist[i++] = ns->nsid;
> > +
> > +        QTAILQ_REMOVE(&n->changed_ns_list, ns, entry);
> > +        g_free(ns);
> > +    }
> > +
> > +    if (!rae) {
> > +        nvme_clear_events(n, NVME_AER_TYPE_NOTICE);
> > +    }
> > +
> > +    return nvme_dma(n, ((uint8_t *)nslist) + off, trans_len,
> > +                    DMA_DIRECTION_FROM_DEVICE, req);
> > +}
> > +
> >  static uint16_t nvme_cmd_effects(NvmeCtrl *n, uint8_t csi, uint32_t buf_len,
> >                                   uint64_t off, NvmeRequest *req)
> >  {
> > @@ -3064,6 +3090,8 @@ static uint16_t nvme_get_log(NvmeCtrl *n, NvmeRequest *req)
> >          return nvme_smart_info(n, rae, len, off, req);
> >      case NVME_LOG_FW_SLOT_INFO:
> >          return nvme_fw_log_info(n, len, off, req);
> > +    case NVME_LOG_CHANGED_NSLIST:
> > +        return nvme_changed_nslist(n, rae, len, off, req);
> >      case NVME_LOG_CMD_EFFECTS:
> >          return nvme_cmd_effects(n, csi, len, off, req);
> >      default:
> > @@ -3882,6 +3910,7 @@ static uint16_t nvme_ns_attachment(NvmeCtrl *n, NvmeRequest *req)
> >      uint16_t *ids = &list[1];
> >      uint16_t ret;
> >      int i;
> > +    NvmeChangedNs *changed_nsid;
> >  
> >      trace_pci_nvme_ns_attachment(nvme_cid(req), dw10 & 0xf);
> >  
> > @@ -3920,6 +3949,18 @@ static uint16_t nvme_ns_attachment(NvmeCtrl *n, NvmeRequest *req)
> >  
> >              nvme_ns_detach(ctrl, ns);
> >          }
> > +
> > +        /*
> > +         * Add namespace id to the changed namespace id list for event clearing
> > +         * via Get Log Page command.
> > +         */
> > +        changed_nsid = g_new(NvmeChangedNs, 1);
> > +        changed_nsid->nsid = nsid;
> > +        QTAILQ_INSERT_TAIL(&ctrl->changed_ns_list, changed_nsid, entry);
> > +
> > +        nvme_enqueue_event(ctrl, NVME_AER_TYPE_NOTICE,
> > +                           NVME_AER_INFO_NOTICE_NS_ATTR_CHANGED,
> > +                           NVME_LOG_CHANGED_NSLIST);
> >      }
> 
> If one just keeps attaching/detaching we end up with more than 1024
> entries here and go out of bounds in nvme_changed_nslist.
> 
> How about having the QTAILQ_ENTRY directly on the NvmeNamespace struct
> and use QTAILQ_IN_USE to check if the namespace is already in the list?

QTAILQ_IN_USE might be tough to represent relationship between
controller and namespace itself.  So, I will work on this with standard
bitmap rather than the list.  I think bitmap will be easier to represent
the relationship.


  reply	other threads:[~2021-03-02  9:27 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-28 16:10 [PATCH V3 0/8] hw/block/nvme: support namespace attachment Minwoo Im
2021-02-28 16:10 ` [PATCH V3 1/8] hw/block/nvme: support namespace detach Minwoo Im
2021-03-15  4:56   ` Keqian Zhu
2021-03-16 21:46     ` Klaus Jensen
2021-02-28 16:10 ` [PATCH V3 2/8] hw/block/nvme: fix namespaces array to 1-based Minwoo Im
2021-02-28 16:10 ` [PATCH V3 3/8] hw/block/nvme: fix allocated namespace list to 256 Minwoo Im
2021-02-28 16:10 ` [PATCH V3 4/8] hw/block/nvme: support allocated namespace type Minwoo Im
2021-02-28 16:10 ` [PATCH V3 5/8] hw/block/nvme: refactor nvme_select_ns_iocs Minwoo Im
2021-02-28 16:10 ` [PATCH V3 6/8] hw/block/nvme: support namespace attachment command Minwoo Im
2021-02-28 16:10 ` [PATCH V3 7/8] hw/block/nvme: support changed namespace asyncrohous event Minwoo Im
2021-03-01  5:56   ` Klaus Jensen
2021-03-02  9:26     ` Minwoo Im [this message]
2021-03-02  9:28       ` Klaus Jensen
2021-02-28 16:11 ` [PATCH V3 8/8] hw/block/nvme: support Identify NS Attached Controller List Minwoo Im

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=20210302092643.GA2136@localhost.localdomain \
    --to=minwoo.im.dev@gmail.com \
    --cc=its@irrelevant.dk \
    --cc=kbusch@kernel.org \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /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.