> On Jul 12, 2019, at 6:46 PM, David Miller <davem@xxxxxxxxxxxxx> wrote: > > From: Qian Cai <cai@xxxxxx> > Date: Fri, 12 Jul 2019 15:23:21 -0400 > >> The commit d66acc39c7ce ("bitops: Optimise get_order()") introduced a >> problem for the be2net driver as "rx_frag_size" could be a module >> parameter that can be changed while loading the module. > > Why is this a problem? Well, for example, if rx_frag_size was set to 8096 when loading the module, the kernel has already used the default value 2048 during compilation time. > >> That commit checks __builtin_constant_p() first in get_order() which >> cause "adapter->big_page_size" to be assigned a value based on the >> the default "rx_frag_size" value at the compilation time. It also >> generate a compilation warning, > > rx_frag_size is not a constant, therefore the __builtin_constant_p() > test should not pass. > > This explanation doesn't seem valid. Actually, GCC would consider it a const with -O2 optimized level because it found that it was never modified and it does not understand it is a module parameter. Considering the following code. # cat const.c #include <stdio.h> static int a = 1; int main(void) { if (__builtin_constant_p(a)) printf("a is a const.\n"); return 0; } # gcc -O2 const.c -o const # ./const a is a const.