Thread (22 messages) flat view 22 messages, 3 authors, 2021-03-02

Re: [PATCH] mm, kasan: don't poison boot memory

From: Mike Rapoport <hidden>
Date: 2021-02-25 14:58:48
Also in: linux-mm, lkml

Possibly related (same subject, not in this thread)

On Thu, Feb 25, 2021 at 07:38:19AM -0500, George Kennedy wrote:
On 2/25/2021 3:53 AM, Mike Rapoport wrote:
quoted
Hi George,
quoted
On 2/24/2021 5:37 AM, Mike Rapoport wrote:
quoted
On Tue, Feb 23, 2021 at 04:46:28PM -0500, George Kennedy wrote:
quoted
Mike,

Still no luck.

[   30.193723] iscsi: registered transport (iser)
[   30.195970] iBFT detected.
[   30.196571] BUG: unable to handle page fault for address: ffffffffff240004
Hmm, we cannot set ibft_addr to early pointer to the ACPI table.
Let's try something more disruptive and move the reservation back to
iscsi_ibft_find.c.
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 7bdc0239a943..c118dd54a747 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -1551,6 +1551,7 @@ void __init acpi_boot_table_init(void)
   	if (acpi_disabled)
   		return;
+#if 0
   	/*
   	 * Initialize the ACPI boot-time table parser.
   	 */
@@ -1558,6 +1559,7 @@ void __init acpi_boot_table_init(void)
   		disable_acpi();
   		return;
   	}
+#endif
   	acpi_table_parse(ACPI_SIG_BOOT, acpi_parse_sbf);
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index d883176ef2ce..c615ce96c9a2 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -570,16 +570,6 @@ void __init reserve_standard_io_resources(void)
   }
-static __init void reserve_ibft_region(void)
-{
-	unsigned long addr, size = 0;
-
-	addr = find_ibft_region(&size);
-
-	if (size)
-		memblock_reserve(addr, size);
-}
-
   static bool __init snb_gfx_workaround_needed(void)
   {
   #ifdef CONFIG_PCI
@@ -1032,6 +1022,12 @@ void __init setup_arch(char **cmdline_p)
   	 */
   	find_smp_config();
+	/*
+	 * Initialize the ACPI boot-time table parser.
+	 */
+	if (acpi_table_init())
+		disable_acpi();
+
   	reserve_ibft_region();
   	early_alloc_pgt_buf();
diff --git a/drivers/firmware/iscsi_ibft_find.c b/drivers/firmware/iscsi_ibft_find.c
index 64bb94523281..01be513843d6 100644
--- a/drivers/firmware/iscsi_ibft_find.c
+++ b/drivers/firmware/iscsi_ibft_find.c
@@ -47,7 +47,25 @@ static const struct {
   #define VGA_MEM 0xA0000 /* VGA buffer */
   #define VGA_SIZE 0x20000 /* 128kB */
-static int __init find_ibft_in_mem(void)
+static void __init *acpi_find_ibft_region(void)
+{
+	int i;
+	struct acpi_table_header *table = NULL;
+	acpi_status status;
+
+	if (acpi_disabled)
+		return NULL;
+
+	for (i = 0; i < ARRAY_SIZE(ibft_signs) && !ibft_addr; i++) {
+		status = acpi_get_table(ibft_signs[i].sign, 0, &table);
+		if (ACPI_SUCCESS(status))
+			return table;
+	}
+
+	return NULL;
+}
+
+static void __init *find_ibft_in_mem(void)
   {
   	unsigned long pos;
   	unsigned int len = 0;
@@ -70,35 +88,44 @@ static int __init find_ibft_in_mem(void)
   				/* if the length of the table extends past 1M,
   				 * the table cannot be valid. */
   				if (pos + len <= (IBFT_END-1)) {
-					ibft_addr = (struct acpi_table_ibft *)virt;
   					pr_info("iBFT found at 0x%lx.\n", pos);
-					goto done;
+					return virt;
   				}
   			}
   		}
   	}
