net/mlx5_core: Flow counters infrastructure
If a counter has the aging flag set when created, it is added to a list of counters that will be queried periodically from a workqueue. query result and last use timestamp are cached. add/del counter must be very efficient since thousands of such operations might be issued in a second. There is only a single reference to counters without aging, therefore no need for locks. But, counters with aging enabled are stored in a list. In order to make code as lockless as possible, all the list manipulation and access to hardware is done from a single context - the periodic counters query thread. The hardware supports multiple counters per FTE, however currently we are using one counter for each FTE. Signed-off-by: Amir Vadai <amirva@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
bd5251dbf1
commit
43a335e055
@@ -41,6 +41,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/radix-tree.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#include <linux/mlx5/device.h>
|
||||
#include <linux/mlx5/doorbell.h>
|
||||
@@ -457,6 +458,17 @@ struct mlx5_irq_info {
|
||||
char name[MLX5_MAX_IRQ_NAME];
|
||||
};
|
||||
|
||||
struct mlx5_fc_stats {
|
||||
struct list_head list;
|
||||
struct list_head addlist;
|
||||
/* protect addlist add/splice operations */
|
||||
spinlock_t addlist_lock;
|
||||
|
||||
struct workqueue_struct *wq;
|
||||
struct delayed_work work;
|
||||
unsigned long next_query;
|
||||
};
|
||||
|
||||
struct mlx5_eswitch;
|
||||
|
||||
struct mlx5_priv {
|
||||
@@ -520,6 +532,8 @@ struct mlx5_priv {
|
||||
struct mlx5_flow_root_namespace *fdb_root_ns;
|
||||
struct mlx5_flow_root_namespace *esw_egress_root_ns;
|
||||
struct mlx5_flow_root_namespace *esw_ingress_root_ns;
|
||||
|
||||
struct mlx5_fc_stats fc_stats;
|
||||
};
|
||||
|
||||
enum mlx5_device_state {
|
||||
|
@@ -127,4 +127,9 @@ int mlx5_modify_rule_destination(struct mlx5_flow_rule *rule,
|
||||
struct mlx5_flow_destination *dest);
|
||||
|
||||
struct mlx5_fc *mlx5_flow_rule_counter(struct mlx5_flow_rule *rule);
|
||||
struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging);
|
||||
void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter);
|
||||
void mlx5_fc_query_cached(struct mlx5_fc *counter,
|
||||
u64 *bytes, u64 *packets, u64 *lastuse);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user