Skip to content

Commit 7b11725

Browse files
committed
Switch to stdatomics.
1 parent 05a2dac commit 7b11725

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+243
-185
lines changed

accel/tcg/atomic_template.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, abi_ptr addr,
8181
ABI_TYPE cmpv, ABI_TYPE newv,
8282
MemOpIdx oi, uintptr_t retaddr)
8383
{
84-
DATA_TYPE *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
84+
_Atomic(DATA_TYPE) *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
8585
DATA_SIZE, retaddr);
8686
DATA_TYPE ret;
8787

@@ -104,7 +104,7 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, abi_ptr addr,
104104
ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, abi_ptr addr, ABI_TYPE val,
105105
MemOpIdx oi, uintptr_t retaddr)
106106
{
107-
DATA_TYPE *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
107+
_Atomic(DATA_TYPE) *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
108108
DATA_SIZE, retaddr);
109109
DATA_TYPE ret;
110110

@@ -123,7 +123,8 @@ ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, abi_ptr addr, ABI_TYPE val,
123123
ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, abi_ptr addr, \
124124
ABI_TYPE val, MemOpIdx oi, uintptr_t retaddr) \
125125
{ \
126-
DATA_TYPE *haddr, ret; \
126+
DATA_TYPE ret; \
127+
_Atomic(DATA_TYPE) *haddr; \
127128
haddr = atomic_mmu_lookup(env_cpu(env), addr, oi, DATA_SIZE, retaddr); \
128129
ret = qatomic_##X(haddr, val); \
129130
ATOMIC_MMU_CLEANUP; \
@@ -159,7 +160,8 @@ GEN_ATOMIC_HELPER(xor_fetch)
159160
ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, abi_ptr addr, \
160161
ABI_TYPE xval, MemOpIdx oi, uintptr_t retaddr) \
161162
{ \
162-
XDATA_TYPE *haddr, cmp, old, new, val = xval; \
163+
_Atomic(XDATA_TYPE) *haddr; \
164+
XDATA_TYPE cmp, old, new, val = xval; \
163165
haddr = atomic_mmu_lookup(env_cpu(env), addr, oi, DATA_SIZE, retaddr); \
164166
smp_mb(); \
165167
cmp = qatomic_read__nocheck(haddr); \
@@ -206,7 +208,7 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, abi_ptr addr,
206208
ABI_TYPE cmpv, ABI_TYPE newv,
207209
MemOpIdx oi, uintptr_t retaddr)
208210
{
209-
DATA_TYPE *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
211+
_Atomic(DATA_TYPE) *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
210212
DATA_SIZE, retaddr);
211213
DATA_TYPE ret;
212214