-done:
-	return len;
+
+	return NULL;
   }
+
+static void __init *find_ibft(void)
+{
+	/* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will
+	 * only use ACPI for this */
+	if (!efi_enabled(EFI_BOOT))
+		return find_ibft_in_mem();
+	else
+		return acpi_find_ibft_region();
+}
+
   /*
    * Routine used to find the iSCSI Boot Format Table. The logical
    * kernel address is set in the ibft_addr global variable.
    */
-unsigned long __init find_ibft_region(unsigned long *sizep)
+void __init reserve_ibft_region(void)
   {
-	ibft_addr = NULL;
+	struct acpi_table_ibft *table;
+	unsigned long size;
-	/* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will
-	 * only use ACPI for this */
+	table = find_ibft();
+	if (!table)
+		return;
-	if (!efi_enabled(EFI_BOOT))
-		find_ibft_in_mem();
-
-	if (ibft_addr) {
-		*sizep = PAGE_ALIGN(ibft_addr->header.length);
-		return (u64)virt_to_phys(ibft_addr);
-	}
+	size = PAGE_ALIGN(table->header.length);
+	memblock_reserve(virt_to_phys(table), size);
-	*sizep = 0;
-	return 0;
+	if (efi_enabled(EFI_BOOT))
+		acpi_put_table(&table->header);
+	else
+		ibft_addr = table;
   }
diff --git a/include/linux/iscsi_ibft.h b/include/linux/iscsi_ibft.h
index b7b45ca82bea..da813c891990 100644
--- a/include/linux/iscsi_ibft.h
+++ b/include/linux/iscsi_ibft.h
@@ -26,13 +26,9 @@ extern struct acpi_table_ibft *ibft_addr;
    * mapped address is set in the ibft_addr variable.
    */
   #ifdef CONFIG_ISCSI_IBFT_FIND
-unsigned long find_ibft_region(unsigned long *sizep);
+void reserve_ibft_region(void);
   #else
-static inline unsigned long find_ibft_region(unsigned long *sizep)
-{
-	*sizep = 0;
-	return 0;
-}
+static inline void reserve_ibft_region(void) {}
   #endif
   #endif /* ISCSI_IBFT_H */
Still no luck Mike,

We're back to the original problem where the only thing that worked was to
run "SetPageReserved(page)" before calling "kmap(page)". The page is being
"freed" before ibft_init() is called as a result of the recent buddy page
freeing changes.
I keep missing some little details each time :(
No worries. Thanks for all your help. Does this patch go on top of your
previous patch or is it standalone?
This is standalone.
 
George
quoted
Ok, let's try from the different angle.
diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c
index 4b9b329a5a92..ec43e1447336 100644
--- a/drivers/acpi/acpica/tbutils.c
+++ b/drivers/acpi/acpica/tbutils.c
@@ -7,6 +7,8 @@
   *
   *****************************************************************************/
+#include <linux/memblock.h>
+
  #include <acpi/acpi.h>
  #include "accommon.h"
  #include "actables.h"
@@ -339,6 +341,21 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
  			acpi_tb_parse_fadt();
  		}
+		if (ACPI_SUCCESS(status) &&
+		    ACPI_COMPARE_NAMESEG(&acpi_gbl_root_table_list.
+					 tables[table_index].signature,
+					 ACPI_SIG_IBFT)) {
+			struct acpi_table_header *ibft;
+			struct acpi_table_desc *desc;
+
+			desc = &acpi_gbl_root_table_list.tables[table_index];
+			status = acpi_tb_get_table(desc, &ibft);
+			if (ACPI_SUCCESS(status)) {
+				memblock_reserve(address, ibft->length);
+				acpi_tb_put_table(desc);
+			}
+		}
+
  next_table:
  		table_entry += table_entry_size;
-- 
Sincerely yours,
Mike.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help