On Tue, Apr 21, 2026, at 21:12, Arnd Bergmann wrote:
> On Tue, Apr 21, 2026, at 21:06, Marco Elver wrote:
>> On Tue, 21 Apr 2026 at 17:26, Marco Elver <
el...@google.com> wrote:
>> [...]
>>> > To me, 2 makes more sense. The attribute requires gcc-11 or higher,
>>> > so you need to wrap that in a compiler version specific macro,
>>> > but since I only saw the warning with gcc-12 and higher, that
>>> > should be fine.
>>
>> Kindly test if you can:
>>
https://lore.kernel.org/all/20260421190351....@google.com/
>
> Applied to my randconfig tree and verified that this fixes the
> known warning (only one out of about 200 random configs). I'll
> let you know if something comes up by tomorrow.
Unfortunately, there are new warnings after your patches using
gcc-11. In 500 randconfig builds with that compiler, I saw 7
configurations failing with one of these four messages:
1.
In file included from include/asm-generic/rwonce.h:27,
from ./arch/x86/include/generated/asm/rwonce.h:1,
from include/linux/compiler.h:369,
from include/linux/build_bug.h:5,
from arch/x86/include/asm/current.h:5,
from include/linux/sched.h:12,
from include/linux/mempool.h:8,
from include/linux/bio.h:8,
from drivers/md/dm-bio-record.h:11,
from drivers/md/dm-raid1.c:9:
In function 'instrument_atomic_write',
inlined from 'atomic_set' at include/linux/atomic/atomic-instrumented.h:67:2,
inlined from 'reset_ms_flags' at drivers/md/dm-raid1.c:384:3,
inlined from 'do_recovery' at drivers/md/dm-raid1.c:413:3,
inlined from 'do_mirror' at drivers/md/dm-raid1.c:876:2:
include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread]
220 | #define kcsan_check_access __kcsan_check_access
| ^
include/linux/kcsan-checks.h:334:9: note: in expansion of macro 'kcsan_check_access'
334 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE)
| ^~~~~~~~~~~~~~~~~~
include/linux/instrumented.h:98:9: note: in expansion of macro 'kcsan_check_atomic_write'
98 | kcsan_check_atomic_write(v, size);
| ^~~~~~~~~~~~~~~~~~~~~~~~
include/linux/instrumented.h: In function 'do_mirror':
drivers/md/dm-raid1.c:59:27: note: at offset [504, 171798692304] into source object 'ti' of size 8
59 | struct dm_target *ti;
| ^~
In file included from include/asm-generic/rwonce.h:27,
from ./arch/x86/include/generated/asm/rwonce.h:1,
from include/linux/compiler.h:369,
from include/linux/build_bug.h:5,
from arch/x86/include/asm/current.h:5,
from include/linux/sched.h:12,
from include/linux/mempool.h:8,
from include/linux/bio.h:8,
from drivers/md/dm-bio-record.h:11,
from drivers/md/dm-raid1.c:9:
include/linux/kcsan-checks.h:37:6: note: in a call to function '__kcsan_check_access' declared with attribute 'access (none, 1)'
37 | void __kcsan_check_access(const volatile void *ptr, size_t size, int type) __access(none, 1);
| ^~~~~~~~~~~~~~~~~~~~
2.
In file included from include/asm-generic/rwonce.h:27,
from arch/arm64/include/asm/rwonce.h:81,
from include/linux/compiler.h:369,
from include/asm-generic/bug.h:5,
from arch/arm64/include/asm/bug.h:26,
from include/linux/bug.h:5,
from include/linux/random.h:6,
from include/crypto/curve25519.h:10,
from drivers/net/wireguard/messages.h:9,
from drivers/net/wireguard/noise.h:8,
from drivers/net/wireguard/device.h:9,
from drivers/net/wireguard/peer.h:9,
from drivers/net/wireguard/queueing.h:9,
from drivers/net/wireguard/receive.c:6:
In function 'instrument_atomic_read_write',
inlined from 'test_and_set_bit' at include/asm-generic/bitops/instrumented-atomic.h:71:2,
inlined from 'counter_validate' at drivers/net/wireguard/receive.c:325:9,
inlined from 'wg_packet_rx_poll' at drivers/net/wireguard/receive.c:461:7:
include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread]
220 | #define kcsan_check_access __kcsan_check_access
| ^
include/linux/kcsan-checks.h:336:9: note: in expansion of macro 'kcsan_check_access'
336 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE | KCSAN_ACCESS_COMPOUND)
| ^~~~~~~~~~~~~~~~~~
include/linux/instrumented.h:113:9: note: in expansion of macro 'kcsan_check_atomic_read_write'
113 | kcsan_check_atomic_read_write(v, size);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/wireguard/device.h:9,
from drivers/net/wireguard/peer.h:9,
from drivers/net/wireguard/queueing.h:9,
from drivers/net/wireguard/receive.c:6:
include/linux/instrumented.h: In function 'wg_packet_rx_poll':
drivers/net/wireguard/noise.h:19:13: note: at offset [80, 1096] into source object 'counter' of size 8
19 | u64 counter;
| ^~~~~~~
In file included from include/asm-generic/rwonce.h:27,
from arch/arm64/include/asm/rwonce.h:81,
from include/linux/compiler.h:369,
from include/asm-generic/bug.h:5,
from arch/arm64/include/asm/bug.h:26,
from include/linux/bug.h:5,
from include/linux/random.h:6,
from include/crypto/curve25519.h:10,
from drivers/net/wireguard/messages.h:9,
from drivers/net/wireguard/noise.h:8,
from drivers/net/wireguard/device.h:9,
from drivers/net/wireguard/peer.h:9,
from drivers/net/wireguard/queueing.h:9,
from drivers/net/wireguard/receive.c:6:
include/linux/kcsan-checks.h:37:6: note: in a call to function '__kcsan_check_access' declared with attribute 'access (none, 1)'
37 | void __kcsan_check_access(const volatile void *ptr, size_t size, int type) __access(none, 1);
| ^~~~~~~~~~~~~~~~~~~~
3.
In file included from include/asm-generic/rwonce.h:27,
from arch/arm64/include/asm/rwonce.h:81,
from include/linux/compiler.h:369,
from include/asm-generic/div64.h:27,
from ./arch/arm64/include/generated/asm/div64.h:1,
from include/linux/math.h:6,
from include/linux/delay.h:12,
from drivers/misc/bcm-vk/bcm_vk_msg.c:6:
In function 'instrument_atomic_write',
inlined from 'atomic_set' at include/linux/atomic/atomic-instrumented.h:67:2,
inlined from 'bcm_vk_get_ctx' at drivers/misc/bcm-vk/bcm_vk_msg.c:250:2,
inlined from 'bcm_vk_open' at drivers/misc/bcm-vk/bcm_vk_msg.c:980:8:
include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread]
220 | #define kcsan_check_access __kcsan_check_access
| ^
include/linux/kcsan-checks.h:334:9: note: in expansion of macro 'kcsan_check_access'
334 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE)
| ^~~~~~~~~~~~~~~~~~
include/linux/instrumented.h:98:9: note: in expansion of macro 'kcsan_check_atomic_write'
98 | kcsan_check_atomic_write(v, size);
| ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/misc/bcm-vk/bcm_vk_msg.c:17:
include/linux/instrumented.h: In function 'bcm_vk_open':
drivers/misc/bcm-vk/bcm_vk.h:359:25: note: at offset [1576, 23200] into source object 'pdev' of size 8
359 | struct pci_dev *pdev;
| ^~~~
In file included from include/asm-generic/rwonce.h:27,
from arch/arm64/include/asm/rwonce.h:81,
from include/linux/compiler.h:369,
from include/asm-generic/div64.h:27,
from ./arch/arm64/include/generated/asm/div64.h:1,
from include/linux/math.h:6,
from include/linux/delay.h:12,
from drivers/misc/bcm-vk/bcm_vk_msg.c:6:
include/linux/kcsan-checks.h:37:6: note: in a call to function '__kcsan_check_access' declared with attribute 'access (none, 1)'
37 | void __kcsan_check_access(const volatile void *ptr, size_t size, int type) __access(none, 1);
| ^~~~~~~~~~~~~~~~~~~~
In function 'instrument_atomic_write',
inlined from 'atomic_set' at include/linux/atomic/atomic-instrumented.h:67:2,
inlined from 'bcm_vk_get_ctx' at drivers/misc/bcm-vk/bcm_vk_msg.c:251:2,
inlined from 'bcm_vk_open' at drivers/misc/bcm-vk/bcm_vk_msg.c:980:8:
include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread]
220 | #define kcsan_check_access __kcsan_check_access
| ^
include/linux/kcsan-checks.h:334:9: note: in expansion of macro 'kcsan_check_access'
334 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE)
| ^~~~~~~~~~~~~~~~~~
include/linux/instrumented.h:98:9: note: in expansion of macro 'kcsan_check_atomic_write'
98 | kcsan_check_atomic_write(v, size);
| ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/misc/bcm-vk/bcm_vk_msg.c:17:
include/linux/instrumented.h: In function 'bcm_vk_open':
drivers/misc/bcm-vk/bcm_vk.h:359:25: note: at offset [1580, 23204] into source object 'pdev' of size 8
359 | struct pci_dev *pdev;
| ^~~~
In file included from include/asm-generic/rwonce.h:27,
from arch/arm64/include/asm/rwonce.h:81,
from include/linux/compiler.h:369,
from include/asm-generic/div64.h:27,
from ./arch/arm64/include/generated/asm/div64.h:1,
from include/linux/math.h:6,
from include/linux/delay.h:12,
from drivers/misc/bcm-vk/bcm_vk_msg.c:6:
include/linux/kcsan-checks.h:37:6: note: in a call to function '__kcsan_check_access' declared with attribute 'access (none, 1)'
37 | void __kcsan_check_access(const volatile void *ptr, size_t size, int type) __access(none, 1);
| ^~~~~~~~~~~~~~~~~~~~
4.
In file included from include/asm-generic/rwonce.h:27,
from ./arch/x86/include/generated/asm/rwonce.h:1,
from include/linux/compiler.h:369,
from include/asm-generic/bug.h:5,
from arch/x86/include/asm/bug.h:193,
from include/linux/bug.h:5,
from include/linux/mmdebug.h:5,
from include/linux/mm.h:7,
from mm/vmscan.c:15:
In function 'instrument_atomic_read_write',
inlined from 'atomic_long_add' at include/linux/atomic/atomic-instrumented.h:3260:2,
inlined from 'node_page_state_add' at include/linux/vmstat.h:172:2,
inlined from '__mod_node_page_state' at include/linux/vmstat.h:331:2,
inlined from 'shrink_active_list' at mm/vmscan.c:2149:2,
inlined from 'shrink_list' at mm/vmscan.c:2220:4,
inlined from 'shrink_lruvec' at mm/vmscan.c:5969:21:
include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread]
220 | #define kcsan_check_access __kcsan_check_access
| ^
include/linux/kcsan-checks.h:336:9: note: in expansion of macro 'kcsan_check_access'
336 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE | KCSAN_ACCESS_COMPOUND)
| ^~~~~~~~~~~~~~~~~~
include/linux/instrumented.h:113:9: note: in expansion of macro 'kcsan_check_atomic_read_write'
113 | kcsan_check_atomic_read_write(v, size);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from include/linux/gfp.h:7,
from include/linux/mm.h:8,
from mm/vmscan.c:15:
include/linux/instrumented.h: In function 'shrink_lruvec':
include/linux/mmzone.h:1478:21: note: at offset [10272, 10280] into source object 'node_zones' of size 7264
1478 | struct zone node_zones[MAX_NR_ZONES];
| ^~~~~~~~~~
In file included from include/asm-generic/rwonce.h:27,
from ./arch/x86/include/generated/asm/rwonce.h:1,
from include/linux/compiler.h:369,
from include/asm-generic/bug.h:5,
from arch/x86/include/asm/bug.h:193,
from include/linux/bug.h:5,
from include/linux/mmdebug.h:5,
from include/linux/mm.h:7,
from mm/vmscan.c:15:
include/linux/kcsan-checks.h:37:6: note: in a call to function '__kcsan_check_access' declared with attribute 'access (none, 1)'
37 | void __kcsan_check_access(const volatile void *ptr, size_t size, int type) __access(none, 1);
| ^~~~~~~~~~~~~~~~~~~~
In function 'instrument_atomic_read_write',
inlined from 'atomic_long_add' at include/linux/atomic/atomic-instrumented.h:3260:2,
inlined from 'node_page_state_add' at include/linux/vmstat.h:172:2,
inlined from '__mod_node_page_state' at include/linux/vmstat.h:331:2,
inlined from 'mod_lruvec_state' at include/linux/vmstat.h:536:2,
inlined from 'shrink_inactive_list' at mm/vmscan.c:1987:2,
inlined from 'shrink_list' at mm/vmscan.c:2226:9,
inlined from 'shrink_lruvec' at mm/vmscan.c:5969:21:
include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread]
220 | #define kcsan_check_access __kcsan_check_access
| ^
include/linux/kcsan-checks.h:336:9: note: in expansion of macro 'kcsan_check_access'
336 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE | KCSAN_ACCESS_COMPOUND)
| ^~~~~~~~~~~~~~~~~~
include/linux/instrumented.h:113:9: note: in expansion of macro 'kcsan_check_atomic_read_write'
113 | kcsan_check_atomic_read_write(v, size);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from include/linux/gfp.h:7,
from include/linux/mm.h:8,
from mm/vmscan.c:15:
include/linux/instrumented.h: In function 'shrink_lruvec':
include/linux/mmzone.h:1478:21: note: at offset [10624, 10648] into source object 'node_zones' of size 7264
1478 | struct zone node_zones[MAX_NR_ZONES];
| ^~~~~~~~~~
In file included from include/asm-generic/rwonce.h:27,
from ./arch/x86/include/generated/asm/rwonce.h:1,
from include/linux/compiler.h:369,
from include/asm-generic/bug.h:5,
from arch/x86/include/asm/bug.h:193,
from include/linux/bug.h:5,
from include/linux/mmdebug.h:5,
from include/linux/mm.h:7,
from mm/vmscan.c:15:
I've attached one .config for each of the above, but haven't looked in
too much detail. For the wireguard case, I managed to simplify the
code so gcc doesn't get confused by the pointer arithmetic:
--- a/drivers/net/wireguard/receive.c
+++ b/drivers/net/wireguard/receive.c
@@ -321,9 +321,8 @@ static bool counter_validate(struct noise_replay_counter *counter, u64 their_cou
WRITE_ONCE(counter->counter, their_counter);
}
- index &= (COUNTER_BITS_TOTAL / BITS_PER_LONG) - 1;
- ret = !test_and_set_bit(their_counter & (BITS_PER_LONG - 1),
- &counter->backtrack[index]);
+ ret = !test_and_set_bit(their_counter & (COUNTER_BITS_TOTAL - 1),
+ counter->backtrack);
out:
spin_unlock_bh(&counter->lock);
Arnd