[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 3/3] hw/nvme: fix missing cq eventidx update
From: |
Guenter Roeck |
Subject: |
Re: [PATCH v2 3/3] hw/nvme: fix missing cq eventidx update |
Date: |
Thu, 8 Dec 2022 10:37:07 -0800 |
On Thu, Dec 08, 2022 at 01:26:42PM +0100, Klaus Jensen wrote:
> From: Klaus Jensen <k.jensen@samsung.com>
>
> Prior to reading the shadow doorbell cq head, we have to update the
> eventidx. Otherwise, we risk that the driver will skip an mmio doorbell
> write. This happens on riscv64, as reported by Guenter.
>
> Adding the missing update to the cq eventidx fixes the issue.
>
> Fixes: 3f7fe8de3d49 ("hw/nvme: Implement shadow doorbell buffer support")
> Cc: qemu-stable@nongnu.org
> Cc: qemu-riscv@nongnu.org
> Reported-by: Guenter Roeck <linux@roeck-us.net>
> Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
Tested-by: Guenter Roeck <linux@roeck-us.net>
> ---
> hw/nvme/ctrl.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
> index cfab21b3436e..f6cc766aba4a 100644
> --- a/hw/nvme/ctrl.c
> +++ b/hw/nvme/ctrl.c
> @@ -1334,6 +1334,14 @@ static inline void nvme_blk_write(BlockBackend *blk,
> int64_t offset,
> }
> }
>
> +static void nvme_update_cq_eventidx(const NvmeCQueue *cq)
> +{
> + trace_pci_nvme_update_cq_eventidx(cq->cqid, cq->head);
> +
> + pci_dma_write(PCI_DEVICE(cq->ctrl), cq->ei_addr, &cq->head,
> + sizeof(cq->head));
> +}
> +
> static void nvme_update_cq_head(NvmeCQueue *cq)
> {
> pci_dma_read(PCI_DEVICE(cq->ctrl), cq->db_addr, &cq->head,
> @@ -1355,6 +1363,7 @@ static void nvme_post_cqes(void *opaque)
> hwaddr addr;
>
> if (n->dbbuf_enabled) {
> + nvme_update_cq_eventidx(cq);
> nvme_update_cq_head(cq);
> }
>