• C
    nodemask.h: fix compilation error with GCC12 · fed1a815
    Christophe de Dinechin 提交于
    stable inclusion
    from stable-v5.10.121
    commit 90ad54714e14933d4210ade416015622b834609b
    category: bugfix
    bugzilla: https://gitee.com/openeuler/kernel/issues/I5L6CQ
    
    Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=90ad54714e14933d4210ade416015622b834609b
    
    --------------------------------
    
    commit 37462a92 upstream.
    
    With gcc version 12.0.1 20220401 (Red Hat 12.0.1-0), building with
    defconfig results in the following compilation error:
    
    |   CC      mm/swapfile.o
    | mm/swapfile.c: In function `setup_swap_info':
    | mm/swapfile.c:2291:47: error: array subscript -1 is below array bounds
    |  of `struct plist_node[]' [-Werror=array-bounds]
    |  2291 |                                 p->avail_lists[i].prio = 1;
    |       |                                 ~~~~~~~~~~~~~~^~~
    | In file included from mm/swapfile.c:16:
    | ./include/linux/swap.h:292:27: note: while referencing `avail_lists'
    |   292 |         struct plist_node avail_lists[]; /*
    |       |                           ^~~~~~~~~~~
    
    This is due to the compiler detecting that the mask in
    node_states[__state] could theoretically be zero, which would lead to
    first_node() returning -1 through find_first_bit.
    
    I believe that the warning/error is legitimate.  I first tried adding a
    test to check that the node mask is not emtpy, since a similar test exists
    in the case where MAX_NUMNODES == 1.
    
    However, adding the if statement causes other warnings to appear in
    for_each_cpu_node_but, because it introduces a dangling else ambiguity.
    And unfortunately, GCC is not smart enough to detect that the added test
    makes the case where (node) == -1 impossible, so it still complains with
    the same message.
    
    This is why I settled on replacing that with a harmless, but relatively
    useless (node) >= 0 test.  Based on the warning for the dangling else, I
    also decided to fix the case where MAX_NUMNODES == 1 by moving the
    condition inside the for loop.  It will still only be tested once.  This
    ensures that the meaning of an else following for_each_node_mask or
    derivatives would not silently have a different meaning depending on the
    configuration.
    
    Link: https://lkml.kernel.org/r/20220414150855.2407137-3-dinechin@redhat.comSigned-off-by: NChristophe de Dinechin <christophe@dinechin.org>
    Signed-off-by: NChristophe de Dinechin <dinechin@redhat.com>
    Reviewed-by: NAndrew Morton <akpm@linux-foundation.org>
    Cc: Ben Segall <bsegall@google.com>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
    Cc: Vincent Guittot <vincent.guittot@linaro.org>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Daniel Bristot de Oliveira <bristot@redhat.com>
    Cc: Jason Wang <jasowang@redhat.com>
    Cc: Zhen Lei <thunder.leizhen@huawei.com>
    Cc: Juri Lelli <juri.lelli@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
    fed1a815
nodemask.h 18.6 KB