diff mbox series

[v2] of: Fix reserved-memory overlap detection

Message ID ded6fd6b47b58741aabdcc6967f73eca6a3f311e.1603273666.git-series.vincent.whitchurch@axis.com
State Accepted, archived
Headers show
Series [v2] of: Fix reserved-memory overlap detection | expand

Checks

Context Check Description
robh/checkpatch warning total: 0 errors, 1 warnings, 25 lines checked

Commit Message

Vincent Whitchurch Oct. 21, 2020, 9:53 a.m. UTC
The reserved-memory overlap detection code fails to detect overlaps if
either of the regions starts at address 0x0.  The code explicitly checks
for and ignores such regions, apparently in order to ignore dynamically
allocated regions which have an address of 0x0 at this point.  These
dynamically allocated regions also have a size of 0x0 at this point, so
fix this by removing the check and sorting the dynamically allocated
regions ahead of any static regions at address 0x0.

For example, there are two overlaps in this case but they are not
currently reported:

	foo@0 {
	        reg = <0x0 0x2000>;
	};

	bar@0 {
	        reg = <0x0 0x1000>;
	};

	baz@1000 {
	        reg = <0x1000 0x1000>;
	};

	quux {
	        size = <0x1000>;
	};

but they are after this patch:

 OF: reserved mem: OVERLAP DETECTED!
 bar@0 (0x00000000--0x00001000) overlaps with foo@0 (0x00000000--0x00002000)
 OF: reserved mem: OVERLAP DETECTED!
 foo@0 (0x00000000--0x00002000) overlaps with baz@1000 (0x00001000--0x00002000)

Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
---
v2: Fix handling of dynamically allocated regions.

 drivers/of/of_reserved_mem.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)


base-commit: 270315b8235e3d10c2e360cff56c2f9e0915a252

Comments

Rob Herring Oct. 23, 2020, 4:50 p.m. UTC | #1
On Wed, 21 Oct 2020 11:53:59 +0200, Vincent Whitchurch wrote:
> The reserved-memory overlap detection code fails to detect overlaps if
> either of the regions starts at address 0x0.  The code explicitly checks
> for and ignores such regions, apparently in order to ignore dynamically
> allocated regions which have an address of 0x0 at this point.  These
> dynamically allocated regions also have a size of 0x0 at this point, so
> fix this by removing the check and sorting the dynamically allocated
> regions ahead of any static regions at address 0x0.
> 
> For example, there are two overlaps in this case but they are not
> currently reported:
> 
> 	foo@0 {
> 	        reg = <0x0 0x2000>;
> 	};
> 
> 	bar@0 {
> 	        reg = <0x0 0x1000>;
> 	};
> 
> 	baz@1000 {
> 	        reg = <0x1000 0x1000>;
> 	};
> 
> 	quux {
> 	        size = <0x1000>;
> 	};
> 
> but they are after this patch:
> 
>  OF: reserved mem: OVERLAP DETECTED!
>  bar@0 (0x00000000--0x00001000) overlaps with foo@0 (0x00000000--0x00002000)
>  OF: reserved mem: OVERLAP DETECTED!
>  foo@0 (0x00000000--0x00002000) overlaps with baz@1000 (0x00001000--0x00002000)
> 
> Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
> ---
> v2: Fix handling of dynamically allocated regions.
> 
>  drivers/of/of_reserved_mem.c | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
> 

Applied, thanks!
diff mbox series

Patch

diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 46b9371..6530b8b 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -200,6 +200,16 @@  static int __init __rmem_cmp(const void *a, const void *b)
 	if (ra->base > rb->base)
 		return 1;
 
+	/*
+	 * Put the dynamic allocations (address == 0, size == 0) before static
+	 * allocations at address 0x0 so that overlap detection works
+	 * correctly.
+	 */
+	if (ra->size < rb->size)
+		return -1;
+	if (ra->size > rb->size)
+		return 1;
+
 	return 0;
 }
 
@@ -217,8 +227,7 @@  static void __init __rmem_check_for_overlap(void)
 
 		this = &reserved_mem[i];
 		next = &reserved_mem[i + 1];
-		if (!(this->base && next->base))
-			continue;
+
 		if (this->base + this->size > next->base) {
 			phys_addr_t this_end, next_end;