Re: [PATCH v2] Fix display of Maximum Memory

2020-01-28 Thread Michael Ellerman
On Wed, 2020-01-15 at 14:53:59 UTC, Michael Bringmann wrote:
> Correct overflow problem in calculation+display of Maximum Memory
> value to syscfg where 32bits is insufficient.
> 
> Signed-off-by: Michael Bringmann 

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/f1dbc1c5c70d0d4c60b5d467ba941fba167c12f6

cheers


Re: [PATCH v2] Fix display of Maximum Memory

2020-01-16 Thread Michael Bringmann
On 1/15/20 11:53 PM, Michael Ellerman wrote:
> Michael Bringmann  writes:
>> Correct overflow problem in calculation+display of Maximum Memory
>> value to syscfg where 32bits is insufficient.
>>
>> Signed-off-by: Michael Bringmann 
>> ---
>>  arch/powerpc/platforms/pseries/lparcfg.c | 8 
>>  1 file changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/powerpc/platforms/pseries/lparcfg.c 
>> b/arch/powerpc/platforms/pseries/lparcfg.c
>> index e33e8bc..f00411c 100644
>> --- a/arch/powerpc/platforms/pseries/lparcfg.c
>> +++ b/arch/powerpc/platforms/pseries/lparcfg.c
>> @@ -433,12 +433,12 @@ static void parse_em_data(struct seq_file *m)
>>  
>>  static void maxmem_data(struct seq_file *m)
>>  {
>> -unsigned long maxmem = 0;
>> +u64 maxmem = 0;
> 
> This is 64-bit only code, so u64 == unsigned long.
> 
>> -maxmem += drmem_info->n_lmbs * drmem_info->lmb_size;
>> -maxmem += hugetlb_total_pages() * PAGE_SIZE;
>> +maxmem += (u64)drmem_info->n_lmbs * drmem_info->lmb_size;
> 
> The only problem AFAICS is n_lmbs is int and lmb_size is u32, so this
> multiplication will overflow.
> 
>> +maxmem += (u64)hugetlb_total_pages() * PAGE_SIZE;
> 
> hugetlb_total_pages() already returns unsigned long.
> 
>> -seq_printf(m, "MaxMem=%ld\n", maxmem);
>> +seq_printf(m, "MaxMem=%llu\n", maxmem);
>>  }
> 
> This should be sufficient?
> 
> diff --git a/arch/powerpc/platforms/pseries/lparcfg.c 
> b/arch/powerpc/platforms/pseries/lparcfg.c
> index e33e8bc4b69b..38c306551f76 100644
> --- a/arch/powerpc/platforms/pseries/lparcfg.c
> +++ b/arch/powerpc/platforms/pseries/lparcfg.c
> @@ -435,10 +435,10 @@ static void maxmem_data(struct seq_file *m)
>  {
> unsigned long maxmem = 0;
>  
> -   maxmem += drmem_info->n_lmbs * drmem_info->lmb_size;
> +   maxmem += (unsigned long)drmem_info->n_lmbs * drmem_info->lmb_size;
> maxmem += hugetlb_total_pages() * PAGE_SIZE;
>  
> -   seq_printf(m, "MaxMem=%ld\n", maxmem);
> +   seq_printf(m, "MaxMem=%lu\n", maxmem);
>  }
>  
>  static int pseries_lparcfg_data(struct seq_file *m, void *v)
> 
> 
> cheers
> 

Trying it out.

-- 
Michael W. Bringmann
Linux Technology Center
IBM Corporation
Tie-Line  363-5196
External: (512) 286-5196
Cell:   (512) 466-0650
m...@linux.ibm.com


Re: [PATCH v2] Fix display of Maximum Memory

2020-01-15 Thread Michael Ellerman
Michael Bringmann  writes:
> Correct overflow problem in calculation+display of Maximum Memory
> value to syscfg where 32bits is insufficient.
>
> Signed-off-by: Michael Bringmann 
> ---
>  arch/powerpc/platforms/pseries/lparcfg.c | 8 
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/lparcfg.c 
> b/arch/powerpc/platforms/pseries/lparcfg.c
> index e33e8bc..f00411c 100644
> --- a/arch/powerpc/platforms/pseries/lparcfg.c
> +++ b/arch/powerpc/platforms/pseries/lparcfg.c
> @@ -433,12 +433,12 @@ static void parse_em_data(struct seq_file *m)
>  
>  static void maxmem_data(struct seq_file *m)
>  {
> - unsigned long maxmem = 0;
> + u64 maxmem = 0;

This is 64-bit only code, so u64 == unsigned long.

> - maxmem += drmem_info->n_lmbs * drmem_info->lmb_size;
> - maxmem += hugetlb_total_pages() * PAGE_SIZE;
> + maxmem += (u64)drmem_info->n_lmbs * drmem_info->lmb_size;

The only problem AFAICS is n_lmbs is int and lmb_size is u32, so this
multiplication will overflow.

> + maxmem += (u64)hugetlb_total_pages() * PAGE_SIZE;

hugetlb_total_pages() already returns unsigned long.

> - seq_printf(m, "MaxMem=%ld\n", maxmem);
> + seq_printf(m, "MaxMem=%llu\n", maxmem);
>  }

This should be sufficient?

