Patch "x86/hyperv: Fix the detection of E820_TYPE_PRAM in a Gen2 VM" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    x86/hyperv: Fix the detection of E820_TYPE_PRAM in a Gen2 VM

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     x86-hyperv-fix-the-detection-of-e820_type_pram-in-a-.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 2baa1210f74e30e0ceefc0ed695e3f426fb6b2ed
Author: Saurabh Sengar <ssengar@xxxxxxxxxxxxxxxxxxx>
Date:   Sat Nov 11 00:37:47 2023 -0800

    x86/hyperv: Fix the detection of E820_TYPE_PRAM in a Gen2 VM
    
    [ Upstream commit 7e8037b099c0bbe8f2109dc452dbcab8d400fc53 ]
    
    A Gen2 VM doesn't support legacy PCI/PCIe, so both raw_pci_ops and
    raw_pci_ext_ops are NULL, and pci_subsys_init() -> pcibios_init()
    doesn't call pcibios_resource_survey() -> e820__reserve_resources_late();
    as a result, any emulated persistent memory of E820_TYPE_PRAM (12) via
    the kernel parameter memmap=nn[KMG]!ss is not added into iomem_resource
    and hence can't be detected by register_e820_pmem().
    
    Fix this by directly calling e820__reserve_resources_late() in
    hv_pci_init(), which is called from arch_initcall(pci_arch_init).
    
    It's ok to move a Gen2 VM's e820__reserve_resources_late() from
    subsys_initcall(pci_subsys_init) to arch_initcall(pci_arch_init) because
    the code in-between doesn't depend on the E820 resources.
    e820__reserve_resources_late() depends on e820__reserve_resources(),
    which has been called earlier from setup_arch().
    
    For a Gen-2 VM, the new hv_pci_init() also adds any memory of
    E820_TYPE_PMEM (7) into iomem_resource, and acpi_nfit_register_region() ->
    acpi_nfit_insert_resource() -> region_intersects() returns
    REGION_INTERSECTS, so the memory of E820_TYPE_PMEM won't get added twice.
    
    Changed the local variable "int gen2vm" to "bool gen2vm".
    
    Signed-off-by: Saurabh Sengar <ssengar@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Dexuan Cui <decui@xxxxxxxxxxxxx>
    Signed-off-by: Wei Liu <wei.liu@xxxxxxxxxx>
    Message-ID: <1699691867-9827-1-git-send-email-ssengar@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index 21556ad87f4ba..8f3a4d16bb791 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -15,6 +15,7 @@
 #include <linux/io.h>
 #include <asm/apic.h>
 #include <asm/desc.h>
+#include <asm/e820/api.h>
 #include <asm/sev.h>
 #include <asm/ibt.h>
 #include <asm/hypervisor.h>
@@ -286,15 +287,31 @@ static int hv_cpu_die(unsigned int cpu)
 
 static int __init hv_pci_init(void)
 {
-	int gen2vm = efi_enabled(EFI_BOOT);
+	bool gen2vm = efi_enabled(EFI_BOOT);
 
 	/*
-	 * For Generation-2 VM, we exit from pci_arch_init() by returning 0.
-	 * The purpose is to suppress the harmless warning:
+	 * A Generation-2 VM doesn't support legacy PCI/PCIe, so both
+	 * raw_pci_ops and raw_pci_ext_ops are NULL, and pci_subsys_init() ->
+	 * pcibios_init() doesn't call pcibios_resource_survey() ->
+	 * e820__reserve_resources_late(); as a result, any emulated persistent
+	 * memory of E820_TYPE_PRAM (12) via the kernel parameter
+	 * memmap=nn[KMG]!ss is not added into iomem_resource and hence can't be
+	 * detected by register_e820_pmem(). Fix this by directly calling
+	 * e820__reserve_resources_late() here: e820__reserve_resources_late()
+	 * depends on e820__reserve_resources(), which has been called earlier
+	 * from setup_arch(). Note: e820__reserve_resources_late() also adds
+	 * any memory of E820_TYPE_PMEM (7) into iomem_resource, and
+	 * acpi_nfit_register_region() -> acpi_nfit_insert_resource() ->
+	 * region_intersects() returns REGION_INTERSECTS, so the memory of
+	 * E820_TYPE_PMEM won't get added twice.
+	 *
+	 * We return 0 here so that pci_arch_init() won't print the warning:
 	 * "PCI: Fatal: No config space access function found"
 	 */
-	if (gen2vm)
+	if (gen2vm) {
+		e820__reserve_resources_late();
 		return 0;
+	}
 
 	/* For Generation-1 VM, we'll proceed in pci_arch_init().  */
 	return 1;




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux