FAILED: patch "[PATCH] PCI: hv: Add pci_destroy_slot() in" failed to apply to 4.14-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 340d455699400f2c2c0f9b3f703ade3085cdb501 Mon Sep 17 00:00:00 2001
From: Dexuan Cui <[email protected]>
Date: Mon, 4 Mar 2019 21:34:49 +0000
Subject: [PATCH] PCI: hv: Add pci_destroy_slot() in
pci_devices_present_work(), if necessary
When we hot-remove a device, usually the host sends us a PCI_EJECT message, and a PCI_BUS_RELATIONS message with bus_rel->device_count == 0.
When we execute the quick hot-add/hot-remove test, the host may not send us the PCI_EJECT message if the guest has not fully finished the initialization by sending the PCI_RESOURCES_ASSIGNED* message to the host, so it's potentially unsafe to only depend on the pci_destroy_slot() in hv_eject_device_work() because the code path
create_root_hv_pci_bus()
-> hv_pci_assign_slots()
is not called in this case. Note: in this case, the host still sends the guest a PCI_BUS_RELATIONS message with bus_rel->device_count == 0.
In the quick hot-add/hot-remove test, we can have such a race before the code path
pci_devices_present_work()
-> new_pcichild_device()
adds the new device into the hbus->children list, we may have already received the PCI_EJECT message, and since the tasklet handler
hv_pci_onchannelcallback()
may fail to find the "hpdev" by calling
get_pcichild_wslot(hbus, dev_message->wslot.slot)
hv_pci_eject_device() is not called; Later, by continuing execution
create_root_hv_pci_bus()
-> hv_pci_assign_slots()
creates the slot and the PCI_BUS_RELATIONS message with bus_rel->device_count == 0 removes the device from hbus->children, and we end up being unable to remove the slot in
hv_pci_remove()
-> hv_pci_remove_slots()
Remove the slot in pci_devices_present_work() when the device is removed to address this race.
pci_devices_present_work() and hv_eject_device_work() run in the singled-threaded hbus->wq, so there is not a double-remove issue for the slot.
We cannot offload hv_pci_eject_device() from hv_pci_onchannelcallback() to the workqueue, because we need the hv_pci_onchannelcallback() synchronously call hv_pci_eject_device() to poll the channel ringbuffer to work around the "hangs in hv_compose_msi_msg()" issue fixed in commit de0aa7b2f97d ("PCI: hv: Fix 2 hang issues in hv_compose_msi_msg()")
drivers/pci/controller/pci-hyperv.c +4 -0
@@ -1776,6 +1776,10 @@ static void pci_devices_present_work(struct work_struct *work) hpdev = list_first_entry(&removed, struct hv_pci_dev, list_entry);list_del (&hpdev->list_entry); + +if (hpdev->pci_slot) +pci_destroy_slot (hpdev->pci_slot); +put_pcichild (hpdev); }
Dexuan Cui
maintainerQuoted 99 lines
From: [email protected] <[email protected]>
Sent: Wednesday, May 15, 2019 1:36 AM
To: Dexuan Cui <[email protected]>; [email protected]; Michael Kelley <[email protected]>; [email protected]
Cc: [email protected]
Subject: FAILED: patch "[PATCH] PCI: hv: Addpci_destroy_slot()in" failed to apply to 4.14-stable treeThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From
340d455699400f2c2c0f9b3f703ade3085cdb501Mon Sep 17 00:00:00 2001
From: Dexuan Cui <[email protected]>
Date: Mon, 4 Mar 2019 21:34:49 +0000
Subject: [PATCH] PCI: hv: Addpci_destroy_slot()in
pci_devices_present_work(), if necessaryWhen we hot-remove a device, usually the host sends us a
PCI_EJECTmessage, and aPCI_BUS_RELATIONSmessage withbus_rel->device_count== 0.When we execute the quick hot-add/hot-remove test, the host may not send us the
PCI_EJECTmessage if the guest has not fully finished the initialization by sending the PCI_RESOURCES_ASSIGNED* message to the host, so it's potentially unsafe to only depend on thepci_destroy_slot()inhv_eject_device_work()because the code path
create_root_hv_pci_bus()
->hv_pci_assign_slots()is not called in this case. Note: in this case, the host still sends the guest a
PCI_BUS_RELATIONSmessage withbus_rel->device_count== 0.In the quick hot-add/hot-remove test, we can have such a race before the code path
pci_devices_present_work()
->new_pcichild_device()adds the new device into the
hbus->childrenlist, we may have already received thePCI_EJECTmessage, and since the tasklet handler
hv_pci_onchannelcallback()may fail to find the "hpdev" by calling
get_pcichild_wslot(hbus, dev_message->wslot.slot)
hv_pci_eject_device()is not called; Later, by continuing execution
create_root_hv_pci_bus()
->hv_pci_assign_slots()creates the slot and the
PCI_BUS_RELATIONSmessage withbus_rel->device_count== 0 removes the device fromhbus->children, and we end up being unable to remove the slot in
hv_pci_remove()
->hv_pci_remove_slots()Remove the slot in
pci_devices_present_work()when the device is removed to address this race.
pci_devices_present_work()andhv_eject_device_work()run in the singled-threadedhbus->wq, so there is not a double-remove issue for the slot.We cannot offload
hv_pci_eject_device()fromhv_pci_onchannelcallback()to the workqueue, because we need thehv_pci_onchannelcallback()synchronously callhv_pci_eject_device()to poll the channel ringbuffer to work around the "hangs inhv_compose_msi_msg()" issue fixed in commitde0aa7b2f97d("PCI: hv: Fix 2 hang issues inhv_compose_msi_msg()")Fixes a15f2c08c708 ("PCI: hv: support reporting serial number as slotinformation")
Signed-off-by Dexuan Cui <[email protected]>[[email protected]: rewritten commit log]Signed-off-by Lorenzo Pieralisi <[email protected]>Reviewed-by Stephen Hemminger <[email protected]>Reviewed-by Michael Kelley <[email protected]>drivers/pci/controller/pci-hyperv.c +0
-0
drivers/pci/controller/pci-hyperv.c static void pci_devices_present_work(struct · line 1785
Quoted 10 lines
drivers/pci/controller/pci-hyperv.c +4
-0@@ -1776,6 +1776,10 @@ static void pci_devices_present_work(struct work_struct *work) hpdev = list_first_entry(&removed, struct hv_pci_dev, list_entry);list_del (&hpdev->list_entry); + +if (hpdev->pci_slot) +pci_destroy_slot (hpdev->pci_slot); +put_pcichild (hpdev); }
Hi,
I backported the patch for linux-4.14.y.
Please use the attached patch, which is [PATCH 3/3]
Thanks,
-- Dexuan
From dec391546607e00c3c8d7d72ead9ff7f5966a932 Mon Sep 17 00:00:00 2001
From: Dexuan Cui <[email protected]>
Date: Wed, 15 May 2019 16:06:22 -0700
Subject: [PATCH for v4.14.119 3/3] PCI: hv: Add pci_destroy_slot() in
pci_devices_present_work(), if necessary
This patch is backported for v4.14.119 from the mainline340d45569940 ("PCI: hv: Add pci_destroy_slot() in pci_devices_present_work(), if necessary")
--- drivers/pci/host/pci-hyperv.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/pci/host/pci-hyperv.c +4 -0
@@ -1824,6 +1824,10 @@ static void pci_devices_present_work(struct work_struct *work) hpdev = list_first_entry(&removed, struct hv_pci_dev, list_entry);list_del (&hpdev->list_entry); + +if (hpdev->pci_slot) +pci_destroy_slot (hpdev->pci_slot); +put_pcichild (hpdev, hv_pcidev_ref_initial); }
Signature · 1 line
2.17.1
Quoted 113 lines · Dexuan Cui
Quoted 99 lines
From: [email protected] <[email protected]>
Sent: Wednesday, May 15, 2019 1:36 AM
To: Dexuan Cui <[email protected]>; [email protected]; Michael Kelley <[email protected]>; [email protected]
Cc: [email protected]
Subject: FAILED: patch "[PATCH] PCI: hv: Addpci_destroy_slot()in" failed to apply to 4.14-stable treeThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From
340d455699400f2c2c0f9b3f703ade3085cdb501Mon Sep 17 00:00:00 2001
From: Dexuan Cui <[email protected]>
Date: Mon, 4 Mar 2019 21:34:49 +0000
Subject: [PATCH] PCI: hv: Addpci_destroy_slot()in
pci_devices_present_work(), if necessaryWhen we hot-remove a device, usually the host sends us a
PCI_EJECTmessage, and aPCI_BUS_RELATIONSmessage withbus_rel->device_count== 0.When we execute the quick hot-add/hot-remove test, the host may not send us the
PCI_EJECTmessage if the guest has not fully finished the initialization by sending the PCI_RESOURCES_ASSIGNED* message to the host, so it's potentially unsafe to only depend on thepci_destroy_slot()inhv_eject_device_work()because the code path
create_root_hv_pci_bus()
->hv_pci_assign_slots()is not called in this case. Note: in this case, the host still sends the guest a
PCI_BUS_RELATIONSmessage withbus_rel->device_count== 0.In the quick hot-add/hot-remove test, we can have such a race before the code path
pci_devices_present_work()
->new_pcichild_device()adds the new device into the
hbus->childrenlist, we may have already received thePCI_EJECTmessage, and since the tasklet handler
hv_pci_onchannelcallback()may fail to find the "hpdev" by calling
get_pcichild_wslot(hbus, dev_message->wslot.slot)
hv_pci_eject_device()is not called; Later, by continuing execution
create_root_hv_pci_bus()
->hv_pci_assign_slots()creates the slot and the
PCI_BUS_RELATIONSmessage withbus_rel->device_count== 0 removes the device fromhbus->children, and we end up being unable to remove the slot in
hv_pci_remove()
->hv_pci_remove_slots()Remove the slot in
pci_devices_present_work()when the device is removed to address this race.
pci_devices_present_work()andhv_eject_device_work()run in the singled-threadedhbus->wq, so there is not a double-remove issue for the slot.We cannot offload
hv_pci_eject_device()fromhv_pci_onchannelcallback()to the workqueue, because we need thehv_pci_onchannelcallback()synchronously callhv_pci_eject_device()to poll the channel ringbuffer to work around the "hangs inhv_compose_msi_msg()" issue fixed in commitde0aa7b2f97d("PCI: hv: Fix 2 hang issues inhv_compose_msi_msg()")Fixes a15f2c08c708 ("PCI: hv: support reporting serial number as slotinformation")
Signed-off-by Dexuan Cui <[email protected]>[[email protected]: rewritten commit log]Signed-off-by Lorenzo Pieralisi <[email protected]>Reviewed-by Stephen Hemminger <[email protected]>Reviewed-by Michael Kelley <[email protected]>drivers/pci/controller/pci-hyperv.c +0
-0drivers/pci/controller/pci-hyperv.c static void pci_devices_present_work(struct · line 1785
Quoted 10 lines
drivers/pci/controller/pci-hyperv.c +4
-0@@ -1776,6 +1776,10 @@ static void pci_devices_present_work(struct work_struct *work) hpdev = list_first_entry(&removed, struct hv_pci_dev, list_entry);list_del (&hpdev->list_entry); + +if (hpdev->pci_slot) +pci_destroy_slot (hpdev->pci_slot); +put_pcichild (hpdev); }Hi,
I backported the patch for linux-4.14.y.
Quoted 4 lines
Please use the attached patch, which is [PATCH 3/3]
Thanks,
-- Dexuan
Queued for 4.14, thank you.
--
Thanks,
Sasha