The LinuxKPI atomics do not have acquire nor release semantics unless
specified. Fix code to use READ_ONCE() and WRITE_ONCE() where appropriate. Suggested by: kib @ MFC after: 1 week Sponsored by: Mellanox Technologies
This commit is contained in:
parent
1f7c7e1bec
commit
62bae5d421
@ -2,7 +2,7 @@
|
||||
* Copyright (c) 2010 Isilon Systems, Inc.
|
||||
* Copyright (c) 2010 iX Systems, Inc.
|
||||
* Copyright (c) 2010 Panasas, Inc.
|
||||
* Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
|
||||
* Copyright (c) 2013-2017 Mellanox Technologies, Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -31,7 +31,7 @@
|
||||
#ifndef _ATOMIC_LONG_H_
|
||||
#define _ATOMIC_LONG_H_
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <sys/types.h>
|
||||
#include <machine/atomic.h>
|
||||
|
||||
@ -54,13 +54,13 @@ atomic_long_add_return(long i, atomic_long_t *v)
|
||||
static inline void
|
||||
atomic_long_set(atomic_long_t *v, long i)
|
||||
{
|
||||
atomic_store_rel_long(&v->counter, i);
|
||||
WRITE_ONCE(v->counter, i);
|
||||
}
|
||||
|
||||
static inline long
|
||||
atomic_long_read(atomic_long_t *v)
|
||||
{
|
||||
return atomic_load_acq_long(&v->counter);
|
||||
return READ_ONCE(v->counter);
|
||||
}
|
||||
|
||||
static inline long
|
||||
|
@ -2,7 +2,7 @@
|
||||
* Copyright (c) 2010 Isilon Systems, Inc.
|
||||
* Copyright (c) 2010 iX Systems, Inc.
|
||||
* Copyright (c) 2010 Panasas, Inc.
|
||||
* Copyright (c) 2013-2016 Mellanox Technologies, Ltd.
|
||||
* Copyright (c) 2013-2017 Mellanox Technologies, Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -32,9 +32,8 @@
|
||||
#ifndef _ASM_ATOMIC_H_
|
||||
#define _ASM_ATOMIC_H_
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <machine/atomic.h>
|
||||
|
||||
#define ATOMIC_INIT(x) { .counter = (x) }
|
||||
@ -73,7 +72,7 @@ atomic_sub_return(int i, atomic_t *v)
|
||||
static inline void
|
||||
atomic_set(atomic_t *v, int i)
|
||||
{
|
||||
atomic_store_rel_int(&v->counter, i);
|
||||
WRITE_ONCE(v->counter, i);
|
||||
}
|
||||
|
||||
static inline void
|
||||
@ -91,7 +90,7 @@ atomic_set_mask(unsigned int mask, atomic_t *v)
|
||||
static inline int
|
||||
atomic_read(const atomic_t *v)
|
||||
{
|
||||
return atomic_load_acq_int(&__DECONST(atomic_t *, v)->counter);
|
||||
return READ_ONCE(v->counter);
|
||||
}
|
||||
|
||||
static inline int
|
||||
@ -137,7 +136,7 @@ atomic_xchg(atomic_t *v, int i)
|
||||
#else
|
||||
int ret;
|
||||
for (;;) {
|
||||
ret = atomic_load_acq_int(&v->counter);
|
||||
ret = READ_ONCE(v->counter);
|
||||
if (atomic_cmpset_int(&v->counter, ret, i))
|
||||
break;
|
||||
}
|
||||
@ -153,7 +152,7 @@ atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||
for (;;) {
|
||||
if (atomic_cmpset_int(&v->counter, old, new))
|
||||
break;
|
||||
ret = atomic_load_acq_int(&v->counter);
|
||||
ret = READ_ONCE(v->counter);
|
||||
if (ret != old)
|
||||
break;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 2016 Mellanox Technologies, Ltd.
|
||||
* Copyright (c) 2016-2017 Mellanox Technologies, Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -28,7 +28,7 @@
|
||||
#ifndef _ASM_ATOMIC64_H_
|
||||
#define _ASM_ATOMIC64_H_
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <sys/types.h>
|
||||
#include <machine/atomic.h>
|
||||
|
||||
@ -74,7 +74,7 @@ atomic64_set(atomic64_t *v, int64_t i)
|
||||
static inline int64_t
|
||||
atomic64_read(atomic64_t *v)
|
||||
{
|
||||
return atomic_load_acq_64(&v->counter);
|
||||
return READ_ONCE(v->counter);
|
||||
}
|
||||
|
||||
static inline int64_t
|
||||
@ -114,7 +114,7 @@ atomic64_xchg(atomic64_t *v, int64_t i)
|
||||
#else
|
||||
int64_t ret;
|
||||
for (;;) {
|
||||
ret = atomic_load_acq_64(&v->counter);
|
||||
ret = READ_ONCE(v->counter);
|
||||
if (atomic_cmpset_64(&v->counter, ret, i))
|
||||
break;
|
||||
}
|
||||
@ -130,7 +130,7 @@ atomic64_cmpxchg(atomic64_t *v, int64_t old, int64_t new)
|
||||
for (;;) {
|
||||
if (atomic_cmpset_64(&v->counter, old, new))
|
||||
break;
|
||||
ret = atomic_load_acq_64(&v->counter);
|
||||
ret = READ_ONCE(v->counter);
|
||||
if (ret != old)
|
||||
break;
|
||||
}
|
||||
|
@ -269,8 +269,7 @@ find_next_zero_bit(const unsigned long *addr, unsigned long size,
|
||||
atomic_clear_long(&((volatile unsigned long *)(a))[BIT_WORD(i)], BIT_MASK(i))
|
||||
|
||||
#define test_bit(i, a) \
|
||||
!!(atomic_load_acq_long(&((volatile unsigned long *)(a))[BIT_WORD(i)]) & \
|
||||
BIT_MASK(i))
|
||||
!!(READ_ONCE(((volatile unsigned long *)(a))[BIT_WORD(i)]) & BIT_MASK(i))
|
||||
|
||||
static inline int
|
||||
test_and_clear_bit(long bit, volatile unsigned long *var)
|
||||
|
@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/proc.h>
|
||||
#include <sys/sched.h>
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/compat.h>
|
||||
|
||||
@ -45,10 +46,10 @@ __FBSDID("$FreeBSD$");
|
||||
atomic_cmpset_ptr((volatile uintptr_t *)&(ts)->entry.tqe_prev, old, new)
|
||||
|
||||
#define TASKLET_ST_SET(ts, new) \
|
||||
atomic_store_rel_ptr((volatile uintptr_t *)&(ts)->entry.tqe_prev, new)
|
||||
WRITE_ONCE(*(volatile uintptr_t *)&(ts)->entry.tqe_prev, new)
|
||||
|
||||
#define TASKLET_ST_GET(ts) \
|
||||
atomic_load_acq_ptr((volatile uintptr_t *)&(ts)->entry.tqe_prev)
|
||||
READ_ONCE(*(volatile uintptr_t *)&(ts)->entry.tqe_prev)
|
||||
|
||||
struct tasklet_worker {
|
||||
struct mtx mtx;
|
||||
|
Loading…
Reference in New Issue
Block a user