Message ID | 20210422135834.406688-2-its@irrelevant.dk |
---|---|
State | New |
Headers | show |
Series | hw/block/nvme: fix msix uninit | expand |
On Apr 22 15:58, Klaus Jensen wrote: >From: Klaus Jensen <k.jensen@samsung.com> > >Commit 1901b4967c3f changed the nvme device from using a bar exclusive >for MSI-x to sharing it on bar0. > >Unfortunately, the msix_uninit_exclusive_bar() call remains in >nvme_exit() which causes havoc when the device is removed with, say, >device_del. > >Fix this. > >Fixes: 1901b4967c3f ("hw/block/nvme: move msix table and pba to BAR 0") >Signed-off-by: Klaus Jensen <k.jensen@samsung.com> >--- > hw/block/nvme.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > >diff --git a/hw/block/nvme.c b/hw/block/nvme.c >index 624a1431d072..31a1a59d88c9 100644 >--- a/hw/block/nvme.c >+++ b/hw/block/nvme.c >@@ -6235,7 +6235,7 @@ static void nvme_exit(PCIDevice *pci_dev) > if (n->pmr.dev) { > host_memory_backend_set_mapped(n->pmr.dev, false); > } >- msix_uninit_exclusive_bar(pci_dev); >+ msix_uninit(pci_dev, &n->bar0, &n->bar0); > } > > static Property nvme_props[] = { >-- >2.31.1 > Having investigated more, the proper fix must also delete the subregion that 1901b4967c3f introduced. Otherwise a reference lingers, causing the attached drive to never be "unlocked". my_bad_counter++; I found this screw-up while investigating Bug 1925496, so credit to Oguz Bektas for reporting this! diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 624a1431d072..5fe082ec34c5 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -6235,7 +6235,8 @@ static void nvme_exit(PCIDevice *pci_dev) if (n->pmr.dev) { host_memory_backend_set_mapped(n->pmr.dev, false); } - msix_uninit_exclusive_bar(pci_dev); + msix_uninit(pci_dev, &n->bar0, &n->bar0); + memory_region_del_subregion(&n->bar0, &n->iomem); } static Property nvme_props[] = {
diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 624a1431d072..31a1a59d88c9 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -6235,7 +6235,7 @@ static void nvme_exit(PCIDevice *pci_dev) if (n->pmr.dev) { host_memory_backend_set_mapped(n->pmr.dev, false); } - msix_uninit_exclusive_bar(pci_dev); + msix_uninit(pci_dev, &n->bar0, &n->bar0); } static Property nvme_props[] = {