diff --git a/arch/powerpc/platforms/pseries/lparcfg.c 
b/arch/powerpc/platforms/pseries/lparcfg.c
index e33e8bc4b69b..38c306551f76 100644
--- a/arch/powerpc/platforms/pseries/lparcfg.c
+++ b/arch/powerpc/platforms/pseries/lparcfg.c
@@ -435,10 +435,10 @@ static void maxmem_data(struct seq_file *m)
 {
unsigned long maxmem = 0;
 
-   maxmem += drmem_info->n_lmbs * drmem_info->lmb_size;
+   maxmem += (unsigned long)drmem_info->n_lmbs * drmem_info->lmb_size;
maxmem += hugetlb_total_pages() * PAGE_SIZE;
 
-   seq_printf(m, "MaxMem=%ld\n", maxmem);
+   seq_printf(m, "MaxMem=%lu\n", maxmem);
 }
 
 static int pseries_lparcfg_data(struct seq_file *m, void *v)


cheers


Re: [PATCH v2] Fix display of Maximum Memory

2020-01-15 Thread Tyrel Datwyler
On 1/15/20 6:53 AM, Michael Bringmann wrote:
> Correct overflow problem in calculation+display of Maximum Memory
> value to syscfg where 32bits is insufficient.
> 

Probably needs the following Fixes tag:

Fixes: 772b039fd9a7 ("powerpc/pseries: Export maximum memory value")

otherwise,

Reviewed-by: Tyrel Datwyler 

> Signed-off-by: Michael Bringmann 
> ---
>  arch/powerpc/platforms/pseries/lparcfg.c | 8 
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/powerpc/platforms/pseries/lparcfg.c 
> b/arch/powerpc/platforms/pseries/lparcfg.c
> index e33e8bc..f00411c 100644
> --- a/arch/powerpc/platforms/pseries/lparcfg.c
> +++ b/arch/powerpc/platforms/pseries/lparcfg.c
> @@ -433,12 +433,12 @@ static void parse_em_data(struct seq_file *m)
> 
>  static void maxmem_data(struct seq_file *m)
>  {
> - unsigned long maxmem = 0;
> + u64 maxmem = 0;
> 
> - maxmem += drmem_info->n_lmbs * drmem_info->lmb_size;
> - maxmem += hugetlb_total_pages() * PAGE_SIZE;
> + maxmem += (u64)drmem_info->n_lmbs * drmem_info->lmb_size;
> + maxmem += (u64)hugetlb_total_pages() * PAGE_SIZE;
> 
> - seq_printf(m, "MaxMem=%ld\n", maxmem);
> + seq_printf(m, "MaxMem=%llu\n", maxmem);
>  }
> 
>  static int pseries_lparcfg_data(struct seq_file *m, void *v)
> 



Re: [PATCH v2] Fix display of Maximum Memory

2020-01-15 Thread Christophe Leroy




Le 15/01/2020 à 15:53, Michael Bringmann a écrit :

Correct overflow problem in calculation+display of Maximum Memory
value to syscfg where 32bits is insufficient.

Signed-off-by: Michael Bringmann 


Reviewed-by: Christophe Leroy 


---
  arch/powerpc/platforms/pseries/lparcfg.c | 8 
  1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/lparcfg.c 
b/arch/powerpc/platforms/pseries/lparcfg.c
index e33e8bc..f00411c 100644
--- a/arch/powerpc/platforms/pseries/lparcfg.c
+++ b/arch/powerpc/platforms/pseries/lparcfg.c
@@ -433,12 +433,12 @@ static void parse_em_data(struct seq_file *m)
  
  static void maxmem_data(struct seq_file *m)

  {
-   unsigned long maxmem = 0;
+   u64 maxmem = 0;
  
-	maxmem += drmem_info->n_lmbs * drmem_info->lmb_size;

-   maxmem += hugetlb_total_pages() * PAGE_SIZE;
+   maxmem += (u64)drmem_info->n_lmbs * drmem_info->lmb_size;
+   maxmem += (u64)hugetlb_total_pages() * PAGE_SIZE;
  
-	seq_printf(m, "MaxMem=%ld\n", maxmem);

+   seq_printf(m, "MaxMem=%llu\n", maxmem);
  }
  
  static int pseries_lparcfg_data(struct seq_file *m, void *v)




[PATCH v2] Fix display of Maximum Memory

2020-01-15 Thread Michael Bringmann
Correct overflow problem in calculation+display of Maximum Memory
value to syscfg where 32bits is insufficient.

Signed-off-by: Michael Bringmann 
---
 arch/powerpc/platforms/pseries/lparcfg.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/lparcfg.c 
b/arch/powerpc/platforms/pseries/lparcfg.c
index e33e8bc..f00411c 100644
--- a/arch/powerpc/platforms/pseries/lparcfg.c
+++ b/arch/powerpc/platforms/pseries/lparcfg.c
@@ -433,12 +433,12 @@ static void parse_em_data(struct seq_file *m)
 
 static void maxmem_data(struct seq_file *m)
 {
-   unsigned long maxmem = 0;
+   u64 maxmem = 0;
 
-   maxmem += drmem_info->n_lmbs * drmem_info->lmb_size;
-   maxmem += hugetlb_total_pages() * PAGE_SIZE;
+   maxmem += (u64)drmem_info->n_lmbs * drmem_info->lmb_size;
+   maxmem += (u64)hugetlb_total_pages() * PAGE_SIZE;
 
-   seq_printf(m, "MaxMem=%ld\n", maxmem);
+   seq_printf(m, "MaxMem=%llu\n", maxmem);
 }
 
 static int pseries_lparcfg_data(struct seq_file *m, void *v)
-- 
1.8.3.1