Skip to content

Turn on CONFIG_WERROR for x86_64 #245

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
nathanchance opened this issue Nov 19, 2021 · 3 comments · Fixed by #385
Closed

Turn on CONFIG_WERROR for x86_64 #245

nathanchance opened this issue Nov 19, 2021 · 3 comments · Fixed by #385
Assignees
Labels
blocked (linux) Blocked on an issue with Linux upstream enhancement New feature or request WIP Work in progress

Comments

@nathanchance
Copy link
Member

To turn this on, we need allmodconfig and allyesconfig to build without any warnings on linux-5.15.y, mainline, and -next with LLVM 11 through 14 (quite the matrix).

Current status as of November 18, 2021

  • linux-5.15.y @ v5.15.3:

    • LLVM 11: FAIL
    drivers/staging/greybus/audio_topology.c:977:12: error: stack frame size of 3304 bytes in function 'gbaudio_tplg_create_widget' [-Werror,-Wframe-larger-than=]
    static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module,
               ^
    1 error generated.
    
    • LLVM 12: FAIL
    drivers/staging/greybus/audio_topology.c:977:12: error: stack frame size of 3288 bytes in function 'gbaudio_tplg_create_widget' [-Werror,-Wframe-larger-than=]
    static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module,
              ^
    1 error generated.
    
    • LLVM 13: PASS
    • LLVM 14: FAIL
    drivers/power/reset/ltc2952-poweroff.c:164:28: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
          data->wde_interval = 300L * 1E6L;
                                    ^
    drivers/power/reset/ltc2952-poweroff.c:164:21: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
          data->wde_interval = 300L * 1E6L;
                             ^
    drivers/power/reset/ltc2952-poweroff.c:165:41: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
          data->trigger_delay = ktime_set(2, 500L*1E6L);
                                                 ^
    3 errors generated.
    
    drivers/usb/dwc2/hcd_queue.c:1744:25: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
                          delay = ktime_set(0, DWC2_RETRY_WAIT_DELAY);
                                               ^
    drivers/usb/dwc2/hcd_queue.c:62:34: note: expanded from macro 'DWC2_RETRY_WAIT_DELAY'
    #define DWC2_RETRY_WAIT_DELAY (1 * 1E6L)
                                   ^
    1 error generated.
    
    drivers/gpu/drm/i915/intel_pm.c:3066:12: error: use of bitwise '|' with boolean operands [-Werror,-Wbitwise-instead-of-logical]
            changed = ilk_increase_wm_latency(dev_priv, dev_priv->wm.pri_latency, 12) |
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    drivers/gpu/drm/i915/intel_pm.c:3066:12: note: cast one or both operands to int to silence this warning
    drivers/gpu/drm/i915/intel_pm.c:3066:12: error: use of bitwise '|' with boolean operands [-Werror,-Wbitwise-instead-of-logical]
            changed = ilk_increase_wm_latency(dev_priv, dev_priv->wm.pri_latency, 12) |
                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                                                    ||
    drivers/gpu/drm/i915/intel_pm.c:3066:12: note: cast one or both operands to int to silence this warning
    2 errors generated.
    
    In file included from drivers/staging/wlan-ng/prism2usb.c:2:
    drivers/staging/wlan-ng/hfa384x_usb.c:3787:7: error: use of bitwise '|' with boolean operands [-Werror,-Wbitwise-instead-of-logical]
              ((test_and_clear_bit(THROTTLE_RX, &hw->usb_flags) &&
              ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    drivers/staging/wlan-ng/hfa384x_usb.c:3787:7: note: cast one or both operands to int to silence this warning
    1 error generated.
    
  • Mainline @ 42eb8fdac2fc5d62392dcfcf0253753e821a97b0:

    • LLVM 11: FAIL
    drivers/staging/greybus/audio_topology.c:977:12: error: stack frame size of 3304 bytes in function 'gbaudio_tplg_create_widget' [-Werror,-Wframe-larger-than=]
    static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module,
               ^
    1 error generated.
    
    • LLVM 12: FAIL
    drivers/staging/greybus/audio_topology.c:977:12: error: stack frame size of 3288 bytes in function 'gbaudio_tplg_create_widget' [-Werror,-Wframe-larger-than=]
    static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module,
              ^
    1 error generated.
    
    • LLVM 13: PASS
    • LLVM 14: FAIL
    drivers/gpu/drm/i915/intel_pm.c:3065:12: error: use of bitwise '|' with boolean operands [-Werror,-Wbitwise-instead-of-logical]
            changed = ilk_increase_wm_latency(dev_priv, dev_priv->wm.pri_latency, 12) |
                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    drivers/gpu/drm/i915/intel_pm.c:3065:12: note: cast one or both operands to int to silence this warning
    drivers/gpu/drm/i915/intel_pm.c:3065:12: error: use of bitwise '|' with boolean operands [-Werror,-Wbitwise-instead-of-logical]
            changed = ilk_increase_wm_latency(dev_priv, dev_priv->wm.pri_latency, 12) |
                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                                                      ||
    drivers/gpu/drm/i915/intel_pm.c:3065:12: note: cast one or both operands to int to silence this warning
    2 errors generated.
    
    drivers/power/reset/ltc2952-poweroff.c:162:28: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
            data->wde_interval = 300L * 1E6L;
                                      ^
    drivers/power/reset/ltc2952-poweroff.c:162:21: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
            data->wde_interval = 300L * 1E6L;
                             ^
    drivers/power/reset/ltc2952-poweroff.c:163:41: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
            data->trigger_delay = ktime_set(2, 500L*1E6L);
                                                   ^
    3 errors generated.
    
    drivers/usb/dwc2/hcd_queue.c:1744:25: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
                            delay = ktime_set(0, DWC2_RETRY_WAIT_DELAY);
                                                 ^
    drivers/usb/dwc2/hcd_queue.c:62:34: note: expanded from macro 'DWC2_RETRY_WAIT_DELAY'
    #define DWC2_RETRY_WAIT_DELAY (1 * 1E6L)
                                     ^
    1 error generated.
    
  • -next @ next-20211118:

    • LLVM 11: FAIL
    drivers/staging/greybus/audio_topology.c:977:12: error: stack frame size of 3304 bytes in function 'gbaudio_tplg_create_widget' [-Werror,-Wframe-larger-than=]
    static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module,
               ^
    1 error generated.
    
    • LLVM 12: FAIL
    drivers/staging/greybus/audio_topology.c:977:12: error: stack frame size of 3288 bytes in function 'gbaudio_tplg_create_widget' [-Werror,-Wframe-larger-than=]
    static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module,
              ^
    1 error generated.
    
    • LLVM 13: PASS
    • LLVM 14: FAIL
    drivers/power/reset/ltc2952-poweroff.c:162:28: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
          data->wde_interval = 300L * 1E6L;
                                    ^
    drivers/power/reset/ltc2952-poweroff.c:162:21: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
          data->wde_interval = 300L * 1E6L;
                             ^
    drivers/power/reset/ltc2952-poweroff.c:163:41: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
          data->trigger_delay = ktime_set(2, 500L*1E6L);
                                                 ^
    3 errors generated.
    

Analysis:

  • drivers/staging/greybus/audio_topology.c: @arndb sent a patch back in January with some feedback but I never saw a respin.
  • drivers/gpu/drm/i915/intel_pm.c: I sent a patch, which has been accepted but it missed the 5.16 merge window, meaning it will not be fixed until 5.17 :(
  • drivers/power/reset/ltc2952-poweroff.c: I sent a patch, which has been accepted in a fixes branch, meaning it should be merged into mainline soon.
  • drivers/usb/dwc2/hcd_queue.c: I sent a patch, which has been accepted in a fixes branch, meaning it should be merged into mainline soon.
  • drivers/staging/wlan-ng/hfa384x_usb.c: The fix is available in 5.16-rc1, it just needs to be backported to stable.
@nathanchance nathanchance added enhancement New feature or request WIP Work in progress labels Nov 19, 2021
@nathanchance nathanchance self-assigned this Nov 19, 2021
@nathanchance nathanchance added the blocked (linux) Blocked on an issue with Linux upstream label Nov 19, 2021
@nathanchance
Copy link
Member Author

Mainline status as of 12/9/2021

I am going to start posting updates here against mainline, as -next is a moving target and stable will be fixable based on mainline's status. Android has disabled CONFIG_WERROR as well so this should be high priority for us to fix.

Outstanding warnings with allmodconfig:

@nathanchance
Copy link
Member Author

As of fb3b0673b7d5 ("Merge tag 'mailbox-v5.17' of git://git.linaro.org/landing-teams/working/fujitsu/integration"), ARCH=x86_64 allmodconfig is warning free.

I requested backports to 5.15 and 5.16, which will allow us to enable CONFIG_WERROR=y for these trees.

However, linux-next is not warning free, due to 743b237c3a7b ("scsi: storvsc: Add Isolation VM support for storvsc driver"), which adds a false positive instance of -Wshift-count-overflow, so this is now blocked on fixing that in the compiler and adding a workaround for older clang versions.

@nathanchance nathanchance added the blocked (llvm) Blocked on an issue with LLVM upstream label Jan 13, 2022
@nathanchance
Copy link
Member Author

Stable trees

5.15.21 and 5.16.7 remain warning free.

Mainline

5.17-rc3 has one warning:

drivers/hv/vmbus_drv.c:2082:29: error: shift count >= width of type [-Werror,-Wshift-count-overflow]
static u64 vmbus_dma_mask = DMA_BIT_MASK(64);
                            ^~~~~~~~~~~~~~~~
./include/linux/dma-mapping.h:76:54: note: expanded from macro 'DMA_BIT_MASK'
#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
                                                     ^ ~~~
1 error generated.

Fixed with https://git.kernel.org/hyperv/c/6bf625a4140f24b490766043b307f8252519578b, which will hopefully be in 5.17-rc4. This patch works around the compiler bug that I mention in my comment above, which allows us to remove the "blocked (llvm)" label.

-next

On next-20220208:

fs/io_uring.c:9396:9: error: variable 'ret' is uninitialized when used here [-Werror,-Wuninitialized]
        return ret;
               ^~~
fs/io_uring.c:9373:13: note: initialize the variable 'ret' to silence this warning
        int fd, ret;
                   ^
                    = 0
1 error generated.

Fixed by https://git.kernel.org/axboe/linux-block/c/4c65723081332607ca331072b0f8a90189e2e447, which should be in next-20220209.

There are also a few warnings from the new FORTIFY_SOURCE compile time checks with clang-14 and clang-15:

In file included from drivers/scsi/libfc/fc_elsct.c:17:
In file included from ./include/scsi/libfc.h:11:
In file included from ./include/linux/timer.h:6:
In file included from ./include/linux/ktime.h:24:
In file included from ./include/linux/time.h:60:
In file included from ./include/linux/time32.h:13:
In file included from ./include/linux/timex.h:65:
In file included from ./arch/arm64/include/asm/timex.h:8:
In file included from ./arch/arm64/include/asm/arch_timer.h:18:
In file included from ./include/linux/smp.h:13:
In file included from ./include/linux/cpumask.h:12:
In file included from ./include/linux/bitmap.h:11:
In file included from ./include/linux/string.h:253:
./include/linux/fortify-string.h:328:4: error: call to __write_overflow_field declared with 'warning' attribute: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror,-Wattribute-warning]
                        __write_overflow_field(p_size_field, size);
                        ^
./include/linux/fortify-string.h:328:4: error: call to __write_overflow_field declared with 'warning' attribute: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror,-Wattribute-warning]
2 errors generated.
In file included from drivers/misc/habanalabs/common/firmware_if.c:8:
In file included from drivers/misc/habanalabs/common/habanalabs.h:11:
In file included from drivers/misc/habanalabs/common/../include/common/cpucp_if.h:12:
In file included from ./include/linux/if_ether.h:19:
In file included from ./include/linux/skbuff.h:15:
In file included from ./include/linux/time.h:60:
In file included from ./include/linux/time32.h:13:
In file included from ./include/linux/timex.h:65:
In file included from ./arch/arm64/include/asm/timex.h:8:
In file included from ./arch/arm64/include/asm/arch_timer.h:18:
In file included from ./include/linux/smp.h:13:
In file included from ./include/linux/cpumask.h:12:
In file included from ./include/linux/bitmap.h:11:
In file included from ./include/linux/string.h:253:
./include/linux/fortify-string.h:242:4: error: call to __write_overflow_field declared with 'warning' attribute: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror,-Wattribute-warning]
                        __write_overflow_field(p_size_field, size);
                        ^
