|
|
@@ -6135,8 +6135,7 @@ static int __init pci_setup(char *str)
|
|
|
} else if (!strncmp(str, "pcie_scan_all", 13)) {
|
|
|
pci_add_flags(PCI_SCAN_ALL_PCIE_DEVS);
|
|
|
} else if (!strncmp(str, "disable_acs_redir=", 18)) {
|
|
|
- disable_acs_redir_param =
|
|
|
- kstrdup(str + 18, GFP_KERNEL);
|
|
|
+ disable_acs_redir_param = str + 18;
|
|
|
} else {
|
|
|
printk(KERN_ERR "PCI: Unknown option `%s'\n",
|
|
|
str);
|
|
|
@@ -6147,3 +6146,19 @@ static int __init pci_setup(char *str)
|
|
|
return 0;
|
|
|
}
|
|
|
early_param("pci", pci_setup);
|
|
|
+
|
|
|
+/*
|
|
|
+ * 'disable_acs_redir_param' is initialized in pci_setup(), above, to point
|
|
|
+ * to data in the __initdata section which will be freed after the init
|
|
|
+ * sequence is complete. We can't allocate memory in pci_setup() because some
|
|
|
+ * architectures do not have any memory allocation service available during
|
|
|
+ * an early_param() call. So we allocate memory and copy the variable here
|
|
|
+ * before the init section is freed.
|
|
|
+ */
|
|
|
+static int __init pci_realloc_setup_params(void)
|
|
|
+{
|
|
|
+ disable_acs_redir_param = kstrdup(disable_acs_redir_param, GFP_KERNEL);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+pure_initcall(pci_realloc_setup_params);
|