diff mbox series

mm: thp: avoid uninitialized variable use

Message ID 20171215125129.2948634-1-arnd@arndb.de
State New
Headers show
Series mm: thp: avoid uninitialized variable use | expand

Commit Message

Arnd Bergmann Dec. 15, 2017, 12:51 p.m. UTC
When the down_read_trylock() fails, 'vma' has not been initialized
yet, which gcc now warns about:

mm/khugepaged.c: In function 'khugepaged':
mm/khugepaged.c:1659:25: error: 'vma' may be used uninitialized in this function [-Werror=maybe-uninitialized]

Presumable we are not supposed to call find_vma() without the mmap_sem
either, so setting it to NULL for this case seems appropriate.

Fixes: 0951b59acf3a ("mm: thp: use down_read_trylock() in khugepaged to avoid long block")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

---
I'm not completely sure this patch is sufficient, it gets rid of
the warning, but it would be good to have the code reviewed better
to see if other problems remain that result from down_read_trylock()
patch.
---
 mm/khugepaged.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

-- 
2.9.0

Comments

Michal Hocko Dec. 15, 2017, 1:03 p.m. UTC | #1
On Fri 15-12-17 13:51:04, Arnd Bergmann wrote:
> When the down_read_trylock() fails, 'vma' has not been initialized

> yet, which gcc now warns about:

> 

> mm/khugepaged.c: In function 'khugepaged':

> mm/khugepaged.c:1659:25: error: 'vma' may be used uninitialized in this function [-Werror=maybe-uninitialized]


ups missed that

> 

> Presumable we are not supposed to call find_vma() without the mmap_sem

> either, so setting it to NULL for this case seems appropriate.


yes

> Fixes: 0951b59acf3a ("mm: thp: use down_read_trylock() in khugepaged to avoid long block")


This sha is not stable because this is a mmotm tree. I assume Andrew will fold
it to mm-thp-use-down_read_trylock-in-khugepaged-to-avoid-long-block.patch.
The patch looks good to me. I would initialize the vma in the
declaration, but that is a minor thing.

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>


Acked-by: Michal Hocko <mhocko@suse.com>


> ---

> I'm not completely sure this patch is sufficient, it gets rid of

> the warning, but it would be good to have the code reviewed better

> to see if other problems remain that result from down_read_trylock()

> patch.

> ---

>  mm/khugepaged.c | 5 ++---

>  1 file changed, 2 insertions(+), 3 deletions(-)

> 

> diff --git a/mm/khugepaged.c b/mm/khugepaged.c

> index 521b908f9600..b7e2268dfc9a 100644

> --- a/mm/khugepaged.c

> +++ b/mm/khugepaged.c

> @@ -1677,11 +1677,10 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages,

>  	 * Don't wait for semaphore (to avoid long wait times).  Just move to

>  	 * the next mm on the list.

>  	 */

> +	vma = NULL;

>  	if (unlikely(!down_read_trylock(&mm->mmap_sem)))

>  		goto breakouterloop_mmap_sem;

> -	if (unlikely(khugepaged_test_exit(mm)))

> -		vma = NULL;

> -	else

> +	if (likely(!khugepaged_test_exit(mm)))

>  		vma = find_vma(mm, khugepaged_scan.address);

>  

>  	progress++;

> -- 

> 2.9.0

> 


-- 
Michal Hocko
SUSE Labs
Yang Shi Dec. 15, 2017, 6:01 p.m. UTC | #2
On 12/15/17 4:51 AM, Arnd Bergmann wrote:
> When the down_read_trylock() fails, 'vma' has not been initialized

> yet, which gcc now warns about:

> 

> mm/khugepaged.c: In function 'khugepaged':

> mm/khugepaged.c:1659:25: error: 'vma' may be used uninitialized in this function [-Werror=maybe-uninitialized]


Arnd,

Thanks for catching this. I'm wondering why my test didn't catch it. It 
might be because my gcc is old. I'm using gcc 4.8.5 on centos 7.

Regards,
Yang

> 

> Presumable we are not supposed to call find_vma() without the mmap_sem

> either, so setting it to NULL for this case seems appropriate.

> 

> Fixes: 0951b59acf3a ("mm: thp: use down_read_trylock() in khugepaged to avoid long block")

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

> ---

> I'm not completely sure this patch is sufficient, it gets rid of

> the warning, but it would be good to have the code reviewed better

> to see if other problems remain that result from down_read_trylock()

> patch.

> ---

>   mm/khugepaged.c | 5 ++---

