net/mlx5e: Support HTB offload
[sfrench/cifs-2.6.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_stats.c
index 2cf2042b37c76d766426451d5381a96cd06b5d2d..92c5b81427b971f81817f4149c662fb9e92e71e4 100644 (file)
@@ -420,6 +420,25 @@ static void mlx5e_stats_grp_sw_update_stats_ptp(struct mlx5e_priv *priv,
        }
 }
 
+static void mlx5e_stats_grp_sw_update_stats_qos(struct mlx5e_priv *priv,
+                                               struct mlx5e_sw_stats *s)
+{
+       struct mlx5e_sq_stats **stats;
+       u16 max_qos_sqs;
+       int i;
+
+       /* Pairs with smp_store_release in mlx5e_open_qos_sq. */
+       max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
+       stats = READ_ONCE(priv->htb.qos_sq_stats);
+
+       for (i = 0; i < max_qos_sqs; i++) {
+               mlx5e_stats_grp_sw_update_stats_sq(s, READ_ONCE(stats[i]));
+
+               /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
+               barrier();
+       }
+}
+
 static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(sw)
 {
        struct mlx5e_sw_stats *s = &priv->stats.sw;
@@ -449,6 +468,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(sw)
                }
        }
        mlx5e_stats_grp_sw_update_stats_ptp(priv, s);
+       mlx5e_stats_grp_sw_update_stats_qos(priv, s);
 }
 
 static const struct counter_desc q_stats_desc[] = {
@@ -1740,6 +1760,41 @@ static const struct counter_desc ptp_cq_stats_desc[] = {
        { MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, abort_abs_diff_ns) },
 };
 
+static const struct counter_desc qos_sq_stats_desc[] = {
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, packets) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, bytes) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_packets) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_bytes) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, nop) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_blks) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_pkts) },
+#ifdef CONFIG_MLX5_EN_TLS
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_packets) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_bytes) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_ctx) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_ooo) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_packets) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_bytes) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_resync_bytes) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_skip_no_sync_data) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_no_sync_data) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_bypass_req) },
+#endif
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_none) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, stopped) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, dropped) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, recover) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqes) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, wake) },
+       { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
+};
+
 #define NUM_RQ_STATS                   ARRAY_SIZE(rq_stats_desc)
 #define NUM_SQ_STATS                   ARRAY_SIZE(sq_stats_desc)
 #define NUM_XDPSQ_STATS                        ARRAY_SIZE(xdpsq_stats_desc)
@@ -1750,6 +1805,49 @@ static const struct counter_desc ptp_cq_stats_desc[] = {
 #define NUM_PTP_SQ_STATS               ARRAY_SIZE(ptp_sq_stats_desc)
 #define NUM_PTP_CH_STATS               ARRAY_SIZE(ptp_ch_stats_desc)
 #define NUM_PTP_CQ_STATS               ARRAY_SIZE(ptp_cq_stats_desc)
+#define NUM_QOS_SQ_STATS               ARRAY_SIZE(qos_sq_stats_desc)
+
+static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qos)
+{
+       /* Pairs with smp_store_release in mlx5e_open_qos_sq. */
+       return NUM_QOS_SQ_STATS * smp_load_acquire(&priv->htb.max_qos_sqs);
+}
+
+static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qos)
+{
+       /* Pairs with smp_store_release in mlx5e_open_qos_sq. */
+       u16 max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
+       int i, qid;
+
+       for (qid = 0; qid < max_qos_sqs; qid++)
+               for (i = 0; i < NUM_QOS_SQ_STATS; i++)
+                       sprintf(data + (idx++) * ETH_GSTRING_LEN,
+                               qos_sq_stats_desc[i].format, qid);
+
+       return idx;
+}
+
+static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qos)
+{
+       struct mlx5e_sq_stats **stats;
+       u16 max_qos_sqs;
+       int i, qid;
+
+       /* Pairs with smp_store_release in mlx5e_open_qos_sq. */
+       max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
+       stats = READ_ONCE(priv->htb.qos_sq_stats);
+
+       for (qid = 0; qid < max_qos_sqs; qid++) {
+               struct mlx5e_sq_stats *s = READ_ONCE(stats[qid]);
+
+               for (i = 0; i < NUM_QOS_SQ_STATS; i++)
+                       data[idx++] = MLX5E_READ_CTR64_CPU(s, qos_sq_stats_desc, i);
+       }
+
+       return idx;
+}
+
+static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qos) { return; }
 
 static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(ptp)
 {
@@ -1932,6 +2030,7 @@ MLX5E_DEFINE_STATS_GRP(per_port_buff_congest, 0);
 MLX5E_DEFINE_STATS_GRP(eth_ext, 0);
 static MLX5E_DEFINE_STATS_GRP(tls, 0);
 static MLX5E_DEFINE_STATS_GRP(ptp, 0);
+static MLX5E_DEFINE_STATS_GRP(qos, 0);
 
 /* The stats groups order is opposite to the update_stats() order calls */
 mlx5e_stats_grp_t mlx5e_nic_stats_grps[] = {
@@ -1955,6 +2054,7 @@ mlx5e_stats_grp_t mlx5e_nic_stats_grps[] = {
        &MLX5E_STATS_GRP(channels),
        &MLX5E_STATS_GRP(per_port_buff_congest),
        &MLX5E_STATS_GRP(ptp),
+       &MLX5E_STATS_GRP(qos),
 };
 
 unsigned int mlx5e_nic_stats_grps_num(struct mlx5e_priv *priv)