diff mbox series

ARM: NOMMU: Fix conversion for_each_membock() to for_each_mem_range()

Message ID 20210310102013.91253-1-vladimir.murzin@arm.com (mailing list archive)
State New, archived
Headers show
Series ARM: NOMMU: Fix conversion for_each_membock() to for_each_mem_range() | expand

Commit Message

Vladimir Murzin March 10, 2021, 10:20 a.m. UTC
for_each_mem_range() uses a loop variable, yet looking into code it is
not just iteration counter but more complex entity which encodes
information about memblock. Thus condition i == 0 looks fragile.
Indeed, it broke boot of R-class platforms since it never took i == 0
path (due to i was set to 1). Fix that with restoring original flag
check.

Fixes: b10d6bca8720 ("arch, drivers: replace for_each_membock() with for_each_mem_range()")
Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
---
 arch/arm/mm/pmsa-v7.c | 4 +++-
 arch/arm/mm/pmsa-v8.c | 4 +++-
 2 files changed, 6 insertions(+), 2 deletions(-)

Comments

Mike Rapoport March 10, 2021, 1:23 p.m. UTC | #1
On Wed, Mar 10, 2021 at 10:20:13AM +0000, Vladimir Murzin wrote:
> for_each_mem_range() uses a loop variable, yet looking into code it is
> not just iteration counter but more complex entity which encodes
> information about memblock. Thus condition i == 0 looks fragile.
> Indeed, it broke boot of R-class platforms since it never took i == 0
> path (due to i was set to 1).

Oops, sorry about that.

> Fix that with restoring original flag
> check.
> 
> Fixes: b10d6bca8720 ("arch, drivers: replace for_each_membock() with for_each_mem_range()")
> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>

Acked-by: Mike Rapoport <rppt@linux.ibm.com>

