diff mbox series

mm/cma: Fix crash on CMA allocation if bitmap allocation fails

Message ID 20190325081309.6004-1-zbestahu@gmail.com (mailing list archive)
State New, archived
Headers show
Series mm/cma: Fix crash on CMA allocation if bitmap allocation fails | expand

Commit Message

Yue Hu March 25, 2019, 8:13 a.m. UTC
From: Yue Hu <huyue2@yulong.com>

A previous commit f022d8cb7ec7 ("mm: cma: Don't crash on allocation
if CMA area can't be activated") fixes the crash issue when activation
fails via setting cma->count as 0, same logic exists if bitmap
allocation fails.

Signed-off-by: Yue Hu <huyue2@yulong.com>
---
 mm/cma.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Anshuman Khandual March 25, 2019, 10:14 a.m. UTC | #1
On 03/25/2019 01:43 PM, Yue Hu wrote:
> From: Yue Hu <huyue2@yulong.com>
> 
> A previous commit f022d8cb7ec7 ("mm: cma: Don't crash on allocation
> if CMA area can't be activated") fixes the crash issue when activation
> fails via setting cma->count as 0, same logic exists if bitmap
> allocation fails.
> 
> Signed-off-by: Yue Hu <huyue2@yulong.com>

Looks good to me. Just wondering if cma->count =  0 should be wrapped around in
a helper which explicitly states that this cma cannot be used for allocation.

Nonetheless.

Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Andrew Morton March 25, 2019, 10:15 p.m. UTC | #2
On Mon, 25 Mar 2019 16:13:09 +0800 Yue Hu <zbestahu@gmail.com> wrote:

> From: Yue Hu <huyue2@yulong.com>
> 
> A previous commit f022d8cb7ec7 ("mm: cma: Don't crash on allocation
> if CMA area can't be activated") fixes the crash issue when activation
> fails via setting cma->count as 0, same logic exists if bitmap
> allocation fails.
> 
> --- a/mm/cma.c
> +++ b/mm/cma.c
> @@ -106,8 +106,10 @@ static int __init cma_activate_area(struct cma *cma)
>  
>  	cma->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
>  
> -	if (!cma->bitmap)
> +	if (!cma->bitmap) {
> +		cma->count = 0;
>  		return -ENOMEM;
> +	}
>  
>  	WARN_ON_ONCE(!pfn_valid(pfn));
>  	zone = page_zone(pfn_to_page(pfn));

I'm unsure whether this is needed.

kmalloc() within __init code is generally considered to be a "can't
fail".

If this was the only issue then I guess I'd take the patch if only for
documentation/clarity purposes.  But cma_areas[] is in bss and is
guaranteed to be all-zeroes, so I suspect this bug is a can't-happen. 
And we could revert f022d8cb7ec7 if we could be bothered (I can't).
Yue Hu March 26, 2019, 1:59 a.m. UTC | #3
On Mon, 25 Mar 2019 15:15:41 -0700
Andrew Morton <akpm@linux-foundation.org> wrote:

> On Mon, 25 Mar 2019 16:13:09 +0800 Yue Hu <zbestahu@gmail.com> wrote:
> 
> > From: Yue Hu <huyue2@yulong.com>
> > 
> > A previous commit f022d8cb7ec7 ("mm: cma: Don't crash on allocation
> > if CMA area can't be activated") fixes the crash issue when activation
> > fails via setting cma->count as 0, same logic exists if bitmap
> > allocation fails.
> > 
> > --- a/mm/cma.c
> > +++ b/mm/cma.c
> > @@ -106,8 +106,10 @@ static int __init cma_activate_area(struct cma *cma)
> >  
> >  	cma->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
> >  
> > -	if (!cma->bitmap)
> > +	if (!cma->bitmap) {
> > +		cma->count = 0;
> >  		return -ENOMEM;
> > +	}
> >  
> >  	WARN_ON_ONCE(!pfn_valid(pfn));
> >  	zone = page_zone(pfn_to_page(pfn));  
> 
> I'm unsure whether this is needed.
> 
> kmalloc() within __init code is generally considered to be a "can't
> fail".
> 
> If this was the only issue then I guess I'd take the patch if only for
> documentation/clarity purposes.  But cma_areas[] is in bss and is
> guaranteed to be all-zeroes, so I suspect this bug is a can't-happen. 

However, firstly cma->count will be assigned to size >> PAGE_SHIFT in
cma_init_reserved_mem().

> And we could revert f022d8cb7ec7 if we could be bothered (I can't).
> 
>
diff mbox series

Patch

diff --git a/mm/cma.c b/mm/cma.c
index f5bf819..991a6ce 100644
--- a/mm/cma.c
+++ b/mm/cma.c
@@ -106,8 +106,10 @@  static int __init cma_activate_area(struct cma *cma)
 
 	cma->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
 
-	if (!cma->bitmap)
+	if (!cma->bitmap) {
+		cma->count = 0;
 		return -ENOMEM;
+	}
 
 	WARN_ON_ONCE(!pfn_valid(pfn));
 	zone = page_zone(pfn_to_page(pfn));