Skip to content

Commit

Permalink
Cleanup: Correct memory barrier definitions
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(). Additionally, FreeBSD implemented membar_producer() as a full
memory barrier, rather than a store memory barrier.

We reinstate membar_consumer() in platform independent code and at the
same time, correct the FreeBSD definition to be a store memory barrier.

Signed-off-by: Richard Yao <[email protected]>
  • Loading branch information
ryao committed Sep 6, 2022
1 parent 5976747 commit fdf5c3f
Show file tree
Hide file tree
Showing 4 changed files with 4 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() rmb()
#define membar_producer() wmb()

static __inline uint32_t
atomic_add_32_nv(volatile uint32_t *target, int32_t delta)
Expand Down
1 change: 1 addition & 0 deletions include/os/linux/spl/sys/vmsystm.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#endif

#define membar_producer() smp_wmb()
#define membar_consumer() smp_rmb()
#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 @@ -7482,7 +7482,7 @@ zfsdev_get_state(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 fdf5c3f

Please sign in to comment.