Skip to content

Commit 5ef1717

Browse files
committed
Merge mlx5-next into rdma.git for-next
Synchronize the shared mlx5 branch with net: - From Jiri: fixe a deadlock in mlx5_ib's netdev notifier unregister. - From Mark and Patrisious: add IPsec RoCEv2 support. - From Or: Rely on firmware to get special mkeys * branch mlx5-next: RDMA/mlx5: Use query_special_contexts for mkeys net/mlx5e: Use query_special_contexts for mkeys net/mlx5: Change define name for 0x100 lkey value net/mlx5: Expose bits for querying special mkeys net/mlx5: Configure IPsec steering for egress RoCEv2 traffic net/mlx5: Configure IPsec steering for ingress RoCEv2 traffic net/mlx5: Add IPSec priorities in RDMA namespaces net/mlx5: Implement new destination type TABLE_TYPE net/mlx5: Introduce new destination type TABLE_TYPE RDMA/mlx5: Track netdev to avoid deadlock during netdev notifier unregister net/mlx5e: Propagate an internal event in case uplink netdev changes net/mlx5e: Fix trap event handling Signed-off-by: Jason Gunthorpe <[email protected]>
2 parents a77a523 + 594cac1 commit 5ef1717

File tree

28 files changed

+704
-112
lines changed

28 files changed

+704
-112
lines changed

drivers/infiniband/hw/mlx5/cmd.c

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,41 @@
55

66
#include "cmd.h"
77

8-
int mlx5_cmd_dump_fill_mkey(struct mlx5_core_dev *dev, u32 *mkey)
8+
int mlx5r_cmd_query_special_mkeys(struct mlx5_ib_dev *dev)
99
{
1010
u32 out[MLX5_ST_SZ_DW(query_special_contexts_out)] = {};
1111
u32 in[MLX5_ST_SZ_DW(query_special_contexts_in)] = {};
12+
bool is_terminate, is_dump, is_null;
1213
int err;
1314

14-
MLX5_SET(query_special_contexts_in, in, opcode,
15-
MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS);
16-
err = mlx5_cmd_exec_inout(dev, query_special_contexts, in, out);
17-
if (!err)
18-
*mkey = MLX5_GET(query_special_contexts_out, out,
19-
dump_fill_mkey);
20-
return err;
21-
}
15+
is_terminate = MLX5_CAP_GEN(dev->mdev, terminate_scatter_list_mkey);
16+
is_dump = MLX5_CAP_GEN(dev->mdev, dump_fill_mkey);
17+
is_null = MLX5_CAP_GEN(dev->mdev, null_mkey);
2218

23-
int mlx5_cmd_null_mkey(struct mlx5_core_dev *dev, u32 *null_mkey)
24-
{
25-
u32 out[MLX5_ST_SZ_DW(query_special_contexts_out)] = {};
26-
u32 in[MLX5_ST_SZ_DW(query_special_contexts_in)] = {};
27-
int err;
19+
dev->mkeys.terminate_scatter_list_mkey = MLX5_TERMINATE_SCATTER_LIST_LKEY;
20+
if (!is_terminate && !is_dump && !is_null)
21+
return 0;
2822

2923
MLX5_SET(query_special_contexts_in, in, opcode,
3024
MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS);
31-
err = mlx5_cmd_exec_inout(dev, query_special_contexts, in, out);
32-
if (!err)
33-
*null_mkey = MLX5_GET(query_special_contexts_out, out,
34-
null_mkey);
35-
return err;
25+
err = mlx5_cmd_exec_inout(dev->mdev, query_special_contexts, in, out);
26+
if (err)
27+
return err;
28+
29+
if (is_dump)
30+
dev->mkeys.dump_fill_mkey = MLX5_GET(query_special_contexts_out,
31+
out, dump_fill_mkey);
32+
33+
if (is_null)
34+
dev->mkeys.null_mkey = cpu_to_be32(
35+
MLX5_GET(query_special_contexts_out, out, null_mkey));
36+
37+
if (is_terminate)
38+
dev->mkeys.terminate_scatter_list_mkey =
39+
cpu_to_be32(MLX5_GET(query_special_contexts_out, out,
40+
terminate_scatter_list_mkey));
41+
42+
return 0;
3643
}
3744

