@@ -351,6 +351,7 @@ static int eth_link_query_port(struct ib_device *ibdev, u8 port,
351
351
enum ib_mtu tmp ;
352
352
struct mlx4_cmd_mailbox * mailbox ;
353
353
int err = 0 ;
354
+ int is_bonded = mlx4_is_bonded (mdev -> dev );
354
355
355
356
mailbox = mlx4_alloc_cmd_mailbox (mdev -> dev );
356
357
if (IS_ERR (mailbox ))
@@ -374,8 +375,12 @@ static int eth_link_query_port(struct ib_device *ibdev, u8 port,
374
375
props -> state = IB_PORT_DOWN ;
375
376
props -> phys_state = state_to_phys_state (props -> state );
376
377
props -> active_mtu = IB_MTU_256 ;
378
+ if (is_bonded )
379
+ rtnl_lock (); /* required to get upper dev */
377
380
spin_lock_bh (& iboe -> lock );
378
381
ndev = iboe -> netdevs [port - 1 ];
382
+ if (ndev && is_bonded )
383
+ ndev = netdev_master_upper_dev_get (ndev );
379
384
if (!ndev )
380
385
goto out_unlock ;
381
386
@@ -387,6 +392,8 @@ static int eth_link_query_port(struct ib_device *ibdev, u8 port,
387
392
props -> phys_state = state_to_phys_state (props -> state );
388
393
out_unlock :
389
394
spin_unlock_bh (& iboe -> lock );
395
+ if (is_bonded )
396
+ rtnl_unlock ();
390
397
out :
391
398
mlx4_free_cmd_mailbox (mdev -> dev , mailbox );
392
399
return err ;
@@ -844,7 +851,7 @@ int mlx4_ib_add_mc(struct mlx4_ib_dev *mdev, struct mlx4_ib_qp *mqp,
844
851
845
852
struct mlx4_ib_steering {
846
853
struct list_head list ;
847
- u64 reg_id ;
854
+ struct mlx4_flow_reg_id reg_id ;
848
855
union ib_gid gid ;
849
856
};
850
857
@@ -1135,9 +1142,11 @@ static struct ib_flow *mlx4_ib_create_flow(struct ib_qp *qp,
1135
1142
struct ib_flow_attr * flow_attr ,
1136
1143
int domain )
1137
1144
{
1138
- int err = 0 , i = 0 ;
1145
+ int err = 0 , i = 0 , j = 0 ;
1139
1146
struct mlx4_ib_flow * mflow ;
1140
1147
enum mlx4_net_trans_promisc_mode type [2 ];
1148
+ struct mlx4_dev * dev = (to_mdev (qp -> device ))-> dev ;
1149
+ int is_bonded = mlx4_is_bonded (dev );
1141
1150
1142
1151
memset (type , 0 , sizeof (type ));
1143
1152
@@ -1172,26 +1181,55 @@ static struct ib_flow *mlx4_ib_create_flow(struct ib_qp *qp,
1172
1181
1173
1182
while (i < ARRAY_SIZE (type ) && type [i ]) {
1174
1183
err = __mlx4_ib_create_flow (qp , flow_attr , domain , type [i ],
1175
- & mflow -> reg_id [i ]);
1184
+ & mflow -> reg_id [i ]. id );
1176
1185
if (err )
1177
1186
goto err_create_flow ;
1178
1187
i ++ ;
1188
+ if (is_bonded ) {
1189
+ flow_attr -> port = 2 ;
1190
+ err = __mlx4_ib_create_flow (qp , flow_attr ,
1191
+ domain , type [j ],
1192
+ & mflow -> reg_id [j ].mirror );
1193
+ flow_attr -> port = 1 ;
1194
+ if (err )
1195
+ goto err_create_flow ;
1196
+ j ++ ;
1197
+ }
1198
+
1179
1199
}
1180
1200
1181
1201
if (i < ARRAY_SIZE (type ) && flow_attr -> type == IB_FLOW_ATTR_NORMAL ) {
1182
- err = mlx4_ib_tunnel_steer_add (qp , flow_attr , & mflow -> reg_id [i ]);
1202
+ err = mlx4_ib_tunnel_steer_add (qp , flow_attr ,
1203
+ & mflow -> reg_id [i ].id );
1183
1204
if (err )
1184
1205
goto err_create_flow ;
1185
1206
i ++ ;
1207
+ if (is_bonded ) {
1208
+ flow_attr -> port = 2 ;
1209
+ err = mlx4_ib_tunnel_steer_add (qp , flow_attr ,
1210
+ & mflow -> reg_id [j ].mirror );
1211
+ flow_attr -> port = 1 ;
1212
+ if (err )
1213
+ goto err_create_flow ;
1214
+ j ++ ;
1215
+ }
1216
+ /* function to create mirror rule */
1186
1217
}
1187
1218
1188
1219
return & mflow -> ibflow ;
1189
1220
1190
1221
err_create_flow :
1191
1222
while (i ) {
1192
- (void )__mlx4_ib_destroy_flow (to_mdev (qp -> device )-> dev , mflow -> reg_id [i ]);
1223
+ (void )__mlx4_ib_destroy_flow (to_mdev (qp -> device )-> dev ,
1224
+ mflow -> reg_id [i ].id );
1193
1225
i -- ;
1194
1226
}
1227
+
1228
+ while (j ) {
1229
+ (void )__mlx4_ib_destroy_flow (to_mdev (qp -> device )-> dev ,
1230
+ mflow -> reg_id [j ].mirror );
1231
+ j -- ;
1232
+ }
1195
1233
err_free :
1196
1234
kfree (mflow );
1197
1235
return ERR_PTR (err );
@@ -1204,10 +1242,16 @@ static int mlx4_ib_destroy_flow(struct ib_flow *flow_id)
1204
1242
struct mlx4_ib_dev * mdev = to_mdev (flow_id -> qp -> device );
1205
1243
struct mlx4_ib_flow * mflow = to_mflow (flow_id );
1206
1244
1207
- while (i < ARRAY_SIZE (mflow -> reg_id ) && mflow -> reg_id [i ]) {
1208
- err = __mlx4_ib_destroy_flow (mdev -> dev , mflow -> reg_id [i ]);
1245
+ while (i < ARRAY_SIZE (mflow -> reg_id ) && mflow -> reg_id [i ]. id ) {
1246
+ err = __mlx4_ib_destroy_flow (mdev -> dev , mflow -> reg_id [i ]. id );
1209
1247
if (err )
1210
1248
ret = err ;
1249
+ if (mflow -> reg_id [i ].mirror ) {
1250
+ err = __mlx4_ib_destroy_flow (mdev -> dev ,
1251
+ mflow -> reg_id [i ].mirror );
1252
+ if (err )
1253
+ ret = err ;
1254
+ }
1211
1255
i ++ ;
1212
1256
}
1213
1257
@@ -1219,11 +1263,12 @@ static int mlx4_ib_mcg_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
1219
1263
{
1220
1264
int err ;
1221
1265
struct mlx4_ib_dev * mdev = to_mdev (ibqp -> device );
1266
+ struct mlx4_dev * dev = mdev -> dev ;
1222
1267
struct mlx4_ib_qp * mqp = to_mqp (ibqp );
1223
- u64 reg_id ;
1224
1268
struct mlx4_ib_steering * ib_steering = NULL ;
1225
1269
enum mlx4_protocol prot = (gid -> raw [1 ] == 0x0e ) ?
1226
1270
MLX4_PROT_IB_IPV4 : MLX4_PROT_IB_IPV6 ;
1271
+ struct mlx4_flow_reg_id reg_id ;
1227
1272
1228
1273
if (mdev -> dev -> caps .steering_mode ==
1229
1274
MLX4_STEERING_MODE_DEVICE_MANAGED ) {
@@ -1235,10 +1280,20 @@ static int mlx4_ib_mcg_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
1235
1280
err = mlx4_multicast_attach (mdev -> dev , & mqp -> mqp , gid -> raw , mqp -> port ,
1236
1281
!!(mqp -> flags &
1237
1282
MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK ),
1238
- prot , & reg_id );
1283
+ prot , & reg_id . id );
1239
1284
if (err )
1240
1285
goto err_malloc ;
1241
1286
1287
+ reg_id .mirror = 0 ;
1288
+ if (mlx4_is_bonded (dev )) {
1289
+ err = mlx4_multicast_attach (mdev -> dev , & mqp -> mqp , gid -> raw , 2 ,
1290
+ !!(mqp -> flags &
1291
+ MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK ),
1292
+ prot , & reg_id .mirror );
1293
+ if (err )
1294
+ goto err_add ;
1295
+ }
1296
+
1242
1297
err = add_gid_entry (ibqp , gid );
1243
1298
if (err )
1244
1299
goto err_add ;
@@ -1254,7 +1309,10 @@ static int mlx4_ib_mcg_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
1254
1309
1255
1310
err_add :
1256
1311
mlx4_multicast_detach (mdev -> dev , & mqp -> mqp , gid -> raw ,
1257
- prot , reg_id );
1312
+ prot , reg_id .id );
1313
+ if (reg_id .mirror )
1314
+ mlx4_multicast_detach (mdev -> dev , & mqp -> mqp , gid -> raw ,
1315
+ prot , reg_id .mirror );
1258
1316
err_malloc :
1259
1317
kfree (ib_steering );
1260
1318
@@ -1281,10 +1339,12 @@ static int mlx4_ib_mcg_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
1281
1339
{
1282
1340
int err ;
1283
1341
struct mlx4_ib_dev * mdev = to_mdev (ibqp -> device );
1342
+ struct mlx4_dev * dev = mdev -> dev ;
1284
1343
struct mlx4_ib_qp * mqp = to_mqp (ibqp );
1285
1344
struct net_device * ndev ;
1286
1345
struct mlx4_ib_gid_entry * ge ;
1287
- u64 reg_id = 0 ;
1346
+ struct mlx4_flow_reg_id reg_id = {0 , 0 };
1347
+
1288
1348
enum mlx4_protocol prot = (gid -> raw [1 ] == 0x0e ) ?
1289
1349
MLX4_PROT_IB_IPV4 : MLX4_PROT_IB_IPV6 ;
1290
1350
@@ -1309,10 +1369,17 @@ static int mlx4_ib_mcg_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
1309
1369
}
1310
1370
1311
1371
err = mlx4_multicast_detach (mdev -> dev , & mqp -> mqp , gid -> raw ,
1312
- prot , reg_id );
1372
+ prot , reg_id . id );
1313
1373
if (err )
1314
1374
return err ;
1315
1375
1376
+ if (mlx4_is_bonded (dev )) {
1377
+ err = mlx4_multicast_detach (mdev -> dev , & mqp -> mqp , gid -> raw ,
1378
+ prot , reg_id .mirror );
1379
+ if (err )
1380
+ return err ;
1381
+ }
1382
+
1316
1383
mutex_lock (& mqp -> mutex );
1317
1384
ge = find_gid_entry (mqp , gid -> raw );
1318
1385
if (ge ) {
@@ -1440,6 +1507,7 @@ static void update_gids_task(struct work_struct *work)
1440
1507
union ib_gid * gids ;
1441
1508
int err ;
1442
1509
struct mlx4_dev * dev = gw -> dev -> dev ;
1510
+ int is_bonded = mlx4_is_bonded (dev );
1443
1511
1444
1512
if (!gw -> dev -> ib_active )
1445
1513
return ;
@@ -1459,7 +1527,10 @@ static void update_gids_task(struct work_struct *work)
1459
1527
if (err )
1460
1528
pr_warn ("set port command failed\n" );
1461
1529
else
1462
- mlx4_ib_dispatch_event (gw -> dev , gw -> port , IB_EVENT_GID_CHANGE );
1530
+ if ((gw -> port == 1 ) || !is_bonded )
1531
+ mlx4_ib_dispatch_event (gw -> dev ,
1532
+ is_bonded ? 1 : gw -> port ,
1533
+ IB_EVENT_GID_CHANGE );
1463
1534
1464
1535
mlx4_free_cmd_mailbox (dev , mailbox );
1465
1536
kfree (gw );
@@ -1875,7 +1946,8 @@ static void mlx4_ib_scan_netdevs(struct mlx4_ib_dev *ibdev,
1875
1946
* don't want the bond IP based gids in the table since
1876
1947
* flows that select port by gid may get the down port.
1877
1948
*/
1878
- if (port_state == IB_PORT_DOWN ) {
1949
+ if (port_state == IB_PORT_DOWN &&
1950
+ !mlx4_is_bonded (ibdev -> dev )) {
1879
1951
reset_gid_table (ibdev , port );
1880
1952
mlx4_ib_set_default_gid (ibdev ,
1881
1953
curr_netdev ,
@@ -2047,6 +2119,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
2047
2119
int err ;
2048
2120
struct mlx4_ib_iboe * iboe ;
2049
2121
int ib_num_ports = 0 ;
2122
+ int num_req_counters ;
2050
2123
2051
2124
pr_info_once ("%s" , mlx4_ib_version );
2052
2125
@@ -2080,13 +2153,15 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
2080
2153
MLX4_INIT_DOORBELL_LOCK (& ibdev -> uar_lock );
2081
2154
2082
2155
ibdev -> dev = dev ;
2156
+ ibdev -> bond_next_port = 0 ;
2083
2157
2084
2158
strlcpy (ibdev -> ib_dev .name , "mlx4_%d" , IB_DEVICE_NAME_MAX );
2085
2159
ibdev -> ib_dev .owner = THIS_MODULE ;
2086
2160
ibdev -> ib_dev .node_type = RDMA_NODE_IB_CA ;
2087
2161
ibdev -> ib_dev .local_dma_lkey = dev -> caps .reserved_lkey ;
2088
2162
ibdev -> num_ports = num_ports ;
2089
- ibdev -> ib_dev .phys_port_cnt = ibdev -> num_ports ;
2163
+ ibdev -> ib_dev .phys_port_cnt = mlx4_is_bonded (dev ) ?
2164
+ 1 : ibdev -> num_ports ;
2090
2165
ibdev -> ib_dev .num_comp_vectors = dev -> caps .num_comp_vectors ;
2091
2166
ibdev -> ib_dev .dma_device = & dev -> persist -> pdev -> dev ;
2092
2167
@@ -2207,7 +2282,8 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
2207
2282
if (init_node_data (ibdev ))
2208
2283
goto err_map ;
2209
2284
2210
- for (i = 0 ; i < ibdev -> num_ports ; ++ i ) {
2285
+ num_req_counters = mlx4_is_bonded (dev ) ? 1 : ibdev -> num_ports ;
2286
+ for (i = 0 ; i < num_req_counters ; ++ i ) {
2211
2287
mutex_init (& ibdev -> qp1_proxy_lock [i ]);
2212
2288
if (mlx4_ib_port_link_layer (& ibdev -> ib_dev , i + 1 ) ==
2213
2289
IB_LINK_LAYER_ETHERNET ) {
@@ -2218,6 +2294,10 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
2218
2294
ibdev -> counters [i ] = -1 ;
2219
2295
}
2220
2296
}
2297
+ if (mlx4_is_bonded (dev ))
2298
+ for (i = 1 ; i < ibdev -> num_ports ; ++ i )
2299
+ ibdev -> counters [i ] = ibdev -> counters [0 ];
2300
+
2221
2301
2222
2302
mlx4_foreach_port (i , dev , MLX4_PORT_TYPE_IB )
2223
2303
ib_num_ports ++ ;
@@ -2538,6 +2618,38 @@ static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init)
2538
2618
return ;
2539
2619
}
2540
2620
2621
+ static void handle_bonded_port_state_event (struct work_struct * work )
2622
+ {
2623
+ struct ib_event_work * ew =
2624
+ container_of (work , struct ib_event_work , work );
2625
+ struct mlx4_ib_dev * ibdev = ew -> ib_dev ;
2626
+ enum ib_port_state bonded_port_state = IB_PORT_NOP ;
2627
+ int i ;
2628
+ struct ib_event ibev ;
2629
+
2630
+ kfree (ew );
2631
+ spin_lock_bh (& ibdev -> iboe .lock );
2632
+ for (i = 0 ; i < MLX4_MAX_PORTS ; ++ i ) {
2633
+ struct net_device * curr_netdev = ibdev -> iboe .netdevs [i ];
2634
+
2635
+ enum ib_port_state curr_port_state =
2636
+ (netif_running (curr_netdev ) &&
2637
+ netif_carrier_ok (curr_netdev )) ?
2638
+ IB_PORT_ACTIVE : IB_PORT_DOWN ;
2639
+
2640
+ bonded_port_state = (bonded_port_state != IB_PORT_ACTIVE ) ?
2641
+ curr_port_state : IB_PORT_ACTIVE ;
2642
+ }
2643
+ spin_unlock_bh (& ibdev -> iboe .lock );
2644
+
2645
+ ibev .device = & ibdev -> ib_dev ;
2646
+ ibev .element .port_num = 1 ;
2647
+ ibev .event = (bonded_port_state == IB_PORT_ACTIVE ) ?
2648
+ IB_EVENT_PORT_ACTIVE : IB_EVENT_PORT_ERR ;
2649
+
2650
+ ib_dispatch_event (& ibev );
2651
+ }
2652
+
2541
2653
static void mlx4_ib_event (struct mlx4_dev * dev , void * ibdev_ptr ,
2542
2654
enum mlx4_dev_event event , unsigned long param )
2543
2655
{
@@ -2547,6 +2659,18 @@ static void mlx4_ib_event(struct mlx4_dev *dev, void *ibdev_ptr,
2547
2659
struct ib_event_work * ew ;
2548
2660
int p = 0 ;
2549
2661
2662
+ if (mlx4_is_bonded (dev ) &&
2663
+ ((event == MLX4_DEV_EVENT_PORT_UP ) ||
2664
+ (event == MLX4_DEV_EVENT_PORT_DOWN ))) {
2665
+ ew = kmalloc (sizeof (* ew ), GFP_ATOMIC );
2666
+ if (!ew )
2667
+ return ;
2668
+ INIT_WORK (& ew -> work , handle_bonded_port_state_event );
2669
+ ew -> ib_dev = ibdev ;
2670
+ queue_work (wq , & ew -> work );
2671
+ return ;
2672
+ }
2673
+
2550
2674
if (event == MLX4_DEV_EVENT_PORT_MGMT_CHANGE )
2551
2675
eqe = (struct mlx4_eqe * )param ;
2552
2676
else
@@ -2607,7 +2731,7 @@ static void mlx4_ib_event(struct mlx4_dev *dev, void *ibdev_ptr,
2607
2731
}
2608
2732
2609
2733
ibev .device = ibdev_ptr ;
2610
- ibev .element .port_num = ( u8 ) p ;
2734
+ ibev .element .port_num = mlx4_is_bonded ( ibdev -> dev ) ? 1 : ( u8 ) p ;
2611
2735
2612
2736
ib_dispatch_event (& ibev );
2613
2737
}
@@ -2616,7 +2740,8 @@ static struct mlx4_interface mlx4_ib_interface = {
2616
2740
.add = mlx4_ib_add ,
2617
2741
.remove = mlx4_ib_remove ,
2618
2742
.event = mlx4_ib_event ,
2619
- .protocol = MLX4_PROT_IB_IPV6
2743
+ .protocol = MLX4_PROT_IB_IPV6 ,
2744
+ .flags = MLX4_INTFF_BONDING
2620
2745
};
2621
2746
2622
2747
static int __init mlx4_ib_init (void )
0 commit comments