* [PATCH 1/4] um: virtio_uml: free command if adding to virtqueue failed
@ 2023-02-09 9:00 benjamin
2023-02-09 9:00 ` [PATCH 2/4] um: virtio_uml: mark device as unregistered when breaking it benjamin
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: benjamin @ 2023-02-09 9:00 UTC (permalink / raw)
To: linux-um; +Cc: Benjamin Berg
From: Benjamin Berg <benjamin.berg@intel.com>
If adding the command fails (i.e. the virtqueue is broken) then free it
again if the function allocated a new buffer for it.
Change-Id: I03d2c687aeccb8bc8da280925ffdaeb8fb70eee7
Fixes: 68f5d3f3b654 ("um: add PCI over virtio emulation driver")
Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
---
arch/um/drivers/virt-pci.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
index 3ac220dafec4..3b637ad75ec8 100644
--- a/arch/um/drivers/virt-pci.c
+++ b/arch/um/drivers/virt-pci.c
@@ -132,8 +132,11 @@ static int um_pci_send_cmd(struct um_pci_device *dev,
out ? 1 : 0,
posted ? cmd : HANDLE_NO_FREE(cmd),
GFP_ATOMIC);
- if (ret)
+ if (ret) {
+ if (posted)
+ kfree(cmd);
goto out;
+ }
if (posted) {
virtqueue_kick(dev->cmd_vq);
--
2.39.1
_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/4] um: virtio_uml: mark device as unregistered when breaking it
2023-02-09 9:00 [PATCH 1/4] um: virtio_uml: free command if adding to virtqueue failed benjamin
@ 2023-02-09 9:00 ` benjamin
2023-02-09 9:00 ` [PATCH 3/4] um: virtio_uml: move device breaking into workqueue benjamin
2023-02-09 9:00 ` [PATCH 4/4] um: virt-pci: properly remove PCI device from bus benjamin
2 siblings, 0 replies; 4+ messages in thread
From: benjamin @ 2023-02-09 9:00 UTC (permalink / raw)
To: linux-um; +Cc: Benjamin Berg
From: Benjamin Berg <benjamin.berg@intel.com>
Mark the device as not registered anymore when scheduling the work to
remove it. Otherwise we could end up scheduling the work multiple times
in a row, including scheduling it while it is already running.
Change-Id: I5debd5084986f37b793cfac98d95b3a577d7a345
Fixes: af9fb41ed315 ("um: virtio_uml: Fix broken device handling in time-travel")
Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
---
arch/um/drivers/virtio_uml.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
index 588930a0ced1..dcfd0ca534ee 100644
--- a/arch/um/drivers/virtio_uml.c
+++ b/arch/um/drivers/virtio_uml.c
@@ -168,6 +168,8 @@ static void vhost_user_check_reset(struct virtio_uml_device *vu_dev,
if (!vu_dev->registered)
return;
+ vu_dev->registered = 0;
+
virtio_break_device(&vu_dev->vdev);
schedule_work(&pdata->conn_broken_wk);
}
--
2.39.1
_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/4] um: virtio_uml: move device breaking into workqueue
2023-02-09 9:00 [PATCH 1/4] um: virtio_uml: free command if adding to virtqueue failed benjamin
2023-02-09 9:00 ` [PATCH 2/4] um: virtio_uml: mark device as unregistered when breaking it benjamin
@ 2023-02-09 9:00 ` benjamin
2023-02-09 9:00 ` [PATCH 4/4] um: virt-pci: properly remove PCI device from bus benjamin
2 siblings, 0 replies; 4+ messages in thread
From: benjamin @ 2023-02-09 9:00 UTC (permalink / raw)
To: linux-um; +Cc: Benjamin Berg
From: Benjamin Berg <benjamin.berg@intel.com>
We should not be calling virtio_break_device from an IRQ context.
Move breaking the device into the workqueue so that it is done from
a reasonable context.
Change-Id: I4f5f075d7f40ed050c08a7435c1cf45e2387022c
Fixes: af9fb41ed315 ("um: virtio_uml: Fix broken device handling in time-travel")
Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
---
arch/um/drivers/virtio_uml.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
index dcfd0ca534ee..ddd080f6dd82 100644
--- a/arch/um/drivers/virtio_uml.c
+++ b/arch/um/drivers/virtio_uml.c
@@ -170,7 +170,6 @@ static void vhost_user_check_reset(struct virtio_uml_device *vu_dev,
vu_dev->registered = 0;
- virtio_break_device(&vu_dev->vdev);
schedule_work(&pdata->conn_broken_wk);
}
@@ -1138,6 +1137,15 @@ void virtio_uml_set_no_vq_suspend(struct virtio_device *vdev,
static void vu_of_conn_broken(struct work_struct *wk)
{
+ struct virtio_uml_platform_data *pdata;
+ struct virtio_uml_device *vu_dev;
+
+ pdata = container_of(wk, struct virtio_uml_platform_data, conn_broken_wk);
+
+ vu_dev = platform_get_drvdata(pdata->pdev);
+
+ virtio_break_device(&vu_dev->vdev);
+
/*
* We can't remove the device from the devicetree so the only thing we
* can do is warn.
@@ -1268,8 +1276,14 @@ static int vu_unregister_cmdline_device(struct device *dev, void *data)
static void vu_conn_broken(struct work_struct *wk)
{
struct virtio_uml_platform_data *pdata;
+ struct virtio_uml_device *vu_dev;
pdata = container_of(wk, struct virtio_uml_platform_data, conn_broken_wk);
+
+ vu_dev = platform_get_drvdata(pdata->pdev);
+
+ virtio_break_device(&vu_dev->vdev);
+
vu_unregister_cmdline_device(&pdata->pdev->dev, NULL);
}
--
2.39.1
_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 4/4] um: virt-pci: properly remove PCI device from bus
2023-02-09 9:00 [PATCH 1/4] um: virtio_uml: free command if adding to virtqueue failed benjamin
2023-02-09 9:00 ` [PATCH 2/4] um: virtio_uml: mark device as unregistered when breaking it benjamin
2023-02-09 9:00 ` [PATCH 3/4] um: virtio_uml: move device breaking into workqueue benjamin
@ 2023-02-09 9:00 ` benjamin
2 siblings, 0 replies; 4+ messages in thread
From: benjamin @ 2023-02-09 9:00 UTC (permalink / raw)
To: linux-um; +Cc: Benjamin Berg
From: Benjamin Berg <benjamin.berg@intel.com>
Triggering a bus rescan will not cause the PCI device to be removed. It
is required to explicitly stop and remove the device from the bus.
Change-Id: Ie51a08cde45e829fd68fe7d7ebaa0bd9e1c06c6e
Fixes: 68f5d3f3b654 ("um: add PCI over virtio emulation driver")
Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
---
arch/um/drivers/virt-pci.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
index 3b637ad75ec8..5472b1a0a039 100644
--- a/arch/um/drivers/virt-pci.c
+++ b/arch/um/drivers/virt-pci.c
@@ -626,22 +626,33 @@ static void um_pci_virtio_remove(struct virtio_device *vdev)
struct um_pci_device *dev = vdev->priv;
int i;
- /* Stop all virtqueues */
- virtio_reset_device(vdev);
- vdev->config->del_vqs(vdev);
-
device_set_wakeup_enable(&vdev->dev, false);
mutex_lock(&um_pci_mtx);
for (i = 0; i < MAX_DEVICES; i++) {
if (um_pci_devices[i].dev != dev)
continue;
+
um_pci_devices[i].dev = NULL;
irq_free_desc(dev->irq);
+
+ break;
}
mutex_unlock(&um_pci_mtx);
- um_pci_rescan();
+ if (i < MAX_DEVICES) {
+ struct pci_dev *pci_dev;
+
+ pci_dev = pci_get_slot(bridge->bus, i);
+ if (pci_dev)
+ pci_stop_and_remove_bus_device_locked(pci_dev);
+ }
+
+ /* Stop all virtqueues */
+ virtio_reset_device(vdev);
+ dev->cmd_vq = NULL;
+ dev->irq_vq = NULL;
+ vdev->config->del_vqs(vdev);
kfree(dev);
}
--
2.39.1
_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-02-09 9:00 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-09 9:00 [PATCH 1/4] um: virtio_uml: free command if adding to virtqueue failed benjamin
2023-02-09 9:00 ` [PATCH 2/4] um: virtio_uml: mark device as unregistered when breaking it benjamin
2023-02-09 9:00 ` [PATCH 3/4] um: virtio_uml: move device breaking into workqueue benjamin
2023-02-09 9:00 ` [PATCH 4/4] um: virt-pci: properly remove PCI device from bus benjamin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).