3845
int mlx5_cmd_query_cong_params(struct mlx5_core_dev *dev, int cong_point,

drivers/infiniband/hw/mlx5/cmd.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@
3737
#include <linux/kernel.h>
3838
#include <linux/mlx5/driver.h>
3939

40-
int mlx5_cmd_dump_fill_mkey(struct mlx5_core_dev *dev, u32 *mkey);
41-
int mlx5_cmd_null_mkey(struct mlx5_core_dev *dev, u32 *null_mkey);
40+
int mlx5r_cmd_query_special_mkeys(struct mlx5_ib_dev *dev);
4241
int mlx5_cmd_query_cong_params(struct mlx5_core_dev *dev, int cong_point,
4342
void *out);
4443
int mlx5_cmd_dealloc_pd(struct mlx5_core_dev *dev, u32 pdn, u16 uid);

drivers/infiniband/hw/mlx5/main.c

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1756,13 +1756,9 @@ static int set_ucontext_resp(struct ib_ucontext *uctx,
17561756
struct mlx5_ib_dev *dev = to_mdev(ibdev);
17571757
struct mlx5_ib_ucontext *context = to_mucontext(uctx);
17581758
struct mlx5_bfreg_info *bfregi = &context->bfregi;
1759-
int err;
17601759

17611760
if (MLX5_CAP_GEN(dev->mdev, dump_fill_mkey)) {
1762-
err = mlx5_cmd_dump_fill_mkey(dev->mdev,
1763-
&resp->dump_fill_mkey);
1764-
if (err)
1765-
return err;
1761+
resp->dump_fill_mkey = dev->mkeys.dump_fill_mkey;
17661762
resp->comp_mask |=
17671763
MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_DUMP_FILL_MKEY;
17681764
}
@@ -3012,26 +3008,63 @@ static void mlx5_eth_lag_cleanup(struct mlx5_ib_dev *dev)
30123008
}
30133009
}
30143010

3015-
static int mlx5_add_netdev_notifier(struct mlx5_ib_dev *dev, u32 port_num)
3011+
static void mlx5_netdev_notifier_register(struct mlx5_roce *roce,
3012+
struct net_device *netdev)
30163013
{
30173014
int err;
30183015

3019-
dev->port[port_num].roce.nb.notifier_call = mlx5_netdev_event;
3020-
err = register_netdevice_notifier(&dev->port[port_num].roce.nb);
3021-
if (err) {
3022-
dev->port[port_num].roce.nb.notifier_call = NULL;
3023-
return err;
3024-
}
3016+
if (roce->tracking_netdev)
3017+
return;
3018+
roce->tracking_netdev = netdev;
3019+
roce->nb.notifier_call = mlx5_netdev_event;
3020+
err = register_netdevice_notifier_dev_net(netdev, &roce->nb, &roce->nn);
3021+
WARN_ON(err);
3022+
}
30253023

3026-
return 0;
3024+
static void mlx5_netdev_notifier_unregister(struct mlx5_roce *roce)
3025+
{
3026+
if (!roce->tracking_netdev)
3027+
return;
3028+
unregister_netdevice_notifier_dev_net(roce->tracking_netdev, &roce->nb,
3029+
&roce->nn);
3030+
roce->tracking_netdev = NULL;
30273031
}
30283032

