Skip to content

Commit f8e9d41

Browse files
roidayanSaeed Mahameed
authored andcommitted
net/mlx5e: TC, Separate get/update/replace meter functions
mlx5e_tc_meter_get() to get an existing meter. mlx5e_tc_meter_update() to update an existing meter without refcount. mlx5e_tc_meter_replace() to get/create a meter and update if needed. Signed-off-by: Roi Dayan <[email protected]> Reviewed-by: Jianbo Liu <[email protected]> Reviewed-by: Oz Shlomo <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent b50ce43 commit f8e9d41

File tree

3 files changed

+112
-27
lines changed

3 files changed

+112
-27
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c

Lines changed: 106 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -344,69 +344,149 @@ __mlx5e_flow_meter_free(struct mlx5e_flow_meter_handle *meter)
344344
kfree(meter);
345345
}
346346

347+
static struct mlx5e_flow_meter_handle *
348+
__mlx5e_tc_meter_get(struct mlx5e_flow_meters *flow_meters, u32 index)
349+
{
350+
struct mlx5e_flow_meter_handle *meter;
351+
352+
hash_for_each_possible(flow_meters->hashtbl, meter, hlist, index)
353+
if (meter->params.index == index)
354+
goto add_ref;
355+
356+
return ERR_PTR(-ENOENT);
357+
358+
add_ref:
359+
meter->refcnt++;
360+
361+
return meter;
362+
}
363+
347364
struct mlx5e_flow_meter_handle *
348365
mlx5e_tc_meter_get(struct mlx5_core_dev *mdev, struct mlx5e_flow_meter_params *params)
349366
{
350367
struct mlx5e_flow_meters *flow_meters;
351368
struct mlx5e_flow_meter_handle *meter;
352-
int err;
353369

354370
flow_meters = mlx5e_get_flow_meters(mdev);
355371
if (!flow_meters)
356372
return ERR_PTR(-EOPNOTSUPP);
357373

358374
mutex_lock(&flow_meters->sync_lock);
359-
hash_for_each_possible(flow_meters->hashtbl, meter, hlist, params->index)
360-
if (meter->params.index == params->index)
361-
goto add_ref;
375+
meter = __mlx5e_tc_meter_get(flow_meters, params->index);
376+
mutex_unlock(&flow_meters->sync_lock);
362377

363-
meter = __mlx5e_flow_meter_alloc(flow_meters);
364-
if (IS_ERR(meter)) {
365-
err = PTR_ERR(meter);
366-
goto err_alloc;
378+
return meter;
379+
}
380+
381+
static void
382+
__mlx5e_tc_meter_put(struct mlx5e_flow_meter_handle *meter)
383+
{
384+
if (--meter->refcnt == 0) {
385+
hash_del(&meter->hlist);
386+
__mlx5e_flow_meter_free(meter);
367387
}
388+
}
389+
390+
void
391+
mlx5e_tc_meter_put(struct mlx5e_flow_meter_handle *meter)
392+
{
393+
struct mlx5e_flow_meters *flow_meters = meter->flow_meters;
394+
395+
mutex_lock(&flow_meters->sync_lock);
396+
__mlx5e_tc_meter_put(meter);
397+
mutex_unlock(&flow_meters->sync_lock);
398+
}
399+
400+
static struct mlx5e_flow_meter_handle *
401+
mlx5e_tc_meter_alloc(struct mlx5e_flow_meters *flow_meters,
402+
struct mlx5e_flow_meter_params *params)
403+
{
404+
struct mlx5e_flow_meter_handle *meter;
405+
406+
meter = __mlx5e_flow_meter_alloc(flow_meters);
407+
if (IS_ERR(meter))
408+
return meter;
368409

369410
hash_add(flow_meters->hashtbl, &meter->hlist, params->index);
370411
meter->params.index = params->index;
371-
372-
add_ref:
373412
meter->refcnt++;
374413

414+
return meter;
415+
}
416+
417+
static int
418+
__mlx5e_tc_meter_update(struct mlx5e_flow_meter_handle *meter,
419+
struct mlx5e_flow_meter_params *params)
420+
{
421+
struct mlx5_core_dev *mdev = meter->flow_meters->mdev;
422+
int err = 0;
423+
375424
if (meter->params.mode != params->mode || meter->params.rate != params->rate ||
376425
meter->params.burst != params->burst) {
377426
err = mlx5e_tc_meter_modify(mdev, meter, params);
378427
if (err)
379-
goto err_update;
428+
goto out;
380429

381430
meter->params.mode = params->mode;
382431
meter->params.rate = params->rate;
383432
meter->params.burst = params->burst;
384433
}
385434

386-
mutex_unlock(&flow_meters->sync_lock);
387-
return meter;
435+
out:
436+
return err;
437+
}
388438

389-
err_update:
390-
if (--meter->refcnt == 0) {
391-
hash_del(&meter->hlist);
392-
__mlx5e_flow_meter_free(meter);
393-
}
394-
err_alloc:
439+
int
440+
mlx5e_tc_meter_update(struct mlx5e_flow_meter_handle *meter,
441+
struct mlx5e_flow_meter_params *params)
442+
{
443+
struct mlx5_core_dev *mdev = meter->flow_meters->mdev;
444+
struct mlx5e_flow_meters *flow_meters;
445+
int err;
446+
447+
flow_meters = mlx5e_get_flow_meters(mdev);
448+
if (!flow_meters)
449+
return -EOPNOTSUPP;
450+
451+
mutex_lock(&flow_meters->sync_lock);
452+
err = __mlx5e_tc_meter_update(meter, params);
395453
mutex_unlock(&flow_meters->sync_lock);
396-
return ERR_PTR(err);
454+
return err;
397455
}
398456

399-
void
400-
mlx5e_tc_meter_put(struct mlx5e_flow_meter_handle *meter)
457+
struct mlx5e_flow_meter_handle *
458+
mlx5e_tc_meter_replace(struct mlx5_core_dev *mdev, struct mlx5e_flow_meter_params *params)
401459
{
402-
struct mlx5e_flow_meters *flow_meters = meter->flow_meters;
460+
struct mlx5e_flow_meters *flow_meters;
461+
struct mlx5e_flow_meter_handle *meter;
462+
int err;
463+
464+
flow_meters = mlx5e_get_flow_meters(mdev);
465+
if (!flow_meters)
466+
return ERR_PTR(-EOPNOTSUPP);
403467

404468
mutex_lock(&flow_meters->sync_lock);
405-
if (--meter->refcnt == 0) {
406-
hash_del(&meter->hlist);
407-
__mlx5e_flow_meter_free(meter);
469+
meter = __mlx5e_tc_meter_get(flow_meters, params->index);
470+
if (IS_ERR(meter)) {
471+
meter = mlx5e_tc_meter_alloc(flow_meters, params);
472+
if (IS_ERR(meter)) {
473+
err = PTR_ERR(meter);
474+
goto err_get;
475+
}
408476
}
477+
478+
err = __mlx5e_tc_meter_update(meter, params);
479+
if (err)
480+
goto err_update;
481+
409482
mutex_unlock(&flow_meters->sync_lock);
483+
return meter;
484+
485+
err_update:
486+
__mlx5e_tc_meter_put(meter);
487+
err_get:
488+
mutex_unlock(&flow_meters->sync_lock);
489+
return ERR_PTR(err);
410490
}
411491

412492
enum mlx5_flow_namespace_type

drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ struct mlx5e_flow_meter_handle *
5151
mlx5e_tc_meter_get(struct mlx5_core_dev *mdev, struct mlx5e_flow_meter_params *params);
5252
void
5353
mlx5e_tc_meter_put(struct mlx5e_flow_meter_handle *meter);
54+
int
55+
mlx5e_tc_meter_update(struct mlx5e_flow_meter_handle *meter,
56+
struct mlx5e_flow_meter_params *params);
57+
struct mlx5e_flow_meter_handle *
58+
mlx5e_tc_meter_replace(struct mlx5_core_dev *mdev, struct mlx5e_flow_meter_params *params);
5459

5560
enum mlx5_flow_namespace_type
5661
mlx5e_tc_meter_get_namespace(struct mlx5e_flow_meters *flow_meters);

drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ mlx5e_tc_add_flow_meter(struct mlx5e_priv *priv,
361361
enum mlx5_flow_namespace_type ns_type;
362362
struct mlx5e_flow_meter_handle *meter;
363363

364-
meter = mlx5e_tc_meter_get(priv->mdev, &attr->meter_attr.params);
364+
meter = mlx5e_tc_meter_replace(priv->mdev, &attr->meter_attr.params);
365365
if (IS_ERR(meter)) {
366366
mlx5_core_err(priv->mdev, "Failed to get flow meter\n");
367367
return PTR_ERR(meter);

0 commit comments

Comments
 (0)