]> git.baikalelectronics.ru Git - kernel.git/commit
llist: clang: introduce member_address_is_nonnull()
authorAlexander Potapenko <glider@google.com>
Wed, 19 Jul 2017 18:27:30 +0000 (20:27 +0200)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 19 Jul 2017 22:33:50 +0000 (15:33 -0700)
commit1781e3a6b9717810e6ba2bf42efddbd8c5e642a7
treed865dda1b1bf9c50ada3b4a8344aba60186c42fe
parentbb7a57598429f9343a8724c45b510b3367d5f4a1
llist: clang: introduce member_address_is_nonnull()

Currently llist_for_each_entry() and llist_for_each_entry_safe() iterate
until &pos->member != NULL.  But when building the kernel with Clang,
the compiler assumes &pos->member cannot be NULL if the member's offset
is greater than 0 (which would be equivalent to the object being
non-contiguous in memory).  Therefore the loop condition is always true,
and the loops become infinite.

To work around this, introduce the member_address_is_nonnull() macro,
which casts object pointer to uintptr_t, thus letting the member pointer
to be NULL.

Signed-off-by: Alexander Potapenko <glider@google.com>
Tested-by: Sodagudi Prasad <psodagud@codeaurora.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/llist.h