All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/3] x86/ioremap: clean up the mess in xxx_is_setup_data
@ 2024-11-23 11:42 Baoquan He
  2024-11-23 11:42 ` [PATCH v3 1/3] x86/ioremap: introduce helper to implement xxx_is_setup_data() Baoquan He
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Baoquan He @ 2024-11-23 11:42 UTC (permalink / raw)
  To: mingo, thomas.lendacky, bp, linux-kernel; +Cc: x86, Baoquan He

Functions memremap_is_setup_data() and early_memremap_is_setup_data()
share completely the same process and handling, except of the
different memremap/unmap invocations. The code can be extracted and put
into a helper function __memremap_is_setup_data().

And parameter 'size' is unused in implementation of memremap_is_efi_data(),
memremap_is_setup_data and early_memremap_is_setup_data().

This patchset is made to clean them up. 

v2->v3:
- Add back __init to early_memremap_is_setup_data(). Tom pointed out
  this.
- Split out the defining and usage of SD_SIZE and put them in patch 2.
  Suggested by Ingo.

v1->v2:
- Remove __init from helper __memremap_is_setup_data(), add __ref to
  helper suppress mismatch section warning.
- Merge the old patch 1 and 2 into one patch.
  - Both are suggested by Tom during reviewing. Thanks to him.

Baoquan He (3):
  x86/ioremap: introduce helper to implement xxx_is_setup_data()
  x86/ioremap: Clean up size calculations in xxx_is_setup_data()
  x86/mm: clean up unused parameters of functions

 arch/x86/mm/ioremap.c | 117 +++++++++++++++---------------------------
 1 file changed, 41 insertions(+), 76 deletions(-)

-- 
2.41.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v3 1/3] x86/ioremap: introduce helper to implement xxx_is_setup_data()
  2024-11-23 11:42 [PATCH v3 0/3] x86/ioremap: clean up the mess in xxx_is_setup_data Baoquan He
@ 2024-11-23 11:42 ` Baoquan He
  2024-12-07 16:04   ` Borislav Petkov
  2024-12-08 10:39   ` [tip: x86/cleanups] x86/ioremap: Simplify setup_data mapping variants tip-bot2 for Baoquan He
  2024-11-23 11:42 ` [PATCH v3 2/3] x86/ioremap: Clean up size calculations in xxx_is_setup_data() Baoquan He
  2024-11-23 11:42 ` [PATCH v3 3/3] x86/mm: clean up unused parameters of functions Baoquan He
  2 siblings, 2 replies; 8+ messages in thread
From: Baoquan He @ 2024-11-23 11:42 UTC (permalink / raw)
  To: mingo, thomas.lendacky, bp, linux-kernel; +Cc: x86, Baoquan He

Functions memremap_is_setup_data() and early_memremap_is_setup_data()
share completely the same process and handling, except of the
different memremap/unmap invocations.

So add helper __memremap_is_setup_data() to extract the common part,
parameter 'early' is used to decide what kind of memremap/unmap
APIs are called. This simplifies codes a lot by removing the duplicated
codes, and also removes the similar code comment above them.

And '__ref' is added to __memremap_is_setup_data() to suppress below
section mismatch warning:

ARNING: modpost: vmlinux: section mismatch in reference: __memremap_is_setup_data+0x5f (section: .text) ->
early_memunmap (section: .init.text)

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 arch/x86/mm/ioremap.c | 104 ++++++++++++++----------------------------
 1 file changed, 35 insertions(+), 69 deletions(-)

diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index 8d29163568a7..aaf40a712b04 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -632,8 +632,8 @@ static bool memremap_is_efi_data(resource_size_t phys_addr,
  * Examine the physical address to determine if it is boot data by checking
  * it against the boot params setup_data chain.
  */
-static bool memremap_is_setup_data(resource_size_t phys_addr,
-				   unsigned long size)
+static bool __ref __memremap_is_setup_data(resource_size_t phys_addr,
+						bool early)
 {
 	struct setup_indirect *indirect;
 	struct setup_data *data;
@@ -641,31 +641,45 @@ static bool memremap_is_setup_data(resource_size_t phys_addr,
 
 	paddr = boot_params.hdr.setup_data;
 	while (paddr) {
-		unsigned int len;
+		unsigned int len, size;
 
 		if (phys_addr == paddr)
 			return true;
 
-		data = memremap(paddr, sizeof(*data),
-				MEMREMAP_WB | MEMREMAP_DEC);
+		if (early)
+			data = early_memremap_decrypted(paddr, sizeof(*data));
+		else
+			data = memremap(paddr, sizeof(*data),
+					MEMREMAP_WB | MEMREMAP_DEC);
 		if (!data) {
 			pr_warn("failed to memremap setup_data entry\n");
 			return false;
 		}
 
+		size = sizeof(*data);
+
 		paddr_next = data->next;
 		len = data->len;
 
 		if ((phys_addr > paddr) &&
-		    (phys_addr < (paddr + sizeof(struct setup_data) + len))) {
-			memunmap(data);
+		    (phys_addr < (paddr + sizeof(*data) + len))) {
+			if (early)
+				early_memunmap(data, sizeof(*data));
+			else
+				memunmap(data);
 			return true;
 		}
 
 		if (data->type == SETUP_INDIRECT) {
-			memunmap(data);
-			data = memremap(paddr, sizeof(*data) + len,
-					MEMREMAP_WB | MEMREMAP_DEC);
+			size += len;
+			if (early) {
+				early_memunmap(data, sizeof(*data));
+				data = early_memremap_decrypted(paddr, size);
+			} else {
+				memunmap(data);
+				data = memremap(paddr, size,
+						MEMREMAP_WB | MEMREMAP_DEC);
+			}
 			if (!data) {
 				pr_warn("failed to memremap indirect setup_data\n");
 				return false;
@@ -679,7 +693,10 @@ static bool memremap_is_setup_data(resource_size_t phys_addr,
 			}
 		}
 
-		memunmap(data);
+		if (early)
+			early_memunmap(data, size);
+		else
+			memunmap(data);
 
 		if ((phys_addr > paddr) && (phys_addr < (paddr + len)))
 			return true;
@@ -690,67 +707,16 @@ static bool memremap_is_setup_data(resource_size_t phys_addr,
 	return false;
 }
 
-/*
- * Examine the physical address to determine if it is boot data by checking
- * it against the boot params setup_data chain (early boot version).
- */
+static bool memremap_is_setup_data(resource_size_t phys_addr,
+				   unsigned long size)
+{
+	return __memremap_is_setup_data(phys_addr, false);
+}
+
 static bool __init early_memremap_is_setup_data(resource_size_t phys_addr,
 						unsigned long size)
 {
-	struct setup_indirect *indirect;
-	struct setup_data *data;
-	u64 paddr, paddr_next;
-
-	paddr = boot_params.hdr.setup_data;
-	while (paddr) {
-		unsigned int len, size;
-
-		if (phys_addr == paddr)
-			return true;
-
-		data = early_memremap_decrypted(paddr, sizeof(*data));
-		if (!data) {
-			pr_warn("failed to early memremap setup_data entry\n");
-			return false;
-		}
-
-		size = sizeof(*data);
-
-		paddr_next = data->next;
-		len = data->len;
-
-		if ((phys_addr > paddr) &&
-		    (phys_addr < (paddr + sizeof(struct setup_data) + len))) {
-			early_memunmap(data, sizeof(*data));
-			return true;
-		}
-
-		if (data->type == SETUP_INDIRECT) {
-			size += len;
-			early_memunmap(data, sizeof(*data));
-			data = early_memremap_decrypted(paddr, size);
-			if (!data) {
-				pr_warn("failed to early memremap indirect setup_data\n");
-				return false;
-			}
-
-			indirect = (struct setup_indirect *)data->data;
-
-			if (indirect->type != SETUP_INDIRECT) {
-				paddr = indirect->addr;
-				len = indirect->len;
-			}
-		}
-
-		early_memunmap(data, size);
-
-		if ((phys_addr > paddr) && (phys_addr < (paddr + len)))
-			return true;
-
-		paddr = paddr_next;
-	}
-
-	return false;
+	return __memremap_is_setup_data(phys_addr, true);
 }
 
 /*
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v3 2/3] x86/ioremap: Clean up size calculations in xxx_is_setup_data()
  2024-11-23 11:42 [PATCH v3 0/3] x86/ioremap: clean up the mess in xxx_is_setup_data Baoquan He
  2024-11-23 11:42 ` [PATCH v3 1/3] x86/ioremap: introduce helper to implement xxx_is_setup_data() Baoquan He
@ 2024-11-23 11:42 ` Baoquan He
  2024-11-23 11:42 ` [PATCH v3 3/3] x86/mm: clean up unused parameters of functions Baoquan He
  2 siblings, 0 replies; 8+ messages in thread
From: Baoquan He @ 2024-11-23 11:42 UTC (permalink / raw)
  To: mingo, thomas.lendacky, bp, linux-kernel; +Cc: x86, Baoquan He

while *normally* we'd use the 'sizeof(*data)' pattern, this particular
size repeats a number of times and not all contexts are obvious - so
abstracting it out into a trivial define SD_SIZE looks like the proper
cleanup.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 arch/x86/mm/ioremap.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index aaf40a712b04..76be3d664e09 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -628,6 +628,7 @@ static bool memremap_is_efi_data(resource_size_t phys_addr,
 	return false;
 }
 
+#define SD_SIZE sizeof(struct setup_data)
 /*
  * Examine the physical address to determine if it is boot data by checking
  * it against the boot params setup_data chain.
@@ -647,24 +648,24 @@ static bool __ref __memremap_is_setup_data(resource_size_t phys_addr,
 			return true;
 
 		if (early)
-			data = early_memremap_decrypted(paddr, sizeof(*data));
+			data = early_memremap_decrypted(paddr, SD_SIZE);
 		else
-			data = memremap(paddr, sizeof(*data),
+			data = memremap(paddr, SD_SIZE,
 					MEMREMAP_WB | MEMREMAP_DEC);
 		if (!data) {
 			pr_warn("failed to memremap setup_data entry\n");
 			return false;
 		}
 
-		size = sizeof(*data);
+		size = SD_SIZE;
 
 		paddr_next = data->next;
 		len = data->len;
 
 		if ((phys_addr > paddr) &&
-		    (phys_addr < (paddr + sizeof(*data) + len))) {
+		    (phys_addr < (paddr + SD_SIZE + len))) {
 			if (early)
-				early_memunmap(data, sizeof(*data));
+				early_memunmap(data, SD_SIZE);
 			else
 				memunmap(data);
 			return true;
@@ -673,7 +674,7 @@ static bool __ref __memremap_is_setup_data(resource_size_t phys_addr,
 		if (data->type == SETUP_INDIRECT) {
 			size += len;
 			if (early) {
-				early_memunmap(data, sizeof(*data));
+				early_memunmap(data, SD_SIZE);
 				data = early_memremap_decrypted(paddr, size);
 			} else {
 				memunmap(data);
@@ -706,6 +707,7 @@ static bool __ref __memremap_is_setup_data(resource_size_t phys_addr,
 
 	return false;
 }
+#undef SD_SIZE
 
 static bool memremap_is_setup_data(resource_size_t phys_addr,
 				   unsigned long size)
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v3 3/3] x86/mm: clean up unused parameters of functions
  2024-11-23 11:42 [PATCH v3 0/3] x86/ioremap: clean up the mess in xxx_is_setup_data Baoquan He
  2024-11-23 11:42 ` [PATCH v3 1/3] x86/ioremap: introduce helper to implement xxx_is_setup_data() Baoquan He
  2024-11-23 11:42 ` [PATCH v3 2/3] x86/ioremap: Clean up size calculations in xxx_is_setup_data() Baoquan He
@ 2024-11-23 11:42 ` Baoquan He
  2024-12-08 10:39   ` [tip: x86/cleanups] x86/ioremap: Remove unused size parameter in remapping functions tip-bot2 for Baoquan He
  2 siblings, 1 reply; 8+ messages in thread
From: Baoquan He @ 2024-11-23 11:42 UTC (permalink / raw)
  To: mingo, thomas.lendacky, bp, linux-kernel; +Cc: x86, Baoquan He

For functions memremap_is_efi_data(), memremap_is_setup_data and
early_memremap_is_setup_data(), their parameter 'size' is not used
and sometime cause confusion. Remove it now.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 arch/x86/mm/ioremap.c | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index 76be3d664e09..a11890692e4d 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -593,8 +593,7 @@ static bool memremap_should_map_decrypted(resource_size_t phys_addr,
  * Examine the physical address to determine if it is EFI data. Check
  * it against the boot params structure and EFI tables and memory types.
  */
-static bool memremap_is_efi_data(resource_size_t phys_addr,
-				 unsigned long size)
+static bool memremap_is_efi_data(resource_size_t phys_addr)
 {
 	u64 paddr;
 
@@ -709,14 +708,12 @@ static bool __ref __memremap_is_setup_data(resource_size_t phys_addr,
 }
 #undef SD_SIZE
 
-static bool memremap_is_setup_data(resource_size_t phys_addr,
-				   unsigned long size)
+static bool memremap_is_setup_data(resource_size_t phys_addr)
 {
 	return __memremap_is_setup_data(phys_addr, false);
 }
 
-static bool __init early_memremap_is_setup_data(resource_size_t phys_addr,
-						unsigned long size)
+static bool __init early_memremap_is_setup_data(resource_size_t phys_addr)
 {
 	return __memremap_is_setup_data(phys_addr, true);
 }
@@ -739,8 +736,8 @@ bool arch_memremap_can_ram_remap(resource_size_t phys_addr, unsigned long size,
 		return false;
 
 	if (cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT)) {
-		if (memremap_is_setup_data(phys_addr, size) ||
-		    memremap_is_efi_data(phys_addr, size))
+		if (memremap_is_setup_data(phys_addr) ||
+		    memremap_is_efi_data(phys_addr))
 			return false;
 	}
 
@@ -765,8 +762,8 @@ pgprot_t __init early_memremap_pgprot_adjust(resource_size_t phys_addr,
 	encrypted_prot = true;
 
 	if (cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT)) {
-		if (early_memremap_is_setup_data(phys_addr, size) ||
-		    memremap_is_efi_data(phys_addr, size))
+		if (early_memremap_is_setup_data(phys_addr) ||
+		    memremap_is_efi_data(phys_addr))
 			encrypted_prot = false;
 	}
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v3 1/3] x86/ioremap: introduce helper to implement xxx_is_setup_data()
  2024-11-23 11:42 ` [PATCH v3 1/3] x86/ioremap: introduce helper to implement xxx_is_setup_data() Baoquan He
@ 2024-12-07 16:04   ` Borislav Petkov
  2024-12-09  0:52     ` Baoquan He
  2024-12-08 10:39   ` [tip: x86/cleanups] x86/ioremap: Simplify setup_data mapping variants tip-bot2 for Baoquan He
  1 sibling, 1 reply; 8+ messages in thread
From: Borislav Petkov @ 2024-12-07 16:04 UTC (permalink / raw)
  To: Baoquan He; +Cc: mingo, thomas.lendacky, linux-kernel, x86

On Sat, Nov 23, 2024 at 07:42:19PM +0800, Baoquan He wrote:
> Functions memremap_is_setup_data() and early_memremap_is_setup_data()
> share completely the same process and handling, except of the
> different memremap/unmap invocations.
> 
> So add helper __memremap_is_setup_data() to extract the common part,
> parameter 'early' is used to decide what kind of memremap/unmap
> APIs are called. This simplifies codes a lot by removing the duplicated
> codes, and also removes the similar code comment above them.
> 
> And '__ref' is added to __memremap_is_setup_data() to suppress below
> section mismatch warning:
> 
> ARNING: modpost: vmlinux: section mismatch in reference: __memremap_is_setup_data+0x5f (section: .text) ->
> early_memunmap (section: .init.text)
> 
> Signed-off-by: Baoquan He <bhe@redhat.com>
> ---
>  arch/x86/mm/ioremap.c | 104 ++++++++++++++----------------------------
>  1 file changed, 35 insertions(+), 69 deletions(-)

Some touchups ontop:

diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index aaf40a712b04..fe44e8180bdd 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -632,9 +632,9 @@ static bool memremap_is_efi_data(resource_size_t phys_addr,
  * Examine the physical address to determine if it is boot data by checking
  * it against the boot params setup_data chain.
  */
-static bool __ref __memremap_is_setup_data(resource_size_t phys_addr,
-						bool early)
+static bool __ref __memremap_is_setup_data(resource_size_t phys_addr, bool early)
 {
+	unsigned int setup_data_sz = sizeof(struct setup_data);
 	struct setup_indirect *indirect;
 	struct setup_data *data;
 	u64 paddr, paddr_next;
@@ -647,24 +647,23 @@ static bool __ref __memremap_is_setup_data(resource_size_t phys_addr,
 			return true;
 
 		if (early)
-			data = early_memremap_decrypted(paddr, sizeof(*data));
+			data = early_memremap_decrypted(paddr, setup_data_sz);
 		else
-			data = memremap(paddr, sizeof(*data),
-					MEMREMAP_WB | MEMREMAP_DEC);
+			data = memremap(paddr, setup_data_sz, MEMREMAP_WB | MEMREMAP_DEC);
 		if (!data) {
-			pr_warn("failed to memremap setup_data entry\n");
+			pr_warn("failed to remap setup_data entry\n");
 			return false;
 		}
 
-		size = sizeof(*data);
+		size = setup_data_sz;
 
 		paddr_next = data->next;
 		len = data->len;
 
 		if ((phys_addr > paddr) &&
-		    (phys_addr < (paddr + sizeof(*data) + len))) {
+		    (phys_addr < (paddr + setup_data_sz + len))) {
 			if (early)
-				early_memunmap(data, sizeof(*data));
+				early_memunmap(data, setup_data_sz);
 			else
 				memunmap(data);
 			return true;
@@ -673,15 +672,14 @@ static bool __ref __memremap_is_setup_data(resource_size_t phys_addr,
 		if (data->type == SETUP_INDIRECT) {
 			size += len;
 			if (early) {
-				early_memunmap(data, sizeof(*data));
+				early_memunmap(data, setup_data_sz);
 				data = early_memremap_decrypted(paddr, size);
 			} else {
 				memunmap(data);
-				data = memremap(paddr, size,
-						MEMREMAP_WB | MEMREMAP_DEC);
+				data = memremap(paddr, size, MEMREMAP_WB | MEMREMAP_DEC);
 			}
 			if (!data) {
-				pr_warn("failed to memremap indirect setup_data\n");
+				pr_warn("failed to remap indirect setup_data\n");
 				return false;
 			}
 

-- 
Regards/Gruss,
    Boris.

https://people.kernel.org/tglx/notes-about-netiquette

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [tip: x86/cleanups] x86/ioremap: Remove unused size parameter in remapping functions
  2024-11-23 11:42 ` [PATCH v3 3/3] x86/mm: clean up unused parameters of functions Baoquan He
@ 2024-12-08 10:39   ` tip-bot2 for Baoquan He
  0 siblings, 0 replies; 8+ messages in thread
From: tip-bot2 for Baoquan He @ 2024-12-08 10:39 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: Baoquan He, Borislav Petkov (AMD), x86, linux-kernel

The following commit has been merged into the x86/cleanups branch of tip:

Commit-ID:     525077ae7145cc868b69282f85bed2be8ecd1ed5
Gitweb:        https://git.kernel.org/tip/525077ae7145cc868b69282f85bed2be8ecd1ed5
Author:        Baoquan He <bhe@redhat.com>
AuthorDate:    Sat, 23 Nov 2024 19:42:21 +08:00
Committer:     Borislav Petkov (AMD) <bp@alien8.de>
CommitterDate: Sat, 07 Dec 2024 17:23:23 +01:00

x86/ioremap: Remove unused size parameter in remapping functions

The size parameter of functions memremap_is_efi_data(),
memremap_is_setup_data() and early_memremap_is_setup_data() is not used.
Remove it.

  [ bp: Massage commit message. ]

Signed-off-by: Baoquan He <bhe@redhat.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20241123114221.149383-4-bhe@redhat.com
---
 arch/x86/mm/ioremap.c | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index fe44e81..38ff779 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -593,8 +593,7 @@ static bool memremap_should_map_decrypted(resource_size_t phys_addr,
  * Examine the physical address to determine if it is EFI data. Check
  * it against the boot params structure and EFI tables and memory types.
  */
-static bool memremap_is_efi_data(resource_size_t phys_addr,
-				 unsigned long size)
+static bool memremap_is_efi_data(resource_size_t phys_addr)
 {
 	u64 paddr;
 
@@ -705,14 +704,12 @@ static bool __ref __memremap_is_setup_data(resource_size_t phys_addr, bool early
 	return false;
 }
 
-static bool memremap_is_setup_data(resource_size_t phys_addr,
-				   unsigned long size)
+static bool memremap_is_setup_data(resource_size_t phys_addr)
 {
 	return __memremap_is_setup_data(phys_addr, false);
 }
 
-static bool __init early_memremap_is_setup_data(resource_size_t phys_addr,
-						unsigned long size)
+static bool __init early_memremap_is_setup_data(resource_size_t phys_addr)
 {
 	return __memremap_is_setup_data(phys_addr, true);
 }
@@ -735,8 +732,8 @@ bool arch_memremap_can_ram_remap(resource_size_t phys_addr, unsigned long size,
 		return false;
 
 	if (cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT)) {
-		if (memremap_is_setup_data(phys_addr, size) ||
-		    memremap_is_efi_data(phys_addr, size))
+		if (memremap_is_setup_data(phys_addr) ||
+		    memremap_is_efi_data(phys_addr))
 			return false;
 	}
 
@@ -761,8 +758,8 @@ pgprot_t __init early_memremap_pgprot_adjust(resource_size_t phys_addr,
 	encrypted_prot = true;
 
 	if (cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT)) {
-		if (early_memremap_is_setup_data(phys_addr, size) ||
-		    memremap_is_efi_data(phys_addr, size))
+		if (early_memremap_is_setup_data(phys_addr) ||
+		    memremap_is_efi_data(phys_addr))
 			encrypted_prot = false;
 	}
 

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [tip: x86/cleanups] x86/ioremap: Simplify setup_data mapping variants
  2024-11-23 11:42 ` [PATCH v3 1/3] x86/ioremap: introduce helper to implement xxx_is_setup_data() Baoquan He
  2024-12-07 16:04   ` Borislav Petkov
@ 2024-12-08 10:39   ` tip-bot2 for Baoquan He
  1 sibling, 0 replies; 8+ messages in thread
From: tip-bot2 for Baoquan He @ 2024-12-08 10:39 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: Baoquan He, Borislav Petkov (AMD), x86, linux-kernel

The following commit has been merged into the x86/cleanups branch of tip:

Commit-ID:     095ac6fa19500fecd7c62e755dee45bb303d4d43
Gitweb:        https://git.kernel.org/tip/095ac6fa19500fecd7c62e755dee45bb303d4d43
Author:        Baoquan He <bhe@redhat.com>
AuthorDate:    Sat, 23 Nov 2024 19:42:19 +08:00
Committer:     Borislav Petkov (AMD) <bp@alien8.de>
CommitterDate: Sat, 07 Dec 2024 17:23:15 +01:00

x86/ioremap: Simplify setup_data mapping variants

memremap_is_setup_data() and early_memremap_is_setup_data() share
completely the same process and handling, except for the differing
memremap/unmap invocations.

Add a helper __memremap_is_setup_data() extracting the common part and
simplify a lot of code while at it.

Mark __memremap_is_setup_data() as __ref to suppress this section
mismatch warning:

  WARNING: modpost: vmlinux: section mismatch in reference: __memremap_is_setup_data+0x5f (section: .text) ->
  early_memunmap (section: .init.text)

  [ bp: Massage a bit. ]

Signed-off-by: Baoquan He <bhe@redhat.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20241123114221.149383-2-bhe@redhat.com
---
 arch/x86/mm/ioremap.c | 106 +++++++++++++----------------------------
 1 file changed, 35 insertions(+), 71 deletions(-)

diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index 8d29163..fe44e81 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -632,42 +632,54 @@ static bool memremap_is_efi_data(resource_size_t phys_addr,
  * Examine the physical address to determine if it is boot data by checking
  * it against the boot params setup_data chain.
  */
-static bool memremap_is_setup_data(resource_size_t phys_addr,
-				   unsigned long size)
+static bool __ref __memremap_is_setup_data(resource_size_t phys_addr, bool early)
 {
+	unsigned int setup_data_sz = sizeof(struct setup_data);
 	struct setup_indirect *indirect;
 	struct setup_data *data;
 	u64 paddr, paddr_next;
 
 	paddr = boot_params.hdr.setup_data;
 	while (paddr) {
-		unsigned int len;
+		unsigned int len, size;
 
 		if (phys_addr == paddr)
 			return true;
 
-		data = memremap(paddr, sizeof(*data),
-				MEMREMAP_WB | MEMREMAP_DEC);
+		if (early)
+			data = early_memremap_decrypted(paddr, setup_data_sz);
+		else
+			data = memremap(paddr, setup_data_sz, MEMREMAP_WB | MEMREMAP_DEC);
 		if (!data) {
-			pr_warn("failed to memremap setup_data entry\n");
+			pr_warn("failed to remap setup_data entry\n");
 			return false;
 		}
 
+		size = setup_data_sz;
+
 		paddr_next = data->next;
 		len = data->len;
 
 		if ((phys_addr > paddr) &&
-		    (phys_addr < (paddr + sizeof(struct setup_data) + len))) {
-			memunmap(data);
+		    (phys_addr < (paddr + setup_data_sz + len))) {
+			if (early)
+				early_memunmap(data, setup_data_sz);
+			else
+				memunmap(data);
 			return true;
 		}
 
 		if (data->type == SETUP_INDIRECT) {
-			memunmap(data);
-			data = memremap(paddr, sizeof(*data) + len,
-					MEMREMAP_WB | MEMREMAP_DEC);
+			size += len;
+			if (early) {
+				early_memunmap(data, setup_data_sz);
+				data = early_memremap_decrypted(paddr, size);
+			} else {
+				memunmap(data);
+				data = memremap(paddr, size, MEMREMAP_WB | MEMREMAP_DEC);
+			}
 			if (!data) {
-				pr_warn("failed to memremap indirect setup_data\n");
+				pr_warn("failed to remap indirect setup_data\n");
 				return false;
 			}
 
@@ -679,7 +691,10 @@ static bool memremap_is_setup_data(resource_size_t phys_addr,
 			}
 		}
 
-		memunmap(data);
+		if (early)
+			early_memunmap(data, size);
+		else
+			memunmap(data);
 
 		if ((phys_addr > paddr) && (phys_addr < (paddr + len)))
 			return true;
@@ -690,67 +705,16 @@ static bool memremap_is_setup_data(resource_size_t phys_addr,
 	return false;
 }
 
-/*
- * Examine the physical address to determine if it is boot data by checking
- * it against the boot params setup_data chain (early boot version).
- */
+static bool memremap_is_setup_data(resource_size_t phys_addr,
+				   unsigned long size)
+{
+	return __memremap_is_setup_data(phys_addr, false);
+}
+
 static bool __init early_memremap_is_setup_data(resource_size_t phys_addr,
 						unsigned long size)
 {
-	struct setup_indirect *indirect;
-	struct setup_data *data;
-	u64 paddr, paddr_next;
-
-	paddr = boot_params.hdr.setup_data;
-	while (paddr) {
-		unsigned int len, size;
-
-		if (phys_addr == paddr)
-			return true;
-
-		data = early_memremap_decrypted(paddr, sizeof(*data));
-		if (!data) {
-			pr_warn("failed to early memremap setup_data entry\n");
-			return false;
-		}
-
-		size = sizeof(*data);
-
-		paddr_next = data->next;
-		len = data->len;
-
-		if ((phys_addr > paddr) &&
-		    (phys_addr < (paddr + sizeof(struct setup_data) + len))) {
-			early_memunmap(data, sizeof(*data));
-			return true;
-		}
-
-		if (data->type == SETUP_INDIRECT) {
-			size += len;
-			early_memunmap(data, sizeof(*data));
-			data = early_memremap_decrypted(paddr, size);
-			if (!data) {
-				pr_warn("failed to early memremap indirect setup_data\n");
-				return false;
-			}
-
-			indirect = (struct setup_indirect *)data->data;
-
-			if (indirect->type != SETUP_INDIRECT) {
-				paddr = indirect->addr;
-				len = indirect->len;
-			}
-		}
-
-		early_memunmap(data, size);
-
-		if ((phys_addr > paddr) && (phys_addr < (paddr + len)))
-			return true;
-
-		paddr = paddr_next;
-	}
-
-	return false;
+	return __memremap_is_setup_data(phys_addr, true);
 }
 
 /*

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v3 1/3] x86/ioremap: introduce helper to implement xxx_is_setup_data()
  2024-12-07 16:04   ` Borislav Petkov
@ 2024-12-09  0:52     ` Baoquan He
  0 siblings, 0 replies; 8+ messages in thread
From: Baoquan He @ 2024-12-09  0:52 UTC (permalink / raw)
  To: Borislav Petkov; +Cc: mingo, thomas.lendacky, linux-kernel, x86

On 12/07/24 at 05:04pm, Borislav Petkov wrote:
> On Sat, Nov 23, 2024 at 07:42:19PM +0800, Baoquan He wrote:
> > Functions memremap_is_setup_data() and early_memremap_is_setup_data()
> > share completely the same process and handling, except of the
> > different memremap/unmap invocations.
> > 
> > So add helper __memremap_is_setup_data() to extract the common part,
> > parameter 'early' is used to decide what kind of memremap/unmap
> > APIs are called. This simplifies codes a lot by removing the duplicated
> > codes, and also removes the similar code comment above them.
> > 
> > And '__ref' is added to __memremap_is_setup_data() to suppress below
> > section mismatch warning:
> > 
> > ARNING: modpost: vmlinux: section mismatch in reference: __memremap_is_setup_data+0x5f (section: .text) ->
> > early_memunmap (section: .init.text)
> > 
> > Signed-off-by: Baoquan He <bhe@redhat.com>
> > ---
> >  arch/x86/mm/ioremap.c | 104 ++++++++++++++----------------------------
> >  1 file changed, 35 insertions(+), 69 deletions(-)
> 
> Some touchups ontop:
> 
> diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
> index aaf40a712b04..fe44e8180bdd 100644
> --- a/arch/x86/mm/ioremap.c
> +++ b/arch/x86/mm/ioremap.c

Thanks for optimizing these.

> @@ -632,9 +632,9 @@ static bool memremap_is_efi_data(resource_size_t phys_addr,
>   * Examine the physical address to determine if it is boot data by checking
>   * it against the boot params setup_data chain.
>   */
> -static bool __ref __memremap_is_setup_data(resource_size_t phys_addr,
> -						bool early)
> +static bool __ref __memremap_is_setup_data(resource_size_t phys_addr, bool early)
>  {
> +	unsigned int setup_data_sz = sizeof(struct setup_data);
>  	struct setup_indirect *indirect;
>  	struct setup_data *data;
>  	u64 paddr, paddr_next;
> @@ -647,24 +647,23 @@ static bool __ref __memremap_is_setup_data(resource_size_t phys_addr,
>  			return true;
>  
>  		if (early)
> -			data = early_memremap_decrypted(paddr, sizeof(*data));
> +			data = early_memremap_decrypted(paddr, setup_data_sz);
>  		else
> -			data = memremap(paddr, sizeof(*data),
> -					MEMREMAP_WB | MEMREMAP_DEC);
> +			data = memremap(paddr, setup_data_sz, MEMREMAP_WB | MEMREMAP_DEC);
>  		if (!data) {
> -			pr_warn("failed to memremap setup_data entry\n");
> +			pr_warn("failed to remap setup_data entry\n");
>  			return false;
>  		}
>  
> -		size = sizeof(*data);
> +		size = setup_data_sz;
>  
>  		paddr_next = data->next;
>  		len = data->len;
>  
>  		if ((phys_addr > paddr) &&
> -		    (phys_addr < (paddr + sizeof(*data) + len))) {
> +		    (phys_addr < (paddr + setup_data_sz + len))) {
>  			if (early)
> -				early_memunmap(data, sizeof(*data));
> +				early_memunmap(data, setup_data_sz);
>  			else
>  				memunmap(data);
>  			return true;
> @@ -673,15 +672,14 @@ static bool __ref __memremap_is_setup_data(resource_size_t phys_addr,
>  		if (data->type == SETUP_INDIRECT) {
>  			size += len;
>  			if (early) {
> -				early_memunmap(data, sizeof(*data));
> +				early_memunmap(data, setup_data_sz);
>  				data = early_memremap_decrypted(paddr, size);
>  			} else {
>  				memunmap(data);
> -				data = memremap(paddr, size,
> -						MEMREMAP_WB | MEMREMAP_DEC);
> +				data = memremap(paddr, size, MEMREMAP_WB | MEMREMAP_DEC);
>  			}
>  			if (!data) {
> -				pr_warn("failed to memremap indirect setup_data\n");
> +				pr_warn("failed to remap indirect setup_data\n");
>  				return false;
>  			}
>  
> 
> -- 
> Regards/Gruss,
>     Boris.
> 
> https://people.kernel.org/tglx/notes-about-netiquette
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2024-12-09  0:52 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-23 11:42 [PATCH v3 0/3] x86/ioremap: clean up the mess in xxx_is_setup_data Baoquan He
2024-11-23 11:42 ` [PATCH v3 1/3] x86/ioremap: introduce helper to implement xxx_is_setup_data() Baoquan He
2024-12-07 16:04   ` Borislav Petkov
2024-12-09  0:52     ` Baoquan He
2024-12-08 10:39   ` [tip: x86/cleanups] x86/ioremap: Simplify setup_data mapping variants tip-bot2 for Baoquan He
2024-11-23 11:42 ` [PATCH v3 2/3] x86/ioremap: Clean up size calculations in xxx_is_setup_data() Baoquan He
2024-11-23 11:42 ` [PATCH v3 3/3] x86/mm: clean up unused parameters of functions Baoquan He
2024-12-08 10:39   ` [tip: x86/cleanups] x86/ioremap: Remove unused size parameter in remapping functions tip-bot2 for Baoquan He

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.