Skip to content

Commit c50647d

Browse files
jahurleydavem330
authored andcommitted
nfp: flower: ignore duplicate cb requests for same rule
If a flower rule has a repr both as ingress and egress port then 2 callbacks may be generated for the same rule request. Add an indicator to each flow as to whether or not it was added from an ingress registered cb. If so then ignore add/del/stat requests to it from an egress cb. Signed-off-by: John Hurley <[email protected]> Reviewed-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 54a4a03 commit c50647d

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

drivers/net/ethernet/netronome/nfp/flower/main.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ struct nfp_fl_payload {
194194
char *unmasked_data;
195195
char *mask_data;
196196
char *action_data;
197+
bool ingress_offload;
197198
};
198199

199200
struct nfp_fl_stats_frame {

drivers/net/ethernet/netronome/nfp/flower/offload.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ nfp_flower_calculate_key_layers(struct nfp_app *app,
345345
}
346346

347347
static struct nfp_fl_payload *
348-
nfp_flower_allocate_new(struct nfp_fl_key_ls *key_layer)
348+
nfp_flower_allocate_new(struct nfp_fl_key_ls *key_layer, bool egress)
349349
{
350350
struct nfp_fl_payload *flow_pay;
351351

@@ -371,6 +371,8 @@ nfp_flower_allocate_new(struct nfp_fl_key_ls *key_layer)
371371
flow_pay->meta.flags = 0;
372372
spin_lock_init(&flow_pay->lock);
373373

374+
flow_pay->ingress_offload = !egress;
375+
374376
return flow_pay;
375377

376378
err_free_mask:
@@ -402,8 +404,20 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
402404
struct nfp_flower_priv *priv = app->priv;
403405
struct nfp_fl_payload *flow_pay;
404406
struct nfp_fl_key_ls *key_layer;
407+
struct net_device *ingr_dev;
405408
int err;
406409

410+
ingr_dev = egress ? NULL : netdev;
411+
flow_pay = nfp_flower_search_fl_table(app, flow->cookie, ingr_dev,
412+
NFP_FL_STATS_CTX_DONT_CARE);
413+
if (flow_pay) {
414+
/* Ignore as duplicate if it has been added by different cb. */
415+
if (flow_pay->ingress_offload && egress)
416+
return 0;
417+
else
418+
return -EOPNOTSUPP;
419+
}
420+
407421
key_layer = kmalloc(sizeof(*key_layer), GFP_KERNEL);
408422
if (!key_layer)
409423
return -ENOMEM;
@@ -413,7 +427,7 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
413427
if (err)
414428
goto err_free_key_ls;
415429

416-
flow_pay = nfp_flower_allocate_new(key_layer);
430+
flow_pay = nfp_flower_allocate_new(key_layer, egress);
417431
if (!flow_pay) {
418432
err = -ENOMEM;
419433
goto err_free_key_ls;
@@ -485,7 +499,7 @@ nfp_flower_del_offload(struct nfp_app *app, struct net_device *netdev,
485499
nfp_flow = nfp_flower_search_fl_table(app, flow->cookie, ingr_dev,
486500
NFP_FL_STATS_CTX_DONT_CARE);
487501
if (!nfp_flow)
488-
return -ENOENT;
502+
return egress ? 0 : -ENOENT;
489503

490504
err = nfp_modify_flow_metadata(app, nfp_flow);
491505
if (err)
@@ -534,6 +548,9 @@ nfp_flower_get_stats(struct nfp_app *app, struct net_device *netdev,
534548
if (!nfp_flow)
535549
return -EINVAL;
536550

551+
if (nfp_flow->ingress_offload && egress)
552+
return 0;
553+
537554
spin_lock_bh(&nfp_flow->lock);
538555
tcf_exts_stats_update(flow->exts, nfp_flow->stats.bytes,
539556
nfp_flow->stats.pkts, nfp_flow->stats.used);

0 commit comments

Comments
 (0)