> ---
>  arch/arm/mm/pmsa-v7.c | 4 +++-
>  arch/arm/mm/pmsa-v8.c | 4 +++-
>  2 files changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/mm/pmsa-v7.c b/arch/arm/mm/pmsa-v7.c
> index 88950e41a3a9..59d916ccdf25 100644
> --- a/arch/arm/mm/pmsa-v7.c
> +++ b/arch/arm/mm/pmsa-v7.c
> @@ -235,6 +235,7 @@ void __init pmsav7_adjust_lowmem_bounds(void)
>  	phys_addr_t mem_end;
>  	phys_addr_t reg_start, reg_end;
>  	unsigned int mem_max_regions;
> +	bool first = true;
>  	int num;
>  	u64 i;
>  
> @@ -263,7 +264,7 @@ void __init pmsav7_adjust_lowmem_bounds(void)
>  #endif
>  
>  	for_each_mem_range(i, &reg_start, &reg_end) {
> -		if (i == 0) {
> +		if (first) {
>  			phys_addr_t phys_offset = PHYS_OFFSET;
>  
>  			/*
> @@ -275,6 +276,7 @@ void __init pmsav7_adjust_lowmem_bounds(void)
>  			mem_start = reg_start;
>  			mem_end = reg_end;
>  			specified_mem_size = mem_end - mem_start;
> +			first = false;
>  		} else {
>  			/*
>  			 * memblock auto merges contiguous blocks, remove
> diff --git a/arch/arm/mm/pmsa-v8.c b/arch/arm/mm/pmsa-v8.c
> index 2de019f7503e..8359748a19a1 100644
> --- a/arch/arm/mm/pmsa-v8.c
> +++ b/arch/arm/mm/pmsa-v8.c
> @@ -95,10 +95,11 @@ void __init pmsav8_adjust_lowmem_bounds(void)
>  {
>  	phys_addr_t mem_end;
>  	phys_addr_t reg_start, reg_end;
> +	bool first = true;
>  	u64 i;
>  
>  	for_each_mem_range(i, &reg_start, &reg_end) {
> -		if (i == 0) {
> +		if (first) {
>  			phys_addr_t phys_offset = PHYS_OFFSET;
>  
>  			/*
> @@ -107,6 +108,7 @@ void __init pmsav8_adjust_lowmem_bounds(void)
>  			if (reg_start != phys_offset)
>  				panic("First memory bank must be contiguous from PHYS_OFFSET");
>  			mem_end = reg_end;
> +			first = false;
>  		} else {
>  			/*
>  			 * memblock auto merges contiguous blocks, remove
> -- 
> 2.24.0
>
Vladimir Murzin March 11, 2021, 12:36 p.m. UTC | #2
On 3/10/21 1:23 PM, Mike Rapoport wrote:
> On Wed, Mar 10, 2021 at 10:20:13AM +0000, Vladimir Murzin wrote:
>> for_each_mem_range() uses a loop variable, yet looking into code it is
>> not just iteration counter but more complex entity which encodes
>> information about memblock. Thus condition i == 0 looks fragile.
>> Indeed, it broke boot of R-class platforms since it never took i == 0
>> path (due to i was set to 1).
> 
> Oops, sorry about that.
> 
>> Fix that with restoring original flag
>> check.
>>
>> Fixes: b10d6bca8720 ("arch, drivers: replace for_each_membock() with for_each_mem_range()")
>> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
> 
> Acked-by: Mike Rapoport <rppt@linux.ibm.com>
> 

Thanks!

I've just put it into Russell's patch system as patch 9069/1

Vladimir

>> ---
>>  arch/arm/mm/pmsa-v7.c | 4 +++-
>>  arch/arm/mm/pmsa-v8.c | 4 +++-
>>  2 files changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/arm/mm/pmsa-v7.c b/arch/arm/mm/pmsa-v7.c
>> index 88950e41a3a9..59d916ccdf25 100644
>> --- a/arch/arm/mm/pmsa-v7.c
>> +++ b/arch/arm/mm/pmsa-v7.c
>> @@ -235,6 +235,7 @@ void __init pmsav7_adjust_lowmem_bounds(void)
>>  	phys_addr_t mem_end;
>>  	phys_addr_t reg_start, reg_end;
>>  	unsigned int mem_max_regions;
>> +	bool first = true;
>>  	int num;
>>  	u64 i;
>>  
>> @@ -263,7 +264,7 @@ void __init pmsav7_adjust_lowmem_bounds(void)
>>  #endif
>>  
>>  	for_each_mem_range(i, &reg_start, &reg_end) {
>> -		if (i == 0) {
>> +		if (first) {
>>  			phys_addr_t phys_offset = PHYS_OFFSET;
>>  
>>  			/*
>> @@ -275,6 +276,7 @@ void __init pmsav7_adjust_lowmem_bounds(void)
>>  			mem_start = reg_start;
>>  			mem_end = reg_end;
>>  			specified_mem_size = mem_end - mem_start;
>> +			first = false;
>>  		} else {
>>  			/*
>>  			 * memblock auto merges contiguous blocks, remove
>> diff --git a/arch/arm/mm/pmsa-v8.c b/arch/arm/mm/pmsa-v8.c
>> index 2de019f7503e..8359748a19a1 100644
>> --- a/arch/arm/mm/pmsa-v8.c
>> +++ b/arch/arm/mm/pmsa-v8.c
>> @@ -95,10 +95,11 @@ void __init pmsav8_adjust_lowmem_bounds(void)
>>  {
>>  	phys_addr_t mem_end;
>>  	phys_addr_t reg_start, reg_end;
>> +	bool first = true;
>>  	u64 i;
>>  
>>  	for_each_mem_range(i, &reg_start, &reg_end) {
>> -		if (i == 0) {
>> +		if (first) {
>>  			phys_addr_t phys_offset = PHYS_OFFSET;
>>  
>>  			/*
>> @@ -107,6 +108,7 @@ void __init pmsav8_adjust_lowmem_bounds(void)
>>  			if (reg_start != phys_offset)
>>  				panic("First memory bank must be contiguous from PHYS_OFFSET");
>>  			mem_end = reg_end;
>> +			first = false;
>>  		} else {
>>  			/*
>>  			 * memblock auto merges contiguous blocks, remove
>> -- 
>> 2.24.0
>>
>
diff mbox series

Patch

diff --git a/arch/arm/mm/pmsa-v7.c b/arch/arm/mm/pmsa-v7.c
index 88950e41a3a9..59d916ccdf25 100644
--- a/arch/arm/mm/pmsa-v7.c
+++ b/arch/arm/mm/pmsa-v7.c
@@ -235,6 +235,7 @@  void __init pmsav7_adjust_lowmem_bounds(void)
 	phys_addr_t mem_end;
 	phys_addr_t reg_start, reg_end;
 	unsigned int mem_max_regions;
+	bool first = true;
 	int num;
 	u64 i;
 
@@ -263,7 +264,7 @@  void __init pmsav7_adjust_lowmem_bounds(void)
 #endif
 
 	for_each_mem_range(i, &reg_start, &reg_end) {
-		if (i == 0) {
+		if (first) {
 			phys_addr_t phys_offset = PHYS_OFFSET;
 
 			/*
@@ -275,6 +276,7 @@  void __init pmsav7_adjust_lowmem_bounds(void)
 			mem_start = reg_start;
 			mem_end = reg_end;
 			specified_mem_size = mem_end - mem_start;
+			first = false;
 		} else {
 			/*
 			 * memblock auto merges contiguous blocks, remove
diff --git a/arch/arm/mm/pmsa-v8.c b/arch/arm/mm/pmsa-v8.c
index 2de019f7503e..8359748a19a1 100644
--- a/arch/arm/mm/pmsa-v8.c
+++ b/arch/arm/mm/pmsa-v8.c
@@ -95,10 +95,11 @@  void __init pmsav8_adjust_lowmem_bounds(void)
 {
 	phys_addr_t mem_end;
 	phys_addr_t reg_start, reg_end;
+	bool first = true;
 	u64 i;
 
 	for_each_mem_range(i, &reg_start, &reg_end) {
-		if (i == 0) {
+		if (first) {
 			phys_addr_t phys_offset = PHYS_OFFSET;
 
 			/*
@@ -107,6 +108,7 @@  void __init pmsav8_adjust_lowmem_bounds(void)
 			if (reg_start != phys_offset)
 				panic("First memory bank must be contiguous from PHYS_OFFSET");
 			mem_end = reg_end;
+			first = false;
 		} else {
 			/*
 			 * memblock auto merges contiguous blocks, remove