Skip to content

Commit

Permalink
Cleanup: Make memory barrier definitions consistent across kernels
Browse files Browse the repository at this point in the history
We inherited membar_consumer() and membar_producer() from OpenSolaris,
but we had replaced membar_consumer() with Linux's smp_rmb() in
zfs_ioctl.c. The FreeBSD SPL consequently implemented a shim for the
Linux-only smp_rmb().

We reinstate membar_consumer() in platform independent code and fix the
FreeBSD SPL to implement membar_consumer() in a way analogous to Linux.

Reviewed-by: Konstantin Belousov <[email protected]>
Reviewed-by: Mateusz Guzik <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Neal Gompa <[email protected]>
Reviewed-by: Alexander Motin <[email protected]>
Signed-off-by: Richard Yao <[email protected]>
Closes openzfs#13843
  • Loading branch information
ryao authored and tonyhutter committed Nov 21, 2022
1 parent 20964b4 commit 50a1604
Show file tree
Hide file tree
Showing 4 changed files with 5 additions and 3 deletions.
1 change: 0 additions & 1 deletion include/os/freebsd/linux/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@
#define __printf(a, b) __printflike(a, b)

#define barrier() __asm__ __volatile__("": : :"memory")
#define smp_rmb() rmb()
#define ___PASTE(a, b) a##b
#define __PASTE(a, b) ___PASTE(a, b)

Expand Down
3 changes: 2 additions & 1 deletion include/os/freebsd/spl/sys/atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ extern uint64_t atomic_cas_64(volatile uint64_t *target, uint64_t cmp,
uint64_t newval);
#endif

#define membar_producer atomic_thread_fence_rel
#define membar_consumer() atomic_thread_fence_acq()
#define membar_producer() atomic_thread_fence_rel()

static __inline uint32_t
atomic_add_32_nv(volatile uint32_t *target, int32_t delta)
Expand Down
2 changes: 2 additions & 0 deletions include/os/linux/spl/sys/vmsystm.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@
#define zfs_totalhigh_pages totalhigh_pages
#endif

#define membar_consumer() smp_rmb()
#define membar_producer() smp_wmb()

#define physmem zfs_totalram_pages

#define xcopyin(from, to, size) copy_from_user(to, from, size)
Expand Down
2 changes: 1 addition & 1 deletion module/zfs/zfs_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -7398,7 +7398,7 @@ zfsdev_get_state_impl(minor_t minor, enum zfsdev_state_type which)

for (zs = zfsdev_state_list; zs != NULL; zs = zs->zs_next) {
if (zs->zs_minor == minor) {
smp_rmb();
membar_consumer();
switch (which) {
case ZST_ONEXIT:
return (zs->zs_onexit);
Expand Down

0 comments on commit 50a1604

Please sign in to comment.