IB/rxe: Make counters thread safe

Current rxe device counters are not thread safe.
When multiple QPs are used, they can be racy.
Make them thread safe by making it atomic64.

Fixes: 0b1e5b99a4 ("IB/rxe: Add port protocol stats")
Signed-off-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
Parav Pandit 2018-12-14 00:32:42 -06:00 committed by Jason Gunthorpe
parent 6e3722baac
commit d5108e69fe
2 changed files with 4 additions and 4 deletions

View File

@ -62,7 +62,7 @@ int rxe_ib_get_hw_stats(struct ib_device *ibdev,
return -EINVAL; return -EINVAL;
for (cnt = 0; cnt < ARRAY_SIZE(rxe_counter_name); cnt++) for (cnt = 0; cnt < ARRAY_SIZE(rxe_counter_name); cnt++)
stats->value[cnt] = dev->stats_counters[cnt]; stats->value[cnt] = atomic64_read(&dev->stats_counters[cnt]);
return ARRAY_SIZE(rxe_counter_name); return ARRAY_SIZE(rxe_counter_name);
} }

View File

@ -409,16 +409,16 @@ struct rxe_dev {
spinlock_t mmap_offset_lock; /* guard mmap_offset */ spinlock_t mmap_offset_lock; /* guard mmap_offset */
int mmap_offset; int mmap_offset;
u64 stats_counters[RXE_NUM_OF_COUNTERS]; atomic64_t stats_counters[RXE_NUM_OF_COUNTERS];
struct rxe_port port; struct rxe_port port;
struct list_head list; struct list_head list;
struct crypto_shash *tfm; struct crypto_shash *tfm;
}; };
static inline void rxe_counter_inc(struct rxe_dev *rxe, enum rxe_counters cnt) static inline void rxe_counter_inc(struct rxe_dev *rxe, enum rxe_counters index)
{ {
rxe->stats_counters[cnt]++; atomic64_inc(&rxe->stats_counters[index]);
} }
static inline struct rxe_dev *to_rdev(struct ib_device *dev) static inline struct rxe_dev *to_rdev(struct ib_device *dev)