git: 1b5f91f4ca68 - MFC r357940 (by mjg), r365932 (by jrtc27): Make atomic_load_ptr type-aware atomic_common.h: Fix the volatile qualifier placement in atomic_load_ptr
Konstantin Belousov
kib at FreeBSD.org
Thu Dec 24 11:13:14 UTC 2020
The branch stable/12 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=1b5f91f4ca689e3ea1ddbc28d7c4ad9ccc751dbc
commit 1b5f91f4ca689e3ea1ddbc28d7c4ad9ccc751dbc
Author: Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2020-12-24 10:56:16 +0000
Commit: Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2020-12-24 10:56:16 +0000
MFC r357940 (by mjg), r365932 (by jrtc27):
Make atomic_load_ptr type-aware
atomic_common.h: Fix the volatile qualifier placement in atomic_load_ptr
(cherry picked from commit 082a6b2a92888cf799c7a0408a78e2d7ad9320bb)
(cherry picked from commit 7d54cc9165a3990849b60835c85ddb388905e1b7)
---
sys/amd64/amd64/pmap.c | 6 +++---
sys/sys/atomic_common.h | 2 +-
sys/x86/x86/mp_x86.c | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index ed9398f4da83..4a4c50385ca2 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -746,7 +746,7 @@ again:
PV_STAT(i = 0);
for (p = &pmap_invl_gen_head;; p = prev.next) {
PV_STAT(i++);
- prevl = atomic_load_ptr(&p->next);
+ prevl = (uintptr_t)atomic_load_ptr(&p->next);
if ((prevl & PMAP_INVL_GEN_NEXT_INVALID) != 0) {
PV_STAT(atomic_add_long(&invl_start_restart, 1));
lock_delay(&lda);
@@ -853,7 +853,7 @@ pmap_delayed_invl_finish_u(void)
again:
for (p = &pmap_invl_gen_head; p != NULL; p = (void *)prevl) {
- prevl = atomic_load_ptr(&p->next);
+ prevl = (uintptr_t)atomic_load_ptr(&p->next);
if ((prevl & PMAP_INVL_GEN_NEXT_INVALID) != 0) {
PV_STAT(atomic_add_long(&invl_finish_restart, 1));
lock_delay(&lda);
@@ -904,7 +904,7 @@ DB_SHOW_COMMAND(di_queue, pmap_di_queue)
for (p = &pmap_invl_gen_head, first = true; p != NULL; p = pn,
first = false) {
- nextl = atomic_load_ptr(&p->next);
+ nextl = (uintptr_t)atomic_load_ptr(&p->next);
pn = (void *)(nextl & ~PMAP_INVL_GEN_NEXT_INVALID);
td = first ? NULL : __containerof(p, struct thread,
td_md.md_invl_gen);
diff --git a/sys/sys/atomic_common.h b/sys/sys/atomic_common.h
index 9aa30fa24a27..16db4a81eb28 100644
--- a/sys/sys/atomic_common.h
+++ b/sys/sys/atomic_common.h
@@ -41,7 +41,7 @@
#define atomic_load_short(p) (*(volatile u_short *)(p))
#define atomic_load_int(p) (*(volatile u_int *)(p))
#define atomic_load_long(p) (*(volatile u_long *)(p))
-#define atomic_load_ptr(p) (*(volatile uintptr_t*)(p))
+#define atomic_load_ptr(p) (*(volatile __typeof(*p) *)(p))
#define atomic_load_8(p) (*(volatile uint8_t *)(p))
#define atomic_load_16(p) (*(volatile uint16_t *)(p))
#define atomic_load_32(p) (*(volatile uint32_t *)(p))
diff --git a/sys/x86/x86/mp_x86.c b/sys/x86/x86/mp_x86.c
index f24e406a52b4..984edb43dd22 100644
--- a/sys/x86/x86/mp_x86.c
+++ b/sys/x86/x86/mp_x86.c
@@ -1095,7 +1095,7 @@ smp_after_idle_runnable(void *arg __unused)
for (cpu = 1; cpu < mp_ncpus; cpu++) {
pc = pcpu_find(cpu);
- while (atomic_load_ptr(&pc->pc_curpcb) == (uintptr_t)NULL)
+ while (atomic_load_ptr(&pc->pc_curpcb) == NULL)
cpu_spinwait();
kmem_free((vm_offset_t)bootstacks[cpu], kstack_pages *
PAGE_SIZE);
More information about the dev-commits-src-all
mailing list