diff options
-rw-r--r-- | queue-5.10/pci-hv-do-not-set-pci_command_memory-to-reduce-vm-boot-time.patch | 63 | ||||
-rw-r--r-- | queue-5.10/series | 1 |
2 files changed, 64 insertions, 0 deletions
diff --git a/queue-5.10/pci-hv-do-not-set-pci_command_memory-to-reduce-vm-boot-time.patch b/queue-5.10/pci-hv-do-not-set-pci_command_memory-to-reduce-vm-boot-time.patch new file mode 100644 index 0000000000..0f88e15521 --- /dev/null +++ b/queue-5.10/pci-hv-do-not-set-pci_command_memory-to-reduce-vm-boot-time.patch @@ -0,0 +1,63 @@ +From 23e118a48acf7be223e57d98e98da8ac5a4071ac Mon Sep 17 00:00:00 2001 +From: Dexuan Cui <decui@microsoft.com> +Date: Mon, 2 May 2022 00:42:55 -0700 +Subject: PCI: hv: Do not set PCI_COMMAND_MEMORY to reduce VM boot time + +From: Dexuan Cui <decui@microsoft.com> + +commit 23e118a48acf7be223e57d98e98da8ac5a4071ac upstream. + +Currently when the pci-hyperv driver finishes probing and initializing the +PCI device, it sets the PCI_COMMAND_MEMORY bit; later when the PCI device +is registered to the core PCI subsystem, the core PCI driver's BAR detection +and initialization code toggles the bit multiple times, and each toggling of +the bit causes the hypervisor to unmap/map the virtual BARs from/to the +physical BARs, which can be slow if the BAR sizes are huge, e.g., a Linux VM +with 14 GPU devices has to spend more than 3 minutes on BAR detection and +initialization, causing a long boot time. + +Reduce the boot time by not setting the PCI_COMMAND_MEMORY bit when we +register the PCI device (there is no need to have it set in the first place). +The bit stays off till the PCI device driver calls pci_enable_device(). +With this change, the boot time of such a 14-GPU VM is reduced by almost +3 minutes. + +Link: https://lore.kernel.org/lkml/20220419220007.26550-1-decui@microsoft.com/ +Tested-by: Boqun Feng (Microsoft) <boqun.feng@gmail.com> +Signed-off-by: Dexuan Cui <decui@microsoft.com> +Reviewed-by: Michael Kelley <mikelley@microsoft.com> +Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> +Cc: Jake Oshins <jakeo@microsoft.com> +Link: https://lore.kernel.org/r/20220502074255.16901-1-decui@microsoft.com +Signed-off-by: Wei Liu <wei.liu@kernel.org> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + drivers/pci/controller/pci-hyperv.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +--- a/drivers/pci/controller/pci-hyperv.c ++++ b/drivers/pci/controller/pci-hyperv.c +@@ -1820,12 +1820,17 @@ static void prepopulate_bars(struct hv_p + } + } + if (high_size <= 1 && low_size <= 1) { +- /* Set the memory enable bit. */ +- _hv_pcifront_read_config(hpdev, PCI_COMMAND, 2, +- &command); +- command |= PCI_COMMAND_MEMORY; +- _hv_pcifront_write_config(hpdev, PCI_COMMAND, 2, +- command); ++ /* ++ * No need to set the PCI_COMMAND_MEMORY bit as ++ * the core PCI driver doesn't require the bit ++ * to be pre-set. Actually here we intentionally ++ * keep the bit off so that the PCI BAR probing ++ * in the core PCI driver doesn't cause Hyper-V ++ * to unnecessarily unmap/map the virtual BARs ++ * from/to the physical BARs multiple times. ++ * This reduces the VM boot time significantly ++ * if the BAR sizes are huge. ++ */ + break; + } + } diff --git a/queue-5.10/series b/queue-5.10/series index 3f493b07ab..e71ebc9320 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -74,3 +74,4 @@ drm-bridge-cdns-dsi-fix-the-clock-variable-for-mode_valid.patch drm-bridge-cdns-dsi-fix-connecting-to-next-bridge.patch drm-bridge-cdns-dsi-check-return-value-when-getting-default-phy-config.patch drm-bridge-cdns-dsi-wait-for-clk-and-data-lanes-to-be-ready.patch +pci-hv-do-not-set-pci_command_memory-to-reduce-vm-boot-time.patch |