1 error generated.
In file included from drivers/net/ethernet/huawei/hinic/hinic_devlink.c:15:
In file included from ./include/linux/netlink.h:7:
In file included from ./include/linux/skbuff.h:15:
In file included from ./include/linux/time.h:60:
In file included from ./include/linux/time32.h:13:
In file included from ./include/linux/timex.h:65:
In file included from ./arch/arm64/include/asm/timex.h:8:
In file included from ./arch/arm64/include/asm/arch_timer.h:18:
In file included from ./include/linux/smp.h:13:
In file included from ./include/linux/cpumask.h:12:
In file included from ./include/linux/bitmap.h:11:
In file included from ./include/linux/string.h:253:
./include/linux/fortify-string.h:328:4: error: call to __write_overflow_field declared with 'warning' attribute: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror,-Wattribute-warning]
                        __write_overflow_field(p_size_field, size);
                        ^
1 error generated.

@nathanchance nathanchance removed the blocked (llvm) Blocked on an issue with LLVM upstream label Feb 8, 2022
nathanchance added a commit to nathanchance/continuous-integration2 that referenced this issue Jul 5, 2022
x86_64 all{mod,yes}config are now -Werror clean on 5.15, stable (5.18),
mainline (5.19-rc5), and next-20220705. Turn this on so we can catch new
warnings easier.

Closes: ClangBuiltLinux#245
Signed-off-by: Nathan Chancellor <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
blocked (linux) Blocked on an issue with Linux upstream enhancement New feature or request WIP Work in progress
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant