lkml.org 
[lkml]   [2018]   [Mar]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 093/140] dm bufio: avoid false-positive Wmaybe-uninitialized warning
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Arnd Bergmann <arnd@arndb.de>

    commit 590347e4000356f55eb10b03ced2686bd74dab40 upstream.

    gcc-6.3 and earlier show a new warning after a seemingly unrelated
    change to the arm64 PAGE_KERNEL definition:

    In file included from drivers/md/dm-bufio.c:14:0:
    drivers/md/dm-bufio.c: In function 'alloc_buffer':
    include/linux/sched/mm.h:182:56: warning: 'noio_flag' may be used uninitialized in this function [-Wmaybe-uninitialized]
    current->flags = (current->flags & ~PF_MEMALLOC_NOIO) | flags;
    ^

    The same warning happened earlier on linux-3.18 for MIPS and I did a
    workaround for that, but now it's come back.

    gcc-7 and newer are apparently smart enough to figure this out, and
    other architectures don't show it, so the best I could come up with is
    to rework the caller slightly in a way that makes it obvious enough to
    all arm64 compilers what is happening here.

    Fixes: 41acec624087 ("arm64: kpti: Make use of nG dependent on arm64_kernel_unmapped_at_el0()")
    Link: https://patchwork.kernel.org/patch/9692829/
    Cc: stable@vger.kernel.org
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    [snitzer: moved declarations inside conditional, altered vmalloc return]
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/md/dm-bufio.c | 16 ++++++----------
    1 file changed, 6 insertions(+), 10 deletions(-)

    --- a/drivers/md/dm-bufio.c
    +++ b/drivers/md/dm-bufio.c
    @@ -386,9 +386,6 @@ static void __cache_size_refresh(void)
    static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask,
    enum data_mode *data_mode)
    {
    - unsigned noio_flag;
    - void *ptr;
    -
    if (c->block_size <= DM_BUFIO_BLOCK_SIZE_SLAB_LIMIT) {
    *data_mode = DATA_MODE_SLAB;
    return kmem_cache_alloc(DM_BUFIO_CACHE(c), gfp_mask);
    @@ -412,16 +409,15 @@ static void *alloc_buffer_data(struct dm
    * all allocations done by this process (including pagetables) are done
    * as if GFP_NOIO was specified.
    */
    + if (gfp_mask & __GFP_NORETRY) {
    + unsigned noio_flag = memalloc_noio_save();
    + void *ptr = __vmalloc(c->block_size, gfp_mask, PAGE_KERNEL);

    - if (gfp_mask & __GFP_NORETRY)
    - noio_flag = memalloc_noio_save();
    -
    - ptr = __vmalloc(c->block_size, gfp_mask, PAGE_KERNEL);
    -
    - if (gfp_mask & __GFP_NORETRY)
    memalloc_noio_restore(noio_flag);
    + return ptr;
    + }

    - return ptr;
    + return __vmalloc(c->block_size, gfp_mask, PAGE_KERNEL);
    }

    /*

    \
     
     \ /
      Last update: 2018-03-13 16:54    [W:4.279 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site