Commit 83dc0370 authored by Yufeng Wang's avatar Yufeng Wang Committed by Michael S. Tsirkin
Browse files

tools: virtio/linux/compiler.h: Add data_race() define.



Port over the definition of data_race() so we can build tools/virtio.

cc -g -O2 -Werror -Wno-maybe-uninitialized -Wall -I.
-I../include/ -I ../../usr/include/ -Wno-pointer-sign
-fno-strict-overflow -fno-strict-aliasing -fno-common
-MMD -U_FORTIFY_SOURCE -include ../../include/linux/kconfig.h
-mfunction-return=thunk -fcf-protection=none
-mindirect-branch-register -pthread
-c -o virtio_ring.o ../../drivers/virtio/virtio_ring.c
../../drivers/virtio/virtio_ring.c: in function'vring_interrupt':
../../drivers/virtio/virtio_ring.c:2711:17: error:Implicit declaration function'data_race' [-Wimplicit-function-declaration]
 2711 |                 data_race(vq->event_triggered = true);
      |                 ^~~~~~~~~

Signed-off-by: default avatarYufeng Wang <wangyufeng@kylinos.cn>
Message-Id: <20250114033635.20623-1-wangyufeng@kylinos.cn>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent ae376910
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -10,4 +10,29 @@
#define READ_ONCE(var) (*((volatile typeof(var) *)(&(var))))

#define __aligned(x) __attribute((__aligned__(x)))

/**
 * data_race - mark an expression as containing intentional data races
 *
 * This data_race() macro is useful for situations in which data races
 * should be forgiven.  One example is diagnostic code that accesses
 * shared variables but is not a part of the core synchronization design.
 * For example, if accesses to a given variable are protected by a lock,
 * except for diagnostic code, then the accesses under the lock should
 * be plain C-language accesses and those in the diagnostic code should
 * use data_race().  This way, KCSAN will complain if buggy lockless
 * accesses to that variable are introduced, even if the buggy accesses
 * are protected by READ_ONCE() or WRITE_ONCE().
 *
 * This macro *does not* affect normal code generation, but is a hint
 * to tooling that data races here are to be ignored.  If the access must
 * be atomic *and* KCSAN should ignore the access, use both data_race()
 * and READ_ONCE(), for example, data_race(READ_ONCE(x)).
 */
#define data_race(expr)							\
({									\
	__auto_type __v = (expr);					\
	__v;								\
})

#endif