@@ -229,7 +231,7 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, abi_ptr addr,
229231
ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, abi_ptr addr, ABI_TYPE val,
230232
MemOpIdx oi, uintptr_t retaddr)
231233
{
232-
DATA_TYPE *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
234+
_Atomic(DATA_TYPE) *haddr = atomic_mmu_lookup(env_cpu(env), addr, oi,
233235
DATA_SIZE, retaddr);
234236
ABI_TYPE ret;
235237

@@ -248,7 +250,8 @@ ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, abi_ptr addr, ABI_TYPE val,
248250
ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, abi_ptr addr, \
249251
ABI_TYPE val, MemOpIdx oi, uintptr_t retaddr) \
250252
{ \
251-
DATA_TYPE *haddr, ret; \
253+
_Atomic(DATA_TYPE) *haddr; \
254+
DATA_TYPE ret; \
252255
haddr = atomic_mmu_lookup(env_cpu(env), addr, oi, DATA_SIZE, retaddr); \
253256
ret = qatomic_##X(haddr, BSWAP(val)); \
254257
ATOMIC_MMU_CLEANUP; \
@@ -281,7 +284,8 @@ GEN_ATOMIC_HELPER(xor_fetch)
281284
ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, abi_ptr addr, \
282285
ABI_TYPE xval, MemOpIdx oi, uintptr_t retaddr) \
283286
{ \
284-
XDATA_TYPE *haddr, ldo, ldn, old, new, val = xval; \
287+
_Atomic(XDATA_TYPE) *haddr; \
288+
XDATA_TYPE ldo, ldn, old, new, val = xval; \
285289
haddr = atomic_mmu_lookup(env_cpu(env), addr, oi, DATA_SIZE, retaddr); \
286290
smp_mb(); \
287291
ldn = qatomic_read__nocheck(haddr); \

accel/tcg/cputlb.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1794,7 +1794,7 @@ static bool mmu_lookup(CPUState *cpu, vaddr addr, MemOpIdx oi,
17941794
* Probe for an atomic operation. Do not allow unaligned operations,
17951795
* or io operations to proceed. Return the host address.
17961796
*/
1797-
static void *atomic_mmu_lookup(CPUState *cpu, vaddr addr, MemOpIdx oi,
1797+
static _Atomic(DATA_TYPE) *atomic_mmu_lookup(CPUState *cpu, vaddr addr, MemOpIdx oi,
17981798
int size, uintptr_t retaddr)
17991799
{
18001800
uintptr_t mmu_idx = get_mmuidx(oi);

accel/tcg/internal-common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
extern int64_t max_delay;
1616
extern int64_t max_advance;
1717

18-
extern bool one_insn_per_tb;
18+
extern _Atomic(bool) one_insn_per_tb;
1919

2020
/*
2121
* Return true if CS is not running in parallel with other cpus, either

accel/tcg/ldst_atomicity.c.inc

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ static int required_atomicity(CPUState *cpu, uintptr_t p, MemOp memop)
108108
static inline uint16_t load_atomic2(void *pv)
109109
{
110110
uint16_t *p = __builtin_assume_aligned(pv, 2);
111-
return qatomic_read(p);
111+
return qatomic_read(_MK_ATOMIC(p));
112112
}
113113

114114
/**
@@ -120,7 +120,7 @@ static inline uint16_t load_atomic2(void *pv)
120120
static inline uint32_t load_atomic4(void *pv)
121121
{
122122
uint32_t *p = __builtin_assume_aligned(pv, 4);
123-
return qatomic_read(p);
123+
return qatomic_read(_MK_ATOMIC(p));
124124
}
125125

126126
/**
@@ -134,7 +134,7 @@ static inline uint64_t load_atomic8(void *pv)
134134
uint64_t *p = __builtin_assume_aligned(pv, 8);
135135

136136
qemu_build_assert(HAVE_al8);
137-
return qatomic_read__nocheck(p);
137+
return qatomic_read__nocheck(_MK_ATOMIC(p));
138138
}
139139

140140
/**
@@ -598,7 +598,7 @@ static Int128 load_atom_16(CPUState *cpu, uintptr_t ra,
598598
static inline void store_atomic2(void *pv, uint16_t val)
599599
{
600600
uint16_t *p = __builtin_assume_aligned(pv, 2);
601-
qatomic_set(p, val);
601+
qatomic_set(_MK_ATOMIC(p), val);
602602
}
603603

604604
/**
@@ -611,7 +611,7 @@ static inline void store_atomic2(void *pv, uint16_t val)
611611
static inline void store_atomic4(void *pv, uint32_t val)
612612
{
613613
uint32_t *p = __builtin_assume_aligned(pv, 4);
614-
qatomic_set(p, val);
614+
qatomic_set(_MK_ATOMIC(p), val);
615615
}
616616

617617
/**
@@ -626,7 +626,7 @@ static inline void store_atomic8(void *pv, uint64_t val)
626626
uint64_t *p = __builtin_assume_aligned(pv, 8);
627627

628628
qemu_build_assert(HAVE_al8);
629-
qatomic_set__nocheck(p, val);
629+
qatomic_set__nocheck(_MK_ATOMIC(p), val);
630630
}
631631

632632
/**
@@ -669,11 +669,11 @@ static void store_atom_insert_al4(uint32_t *p, uint32_t val, uint32_t msk)
669669
uint32_t old, new;
670670

671671
p = __builtin_assume_aligned(p, 4);
672-
old = qatomic_read(p);
672+
old = qatomic_read(_MK_ATOMIC(p));
673673
do {
674674
new = (old & ~msk) | val;
675-
} while (!__atomic_compare_exchange_n(p, &old, new, true,
676-
__ATOMIC_RELAXED, __ATOMIC_RELAXED));
675+
} while (!atomic_compare_exchange_weak_explicit(_MK_ATOMIC(p), &old, new,
676+
memory_order_relaxed, memory_order_relaxed));
677677
}
678678

679679
/**
@@ -690,11 +690,11 @@ static void store_atom_insert_al8(uint64_t *p, uint64_t val, uint64_t msk)
690690

691691
qemu_build_assert(HAVE_al8);
692692
p = __builtin_assume_aligned(p, 8);
693-
old = qatomic_read__nocheck(p);
693+
old = qatomic_read__nocheck(_MK_ATOMIC(p));
694694
do {
695695
new = (old & ~msk) | val;
696-
} while (!__atomic_compare_exchange_n(p, &old, new, true,
697-
__ATOMIC_RELAXED, __ATOMIC_RELAXED));
696+
} while (!atomic_compare_exchange_weak_explicit(_MK_ATOMIC(p), &old, new,
697+
memory_order_relaxed, memory_order_relaxed));
698698
}
699699

700700
/**

accel/tcg/tb-context.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ struct TBContext {
3333
struct qht htable;
3434

3535
/* statistics */
36-
unsigned tb_flush_count;
37-
unsigned tb_phys_invalidate_count;
36+
_Atomic(unsigned) tb_flush_count;
37+
_Atomic(unsigned) tb_phys_invalidate_count;
3838
};
3939

4040
extern TBContext tb_ctx;

accel/tcg/tb-jmp-cache.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
typedef struct CPUJumpCache {
2626
struct rcu_head rcu;
2727
struct {
28-
TranslationBlock *tb;
28+
_Atomic(TranslationBlock *) tb;
2929
vaddr pc;
3030
} array[TB_JMP_CACHE_SIZE];
3131
} CPUJumpCache;

accel/tcg/tcg-all.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ static void tcg_accel_instance_init(Object *obj)
9898
}
9999

100100
bool mttcg_enabled;
101-
bool one_insn_per_tb;
101+
_Atomic(bool) one_insn_per_tb;
102102

103103
static int tcg_init_machine(MachineState *ms)
104104
{

bsd-user/qemu.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ struct TaskState {
125125
* the qatomic_read() and qatomic_set() functions. (It is not accessed
126126
* from multiple threads.)
127127
*/
128-
int signal_pending;
128+
_Atomic(int) signal_pending;
129129
/* True if we're leaving a sigsuspend and sigsuspend_mask is valid. */
130130
bool in_sigsuspend;
131131
/*

cpu-common.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static QemuCond qemu_work_cond;
3333
/* >= 1 if a thread is inside start_exclusive/end_exclusive. Written
3434
* under qemu_cpu_list_lock, read with atomic operations.
3535
*/
36-
static int pending_cpus;
36+
static _Atomic(int) pending_cpus;
3737

3838
void qemu_init_cpu_list(void)
3939
{
@@ -128,7 +128,8 @@ struct qemu_work_item {
128128
QSIMPLEQ_ENTRY(qemu_work_item) node;
129129
run_on_cpu_func func;
130130
run_on_cpu_data data;
131-
bool free, exclusive, done;
131+
bool free, exclusive;
132+
_Atomic(bool) done;
132133
};
133134

134135
static void queue_work_on_cpu(CPUState *cpu, struct qemu_work_item *wi)

host/include/generic/host/atomic128-cas.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313

1414
#if defined(CONFIG_ATOMIC128)
1515
static inline Int128 ATTRIBUTE_ATOMIC128_OPT
16-
atomic16_cmpxchg(Int128 *ptr, Int128 cmp, Int128 new)
16+
atomic16_cmpxchg(_Atomic(Int128) *ptr, Int128 cmp, Int128 new)
1717
{
18-
__int128_t *ptr_align = __builtin_assume_aligned(ptr, 16);
18+
_Atomic(__int128_t) *ptr_align = __builtin_assume_aligned(ptr, 16);
1919
Int128Alias r, c, n;
2020

2121
c.s = cmp;

host/include/generic/host/load-extract-al16-al8.h.inc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ load_atom_extract_al16_or_al8(void *pv, int s)
2828
pv = (void *)(pi & ~7);
2929
if (pi & 8) {
3030
uint64_t *p8 = __builtin_assume_aligned(pv, 16, 8);
31-
uint64_t a = qatomic_read__nocheck(p8);
32-
uint64_t b = qatomic_read__nocheck(p8 + 1);
31+
uint64_t a = qatomic_read__nocheck(_MK_ATOMIC(p8));
32+
uint64_t b = qatomic_read__nocheck(_MK_ATOMIC(p8 + 1));
3333

3434
if (HOST_BIG_ENDIAN) {
3535
r = int128_make128(b, a);

include/block/aio.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ void qemu_aio_unref(void *p);
4949
void qemu_aio_ref(void *p);
5050

5151
typedef struct AioHandler AioHandler;
52-
typedef QLIST_HEAD(, AioHandler) AioHandlerList;
52+
typedef QLIST_HEAD_ATOMIC(, AioHandler) AioHandlerList;
5353
typedef void QEMUBHFunc(void *opaque);
5454
typedef bool AioPollFn(void *opaque);
5555
typedef void IOHandler(void *opaque);
@@ -170,7 +170,7 @@ struct AioContext {
170170
* Instead, the aio_poll calls include both the prepare and the
171171
* dispatch phase, hence a simple counter is enough for them.
172172
*/
173-
uint32_t notify_me;
173+
_Atomic(uint32_t) notify_me;
174174

175175
/* A lock to protect between QEMUBH and AioHandler adders and deleter,
176176
* and to ensure that no callbacks are removed while we're walking and
@@ -196,7 +196,7 @@ struct AioContext {
196196
* more information on the problem that would result, see "#ifdef BUG2"
197197
* in the docs/aio_notify_accept.promela formal model.
198198
*/
199-
bool notified;
199+
_Atomic(bool) notified;
200200
EventNotifier notifier;
201201

202202
QSLIST_HEAD(, Coroutine) scheduled_coroutines;
@@ -226,7 +226,7 @@ struct AioContext {
226226
QEMUTimerListGroup tlg;
227227

228228
/* Number of AioHandlers without .io_poll() */
229-
int poll_disable_cnt;
229+
_Atomic(int) poll_disable_cnt;
230230

231231
/* Polling mode parameters */
232232
int64_t poll_ns; /* current polling time in nanoseconds */

include/exec/memory.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1096,7 +1096,7 @@ struct AddressSpace {
10961096
MemoryRegion *root;
10971097

10981098
/* Accessed via RCU. */
1099-
struct FlatView *current_map;
1099+
_Atomic(struct FlatView *) current_map;
11001100

11011101
int ioeventfd_nb;
11021102
int ioeventfd_notifiers;

include/exec/translation-block.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ struct TranslationBlock {
6464
uint64_t cs_base;
6565

6666
uint32_t flags; /* flags defining in which context the code was generated */
67-
uint32_t cflags; /* compile flags */
67+
_Atomic(uint32_t) cflags; /* compile flags */
6868

6969
/* Note that TCG_MAX_INSNS is 512; we validate this match elsewhere. */
7070
#define CF_COUNT_MASK 0x000001ff
@@ -140,7 +140,7 @@ struct TranslationBlock {
140140
*/
141141
uintptr_t jmp_list_head;
142142
uintptr_t jmp_list_next[2];
143-
uintptr_t jmp_dest[2];
143+
_Atomic(uintptr_t) jmp_dest[2];
144144
};
145145

146146
/* The alignment given to TranslationBlock during allocation. */

include/hw/core/cpu.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -336,14 +336,14 @@ typedef struct CPUTLB {
336336
* for both decrementer underflow and exceptions.
337337
*/
338338
typedef union IcountDecr {
339-
uint32_t u32;
339+
_Atomic(uint32_t) u32;
340340
struct {
341341
#if HOST_BIG_ENDIAN
342-
uint16_t high;
342+
_Atomic(uint16_t) high;
343343
uint16_t low;
344344
#else
345345
uint16_t low;
346-
uint16_t high;
346+
_Atomic(uint16_t) high;
347347
#endif
348348
} u16;
349349
} IcountDecr;
@@ -476,7 +476,8 @@ struct CPUState {
476476
QemuSemaphore sem;
477477
#endif
478478
int thread_id;
479-
bool running, has_waiter;
479+
_Atomic(bool) running;
480+
bool has_waiter;
480481
struct QemuCond *halt_cond;
481482
bool thread_kicked;
482483
bool created;
@@ -488,11 +489,11 @@ struct CPUState {
488489

489490
bool unplug;
490491
bool crash_occurred;
491-
bool exit_request;
492+
_Atomic(bool) exit_request;
492493
int exclusive_context_count;
493494
uint32_t cflags_next_tb;
494495
/* updates protected by BQL */
495-
uint32_t interrupt_request;
496+
_Atomic(uint32_t) interrupt_request;
496497
int singlestep_enabled;
497498
int64_t icount_budget;
498499
int64_t icount_extra;
@@ -513,7 +514,7 @@ struct CPUState {
513514
GArray *gdb_regs;
514515
int gdb_num_regs;
515516
int gdb_num_g_regs;
516-
QTAILQ_ENTRY(CPUState) node;
517+
QTAILQ_ENTRY_ATOMIC(CPUState) node;
517518

518519
/* ice debug support */
519520
QTAILQ_HEAD(, CPUBreakpoint) breakpoints;
@@ -590,7 +591,7 @@ static inline CPUArchState *cpu_env(CPUState *cpu)
590591
return (CPUArchState *)(cpu + 1);
591592
}
592593

593-
typedef QTAILQ_HEAD(CPUTailQ, CPUState) CPUTailQ;
594+
typedef QTAILQ_HEAD_ATOMIC(CPUTailQ, CPUState) CPUTailQ;
594595
extern CPUTailQ cpus_queue;
595596

596597
#define first_cpu QTAILQ_FIRST_RCU(&cpus_queue)

0 commit comments

Comments
 (0)