3029-
static void mlx5_remove_netdev_notifier(struct mlx5_ib_dev *dev, u32 port_num)
3033+
static int mlx5e_mdev_notifier_event(struct notifier_block *nb,
3034+
unsigned long event, void *data)
30303035
{
3031-
if (dev->port[port_num].roce.nb.notifier_call) {
3032-
unregister_netdevice_notifier(&dev->port[port_num].roce.nb);
3033-
dev->port[port_num].roce.nb.notifier_call = NULL;
3036+
struct mlx5_roce *roce = container_of(nb, struct mlx5_roce, mdev_nb);
3037+
struct net_device *netdev = data;
3038+
3039+
switch (event) {
3040+
case MLX5_DRIVER_EVENT_UPLINK_NETDEV:
3041+
if (netdev)
3042+
mlx5_netdev_notifier_register(roce, netdev);
3043+
else
3044+
mlx5_netdev_notifier_unregister(roce);
3045+
break;
3046+
default:
3047+
return NOTIFY_DONE;
30343048
}
3049+
3050+
return NOTIFY_OK;
3051+
}
3052+
3053+
static void mlx5_mdev_netdev_track(struct mlx5_ib_dev *dev, u32 port_num)
3054+
{
3055+
struct mlx5_roce *roce = &dev->port[port_num].roce;
3056+
3057+
roce->mdev_nb.notifier_call = mlx5e_mdev_notifier_event;
3058+
mlx5_blocking_notifier_register(dev->mdev, &roce->mdev_nb);
3059+
mlx5_core_uplink_netdev_event_replay(dev->mdev);
3060+
}
3061+
3062+
static void mlx5_mdev_netdev_untrack(struct mlx5_ib_dev *dev, u32 port_num)
3063+
{
3064+
struct mlx5_roce *roce = &dev->port[port_num].roce;
3065+
3066+
mlx5_blocking_notifier_unregister(dev->mdev, &roce->mdev_nb);
3067+
mlx5_netdev_notifier_unregister(roce);
30353068
}
30363069

30373070
static int mlx5_enable_eth(struct mlx5_ib_dev *dev)
@@ -3138,7 +3171,7 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
31383171
if (mpi->mdev_events.notifier_call)
31393172
mlx5_notifier_unregister(mpi->mdev, &mpi->mdev_events);
31403173
mpi->mdev_events.notifier_call = NULL;
3141-
mlx5_remove_netdev_notifier(ibdev, port_num);
3174+
mlx5_mdev_netdev_untrack(ibdev, port_num);
31423175
spin_lock(&port->mp.mpi_lock);
31433176

31443177
comps = mpi->mdev_refcnt;
@@ -3196,12 +3229,7 @@ static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev,
31963229
if (err)
31973230
goto unbind;
31983231

3199-
err = mlx5_add_netdev_notifier(ibdev, port_num);
3200-
if (err) {
3201-
mlx5_ib_err(ibdev, "failed adding netdev notifier for port %u\n",
3202-
port_num + 1);
3203-
goto unbind;
3204-
}
3232+
mlx5_mdev_netdev_track(ibdev, port_num);
32053233

32063234
mpi->mdev_events.notifier_call = mlx5_ib_event_slave_port;
32073235
mlx5_notifier_register(mpi->mdev, &mpi->mdev_events);
@@ -3634,6 +3662,10 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev)
36343662
dev->port[i].roce.last_port_state = IB_PORT_DOWN;
36353663
}
36363664

3665+
err = mlx5r_cmd_query_special_mkeys(dev);
3666+
if (err)
3667+
return err;
3668+
36373669
err = mlx5_ib_init_multiport_master(dev);
36383670
if (err)
36393671
return err;
@@ -3909,9 +3941,7 @@ static int mlx5_ib_roce_init(struct mlx5_ib_dev *dev)
39093941
port_num = mlx5_core_native_port_num(dev->mdev) - 1;
39103942

39113943
/* Register only for native ports */
3912-
err = mlx5_add_netdev_notifier(dev, port_num);
3913-
if (err)
3914-
return err;
3944+
mlx5_mdev_netdev_track(dev, port_num);
39153945

39163946
err = mlx5_enable_eth(dev);
39173947
if (err)
@@ -3920,7 +3950,7 @@ static int mlx5_ib_roce_init(struct mlx5_ib_dev *dev)
39203950

39213951
return 0;
39223952
cleanup:
3923-
mlx5_remove_netdev_notifier(dev, port_num);
3953+
mlx5_mdev_netdev_untrack(dev, port_num);
39243954
return err;
39253955
}
39263956

@@ -3938,7 +3968,7 @@ static void mlx5_ib_roce_cleanup(struct mlx5_ib_dev *dev)
39383968
mlx5_disable_eth(dev);
39393969

