@@ -344,69 +344,149 @@ __mlx5e_flow_meter_free(struct mlx5e_flow_meter_handle *meter)
344
344
kfree (meter );
345
345
}
346
346
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
+
347
364
struct mlx5e_flow_meter_handle *
348
365
mlx5e_tc_meter_get (struct mlx5_core_dev * mdev , struct mlx5e_flow_meter_params * params )
349
366
{
350
367
struct mlx5e_flow_meters * flow_meters ;
351
368
struct mlx5e_flow_meter_handle * meter ;
352
- int err ;
353
369
354
370
flow_meters = mlx5e_get_flow_meters (mdev );
355
371
if (!flow_meters )
356
372
return ERR_PTR (- EOPNOTSUPP );
357
373
358
374
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 );
362
377
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 );
367
387
}
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 ;
368
409
369
410
hash_add (flow_meters -> hashtbl , & meter -> hlist , params -> index );
370
411
meter -> params .index = params -> index ;
371
-
372
- add_ref :
373
412
meter -> refcnt ++ ;
374
413
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
+
375
424
if (meter -> params .mode != params -> mode || meter -> params .rate != params -> rate ||
376
425
meter -> params .burst != params -> burst ) {
377
426
err = mlx5e_tc_meter_modify (mdev , meter , params );
378
427
if (err )
379
- goto err_update ;
428
+ goto out ;
380
429
381
430
meter -> params .mode = params -> mode ;
382
431
meter -> params .rate = params -> rate ;
383
432
meter -> params .burst = params -> burst ;
384
433
}
385
434
386
- mutex_unlock (& flow_meters -> sync_lock );
387
- return meter ;
435
+ out :
436
+ return err ;
437
+ }
388
438
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 );
395
453
mutex_unlock (& flow_meters -> sync_lock );
396
- return ERR_PTR ( err ) ;
454
+ return err ;
397
455
}
398
456
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 )
401
459
{
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 );
403
467
404
468
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
+ }
408
476
}
477
+
478
+ err = __mlx5e_tc_meter_update (meter , params );
479
+ if (err )
480
+ goto err_update ;
481
+
409
482
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 );
410
490
}
411
491
412
492
enum mlx5_flow_namespace_type
0 commit comments