Skip to contentSkip to conversation

FAILED: patch "[PATCH] PCI: hv: Add pci_destroy_slot() in" failed to apply to 4.14-stable tree

PATCH Applied [email protected] 3 participants 3 messages May 15, 2019 – May 17, 2019

Subsystems (4)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

The 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()")

Fixes a15f2c08c708 ("PCI: hv: support reporting serial number as slot information")
[[email protected]: rewritten commit log]
drivers/pci/controller/pci-hyperv.c +4 -0
index b489412e3502..82acd6155adf 100644
@@ -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);
 	}
 
maintainer
#1 lore raw
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: Add pci_destroy_slot() in" failed to apply to 4.14-stable tree

The 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()")

Fixes a15f2c08c708 ("PCI: hv: support reporting serial number as slot

information")

drivers/pci/controller/pci-hyperv.c +0 -0
index b489412e3502..82acd6155adf 100644

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 mainline
340d45569940 ("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
index a5825bbcded7..f591de23f3d3 100644
@@ -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
maintainer Applied
#2 lore raw
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: Add pci_destroy_slot() in" failed to apply to 4.14-stable tree

The 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()")

Fixes a15f2c08c708 ("PCI: hv: support reporting serial number as slot

information")

drivers/pci/controller/pci-hyperv.c +0 -0
index b489412e3502..82acd6155adf 100644

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.

Quoted 4 lines

Please use the attached patch, which is [PATCH 3/3]

Thanks,
-- Dexuan

Queued for 4.14, thank you.

--
Thanks,
Sasha