39403970
port_num = mlx5_core_native_port_num(dev->mdev) - 1;
3941-
mlx5_remove_netdev_notifier(dev, port_num);
3971+
mlx5_mdev_netdev_untrack(dev, port_num);
39423972
}
39433973
}
39443974

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,9 @@ struct mlx5_roce {
843843
rwlock_t netdev_lock;
844844
struct net_device *netdev;
845845
struct notifier_block nb;
846+
struct netdev_net_notifier nn;
847+
struct notifier_block mdev_nb;
848+
struct net_device *tracking_netdev;
846849
atomic_t tx_port_affinity;
847850
enum ib_port_state last_port_state;
848851
struct mlx5_ib_dev *dev;
@@ -1062,6 +1065,13 @@ struct mlx5_port_caps {
10621065
u8 ext_port_cap;
10631066
};
10641067

1068+
1069+
struct mlx5_special_mkeys {
1070+
u32 dump_fill_mkey;
1071+
__be32 null_mkey;
1072+
__be32 terminate_scatter_list_mkey;
1073+
};
1074+
10651075
struct mlx5_ib_dev {
10661076
struct ib_device ib_dev;
10671077
struct mlx5_core_dev *mdev;
@@ -1092,7 +1102,6 @@ struct mlx5_ib_dev {
10921102

10931103
struct xarray odp_mkeys;
10941104

1095-
u32 null_mkey;
10961105
struct mlx5_ib_flow_db *flow_db;
10971106
/* protect resources needed as part of reset flow */
10981107
spinlock_t reset_flow_resource_lock;
@@ -1121,6 +1130,7 @@ struct mlx5_ib_dev {
11211130
struct mlx5_port_caps port_caps[MLX5_MAX_PORTS];
11221131
u16 pkey_table_len;
11231132
u8 lag_ports;
1133+
struct mlx5_special_mkeys mkeys;
11241134
};
11251135

11261136
static inline struct mlx5_ib_cq *to_mibcq(struct mlx5_core_cq *mcq)

drivers/infiniband/hw/mlx5/odp.c

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ static void populate_klm(struct mlx5_klm *pklm, size_t idx, size_t nentries,
104104
if (flags & MLX5_IB_UPD_XLT_ZAP) {
105105
for (; pklm != end; pklm++, idx++) {
106106
pklm->bcount = cpu_to_be32(MLX5_IMR_MTT_SIZE);
107-
pklm->key = cpu_to_be32(mr_to_mdev(imr)->null_mkey);
107+
pklm->key = mr_to_mdev(imr)->mkeys.null_mkey;
108108
pklm->va = 0;
109109
}
110110
return;
@@ -137,7 +137,7 @@ static void populate_klm(struct mlx5_klm *pklm, size_t idx, size_t nentries,
137137
pklm->key = cpu_to_be32(mtt->ibmr.lkey);
138138
pklm->va = cpu_to_be64(idx * MLX5_IMR_MTT_SIZE);
139139
} else {
140-
pklm->key = cpu_to_be32(mr_to_mdev(imr)->null_mkey);
140+
pklm->key = mr_to_mdev(imr)->mkeys.null_mkey;
141141
pklm->va = 0;
142142
}
143143
}
@@ -986,7 +986,7 @@ static int pagefault_data_segments(struct mlx5_ib_dev *dev,
986986
{
987987
int ret = 0, npages = 0;
988988
u64 io_virt;
989-
u32 key;
989+
__be32 key;
990990
u32 byte_count;
991991
size_t bcnt;
992992
int inline_segment;
@@ -1000,7 +1000,7 @@ static int pagefault_data_segments(struct mlx5_ib_dev *dev,
10001000
struct mlx5_wqe_data_seg *dseg = wqe;
10011001

10021002
io_virt = be64_to_cpu(dseg->addr);
1003-
key = be32_to_cpu(dseg->lkey);
1003+
key = dseg->lkey;
10041004
byte_count = be32_to_cpu(dseg->byte_count);
10051005
inline_segment = !!(byte_count & MLX5_INLINE_SEG);
10061006
bcnt = byte_count & ~MLX5_INLINE_SEG;
@@ -1014,7 +1014,8 @@ static int pagefault_data_segments(struct mlx5_ib_dev *dev,
10141014
}
10151015

10161016
/* receive WQE end of sg list. */
1017-
if (receive_queue && bcnt == 0 && key == MLX5_INVALID_LKEY &&
1017+
if (receive_queue && bcnt == 0 &&
1018+
key == dev->mkeys.terminate_scatter_list_mkey &&
10181019
io_virt == 0)
10191020
break;
10201021

@@ -1034,7 +1035,7 @@ static int pagefault_data_segments(struct mlx5_ib_dev *dev,
10341035
continue;
10351036
}
10361037

1037-
ret = pagefault_single_data_segment(dev, NULL, key,
1038+
ret = pagefault_single_data_segment(dev, NULL, be32_to_cpu(key),
10381039
io_virt, bcnt,
10391040
&pfault->bytes_committed,
10401041
bytes_mapped);
@@ -1611,25 +1612,15 @@ static const struct ib_device_ops mlx5_ib_dev_odp_ops = {
16111612

16121613
int mlx5_ib_odp_init_one(struct mlx5_ib_dev *dev)
16131614
{
1614-
int ret = 0;
1615-
16161615
internal_fill_odp_caps(dev);
16171616

16181617
if (!(dev->odp_caps.general_caps & IB_ODP_SUPPORT))
1619-
return ret;
1618+
return 0;
16201619

16211620
ib_set_device_ops(&dev->ib_dev, &mlx5_ib_dev_odp_ops);
16221621

1623-
if (dev->odp_caps.general_caps & IB_ODP_SUPPORT_IMPLICIT) {
1624-
ret = mlx5_cmd_null_mkey(dev->mdev, &dev->null_mkey);
1625-
if (ret) {
1626-
mlx5_ib_err(dev, "Error getting null_mkey %d\n", ret);
1627-
return ret;
1628-
}
1629-
}
1630-
16311622
mutex_init(&dev->odp_eq_mutex);
1632-
return ret;
1623+
return 0;
16331624
}
16341625

16351626
void mlx5_ib_odp_cleanup_one(struct mlx5_ib_dev *dev)

drivers/infiniband/hw/mlx5/srq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ int mlx5_ib_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
447447

448448
if (i < srq->msrq.max_avail_gather) {
449449
scat[i].byte_count = 0;
450-
scat[i].lkey = cpu_to_be32(MLX5_INVALID_LKEY);
450+
scat[i].lkey = dev->mkeys.terminate_scatter_list_mkey;
451451
scat[i].addr = 0;
452452
}
453453
}

drivers/infiniband/hw/mlx5/wr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1252,7 +1252,7 @@ int mlx5_ib_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
12521252

12531253
if (i < qp->rq.max_gs) {
12541254
scat[i].byte_count = 0;
1255-
scat[i].lkey = cpu_to_be32(MLX5_INVALID_LKEY);
1255+
scat[i].lkey = dev->mkeys.terminate_scatter_list_mkey;
12561256
scat[i].addr = 0;
12571257
}
12581258

drivers/net/ethernet/mellanox/mlx5/core/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ mlx5_core-$(CONFIG_MLX5_EN_MACSEC) += en_accel/macsec.o en_accel/macsec_fs.o \
9797

9898
mlx5_core-$(CONFIG_MLX5_EN_IPSEC) += en_accel/ipsec.o en_accel/ipsec_rxtx.o \
9999
en_accel/ipsec_stats.o en_accel/ipsec_fs.o \
100-
en_accel/ipsec_offload.o
100+
en_accel/ipsec_offload.o lib/ipsec_fs_roce.o
101101

102102
mlx5_core-$(CONFIG_MLX5_EN_TLS) += en_accel/ktls_stats.o \
103103
en_accel/fs_tcp.o en_accel/ktls.o en_accel/ktls_txrx.o \

0 commit comments

Comments
 (0)