>   1 file changed, 2 insertions(+), 3 deletions(-)

> 

> diff --git a/mm/khugepaged.c b/mm/khugepaged.c

> index 521b908f9600..b7e2268dfc9a 100644

> --- a/mm/khugepaged.c

> +++ b/mm/khugepaged.c

> @@ -1677,11 +1677,10 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages,

>   	 * Don't wait for semaphore (to avoid long wait times).  Just move to

>   	 * the next mm on the list.

>   	 */

> +	vma = NULL;

>   	if (unlikely(!down_read_trylock(&mm->mmap_sem)))

>   		goto breakouterloop_mmap_sem;

> -	if (unlikely(khugepaged_test_exit(mm)))

> -		vma = NULL;

> -	else

> +	if (likely(!khugepaged_test_exit(mm)))

>   		vma = find_vma(mm, khugepaged_scan.address);

>   

>   	progress++;

>
Arnd Bergmann Dec. 16, 2017, 12:24 p.m. UTC | #3
On Fri, Dec 15, 2017 at 7:01 PM, Yang Shi <yang.s@alibaba-inc.com> wrote:
>

>

> On 12/15/17 4:51 AM, Arnd Bergmann wrote:

>>

>> When the down_read_trylock() fails, 'vma' has not been initialized

>> yet, which gcc now warns about:

>>

>> mm/khugepaged.c: In function 'khugepaged':

>> mm/khugepaged.c:1659:25: error: 'vma' may be used uninitialized in this

>> function [-Werror=maybe-uninitialized]

>

>

> Arnd,

>

> Thanks for catching this. I'm wondering why my test didn't catch it. It

> might be because my gcc is old. I'm using gcc 4.8.5 on centos 7.


Correct, gcc-4.8 and earlier have too many false-positive warnings with
-Wmaybe-uninitialized, so we turn it off on those versions. 4.9 is much
better here, but I'd recommend using gcc-6 or gcc-7 when you upgrade,
they have a much better set of default warnings besides producing better
binary code.

See http://git.infradead.org/users/segher/buildall.git for a simple way
to build toolchains suitable for building kernels in varying architectures
and versions.

       Arnd
Yang Shi Dec. 16, 2017, 10:25 p.m. UTC | #4
On 12/16/17 4:24 AM, Arnd Bergmann wrote:
> On Fri, Dec 15, 2017 at 7:01 PM, Yang Shi <yang.s@alibaba-inc.com> wrote:

>>

>>

>> On 12/15/17 4:51 AM, Arnd Bergmann wrote:

>>>

>>> When the down_read_trylock() fails, 'vma' has not been initialized

>>> yet, which gcc now warns about:

>>>

>>> mm/khugepaged.c: In function 'khugepaged':

>>> mm/khugepaged.c:1659:25: error: 'vma' may be used uninitialized in this

>>> function [-Werror=maybe-uninitialized]

>>

>>

>> Arnd,

>>

>> Thanks for catching this. I'm wondering why my test didn't catch it. It

>> might be because my gcc is old. I'm using gcc 4.8.5 on centos 7.

> 

> Correct, gcc-4.8 and earlier have too many false-positive warnings with

> -Wmaybe-uninitialized, so we turn it off on those versions. 4.9 is much

> better here, but I'd recommend using gcc-6 or gcc-7 when you upgrade,

> they have a much better set of default warnings besides producing better

> binary code.


Thanks, I just upgraded gcc to 6.4 on my cetnos 7 machine. But, I ran 
into a build error with 4.15-rc3 kernel, but 4.14 is fine. I bisected to 
a commit in Makefile. I will email my bug report to the mailing list.

Regards,
Yang

> 

> See http://git.infradead.org/users/segher/buildall.git for a simple way

> to build toolchains suitable for building kernels in varying architectures

> and versions.

> 

>         Arnd

>
diff mbox series

Patch

diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index 521b908f9600..b7e2268dfc9a 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -1677,11 +1677,10 @@  static unsigned int khugepaged_scan_mm_slot(unsigned int pages,
 	 * Don't wait for semaphore (to avoid long wait times).  Just move to
 	 * the next mm on the list.
 	 */
+	vma = NULL;
 	if (unlikely(!down_read_trylock(&mm->mmap_sem)))
 		goto breakouterloop_mmap_sem;
-	if (unlikely(khugepaged_test_exit(mm)))
-		vma = NULL;
-	else
+	if (likely(!khugepaged_test_exit(mm)))
 		vma = find_vma(mm, khugepaged_scan.address);
 
 	progress++;