aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/mlx5/mlx5_en/en.h
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2019-10-02 10:43:49 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2019-10-02 10:43:49 +0000
commiteeb1ff98003ec9138e36d594ccca059980050c95 (patch)
tree38bbb2dce0ce57679a9a9a6af833a541a4dd7e1d /sys/dev/mlx5/mlx5_en/en.h
parentb4672400e6d04296bb16a473f54b357d899ab038 (diff)
downloadsrc-eeb1ff98003ec9138e36d594ccca059980050c95.tar.gz
src-eeb1ff98003ec9138e36d594ccca059980050c95.zip
Seal transmit path with regards to using destroyed mutex in mlx5en(4).
It may happen during link down that the running state may be observed non-zero in the transmit routine, right before the running state is cleared. This may end up using a destroyed mutex. Make all channel mutexes and callouts persistant. Preserve receive and send queue statistics during link toggle. MFC after: 3 days Sponsored by: Mellanox Technologies
Notes
Notes: svn path=/head/; revision=352989
Diffstat (limited to 'sys/dev/mlx5/mlx5_en/en.h')
-rw-r--r--sys/dev/mlx5/mlx5_en/en.h24
1 files changed, 15 insertions, 9 deletions
diff --git a/sys/dev/mlx5/mlx5_en/en.h b/sys/dev/mlx5/mlx5_en/en.h
index 192b19f24c2d..cf71559d5b86 100644
--- a/sys/dev/mlx5/mlx5_en/en.h
+++ b/sys/dev/mlx5/mlx5_en/en.h
@@ -139,6 +139,10 @@
#define MLX5E_100MB (100000)
#define MLX5E_1GB (1000000)
+#define MLX5E_ZERO(ptr, field) \
+ memset(&(ptr)->field, 0, \
+ sizeof(*(ptr)) - __offsetof(__typeof(*(ptr)), field))
+
MALLOC_DECLARE(M_MLX5EN);
struct mlx5_core_dev;
@@ -741,15 +745,18 @@ struct mlx5e_rq_mbuf {
};
struct mlx5e_rq {
+ /* persistant fields */
+ struct mtx mtx;
+ struct mlx5e_rq_stats stats;
+
/* data path */
+#define mlx5e_rq_zero_start wq
struct mlx5_wq_ll wq;
- struct mtx mtx;
bus_dma_tag_t dma_tag;
u32 wqe_sz;
u32 nsegs;
struct mlx5e_rq_mbuf *mbuf;
struct ifnet *ifp;
- struct mlx5e_rq_stats stats;
struct mlx5e_cq cq;
struct lro_ctrl lro;
volatile int enabled;
@@ -783,10 +790,14 @@ struct mlx5e_snd_tag {
};
struct mlx5e_sq {
- /* data path */
+ /* persistant fields */
struct mtx lock;
- bus_dma_tag_t dma_tag;
struct mtx comp_lock;
+ struct mlx5e_sq_stats stats;
+
+ /* data path */
+#define mlx5e_sq_zero_start dma_tag
+ bus_dma_tag_t dma_tag;
/* dirtied @completion */
u16 cc;
@@ -806,7 +817,6 @@ struct mlx5e_sq {
u32 d32[2];
u64 d64;
} doorbell;
- struct mlx5e_sq_stats stats;
struct mlx5e_cq cq;
@@ -859,13 +869,9 @@ mlx5e_sq_queue_level(struct mlx5e_sq *sq)
}
struct mlx5e_channel {
- /* data path */
struct mlx5e_rq rq;
struct mlx5e_snd_tag tag;
struct mlx5e_sq sq[MLX5E_MAX_TX_NUM_TC];
- u8 num_tc;
-
- /* control */
struct mlx5e_priv *priv;
int ix;
} __aligned(MLX5E_CACHELINE_SIZE);