Commit dd13f4df authored by David S. Miller's avatar David S. Miller

Merge branch 'mlxsw-spectrum_cnt-Expose-counter-resources'

Ido Schimmel says:

====================
mlxsw: spectrum_cnt: Expose counter resources

Jiri says:

Capacity and utilization of existing flow and RIF counters are currently
unavailable to be seen by the user. Use the existing devlink resources
API to expose the information:

$ sudo devlink resource show pci/0000:00:10.0 -v
pci/0000:00:10.0:
  name kvd resource_path /kvd size 524288 unit entry dpipe_tables none
  name span_agents resource_path /span_agents size 8 occ 0 unit entry dpipe_tables none
  name counters resource_path /counters size 79872 occ 44 unit entry dpipe_tables none
    resources:
      name flow resource_path /counters/flow size 61440 occ 4 unit entry dpipe_tables none
      name rif resource_path /counters/rif size 18432 occ 40 unit entry dpipe_tables none
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 8d174351 ee4848ac
...@@ -18,6 +18,7 @@ enum mlxsw_res_id { ...@@ -18,6 +18,7 @@ enum mlxsw_res_id {
MLXSW_RES_ID_CQE_V1, MLXSW_RES_ID_CQE_V1,
MLXSW_RES_ID_CQE_V2, MLXSW_RES_ID_CQE_V2,
MLXSW_RES_ID_COUNTER_POOL_SIZE, MLXSW_RES_ID_COUNTER_POOL_SIZE,
MLXSW_RES_ID_COUNTER_BANK_SIZE,
MLXSW_RES_ID_MAX_SPAN, MLXSW_RES_ID_MAX_SPAN,
MLXSW_RES_ID_COUNTER_SIZE_PACKETS_BYTES, MLXSW_RES_ID_COUNTER_SIZE_PACKETS_BYTES,
MLXSW_RES_ID_COUNTER_SIZE_ROUTER_BASIC, MLXSW_RES_ID_COUNTER_SIZE_ROUTER_BASIC,
...@@ -75,6 +76,7 @@ static u16 mlxsw_res_ids[] = { ...@@ -75,6 +76,7 @@ static u16 mlxsw_res_ids[] = {
[MLXSW_RES_ID_CQE_V1] = 0x2211, [MLXSW_RES_ID_CQE_V1] = 0x2211,
[MLXSW_RES_ID_CQE_V2] = 0x2212, [MLXSW_RES_ID_CQE_V2] = 0x2212,
[MLXSW_RES_ID_COUNTER_POOL_SIZE] = 0x2410, [MLXSW_RES_ID_COUNTER_POOL_SIZE] = 0x2410,
[MLXSW_RES_ID_COUNTER_BANK_SIZE] = 0x2411,
[MLXSW_RES_ID_MAX_SPAN] = 0x2420, [MLXSW_RES_ID_MAX_SPAN] = 0x2420,
[MLXSW_RES_ID_COUNTER_SIZE_PACKETS_BYTES] = 0x2443, [MLXSW_RES_ID_COUNTER_SIZE_PACKETS_BYTES] = 0x2443,
[MLXSW_RES_ID_COUNTER_SIZE_ROUTER_BASIC] = 0x2449, [MLXSW_RES_ID_COUNTER_SIZE_ROUTER_BASIC] = 0x2449,
......
...@@ -5421,8 +5421,13 @@ static int mlxsw_sp1_resources_register(struct mlxsw_core *mlxsw_core) ...@@ -5421,8 +5421,13 @@ static int mlxsw_sp1_resources_register(struct mlxsw_core *mlxsw_core)
if (err) if (err)
goto err_resources_span_register; goto err_resources_span_register;
err = mlxsw_sp_counter_resources_register(mlxsw_core);
if (err)
goto err_resources_counter_register;
return 0; return 0;
err_resources_counter_register:
err_resources_span_register: err_resources_span_register:
devlink_resources_unregister(priv_to_devlink(mlxsw_core), NULL); devlink_resources_unregister(priv_to_devlink(mlxsw_core), NULL);
return err; return err;
...@@ -5440,8 +5445,13 @@ static int mlxsw_sp2_resources_register(struct mlxsw_core *mlxsw_core) ...@@ -5440,8 +5445,13 @@ static int mlxsw_sp2_resources_register(struct mlxsw_core *mlxsw_core)
if (err) if (err)
goto err_resources_span_register; goto err_resources_span_register;
err = mlxsw_sp_counter_resources_register(mlxsw_core);
if (err)
goto err_resources_counter_register;
return 0; return 0;
err_resources_counter_register:
err_resources_span_register: err_resources_span_register:
devlink_resources_unregister(priv_to_devlink(mlxsw_core), NULL); devlink_resources_unregister(priv_to_devlink(mlxsw_core), NULL);
return err; return err;
......
...@@ -46,6 +46,10 @@ ...@@ -46,6 +46,10 @@
#define MLXSW_SP_RESOURCE_NAME_SPAN "span_agents" #define MLXSW_SP_RESOURCE_NAME_SPAN "span_agents"
#define MLXSW_SP_RESOURCE_NAME_COUNTERS "counters"
#define MLXSW_SP_RESOURCE_NAME_COUNTERS_FLOW "flow"
#define MLXSW_SP_RESOURCE_NAME_COUNTERS_RIF "rif"
enum mlxsw_sp_resource_id { enum mlxsw_sp_resource_id {
MLXSW_SP_RESOURCE_KVD = 1, MLXSW_SP_RESOURCE_KVD = 1,
MLXSW_SP_RESOURCE_KVD_LINEAR, MLXSW_SP_RESOURCE_KVD_LINEAR,
...@@ -55,6 +59,9 @@ enum mlxsw_sp_resource_id { ...@@ -55,6 +59,9 @@ enum mlxsw_sp_resource_id {
MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS, MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS,
MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS, MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS,
MLXSW_SP_RESOURCE_SPAN, MLXSW_SP_RESOURCE_SPAN,
MLXSW_SP_RESOURCE_COUNTERS,
MLXSW_SP_RESOURCE_COUNTERS_FLOW,
MLXSW_SP_RESOURCE_COUNTERS_RIF,
}; };
struct mlxsw_sp_port; struct mlxsw_sp_port;
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#ifndef _MLXSW_SPECTRUM_CNT_H #ifndef _MLXSW_SPECTRUM_CNT_H
#define _MLXSW_SPECTRUM_CNT_H #define _MLXSW_SPECTRUM_CNT_H
#include "core.h"
#include "spectrum.h" #include "spectrum.h"
enum mlxsw_sp_counter_sub_pool_id { enum mlxsw_sp_counter_sub_pool_id {
...@@ -19,5 +20,6 @@ void mlxsw_sp_counter_free(struct mlxsw_sp *mlxsw_sp, ...@@ -19,5 +20,6 @@ void mlxsw_sp_counter_free(struct mlxsw_sp *mlxsw_sp,
unsigned int counter_index); unsigned int counter_index);
int mlxsw_sp_counter_pool_init(struct mlxsw_sp *mlxsw_sp); int mlxsw_sp_counter_pool_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_counter_pool_fini(struct mlxsw_sp *mlxsw_sp); void mlxsw_sp_counter_pool_fini(struct mlxsw_sp *mlxsw_sp);
int mlxsw_sp_counter_resources_register(struct mlxsw_core *mlxsw_core);
#endif #endif
...@@ -8,9 +8,9 @@ tc_flower_get_target() ...@@ -8,9 +8,9 @@ tc_flower_get_target()
# The driver associates a counter with each tc filter, which means the # The driver associates a counter with each tc filter, which means the
# number of supported filters is bounded by the number of available # number of supported filters is bounded by the number of available
# counters. # counters.
# Currently, the driver supports 12K (12,288) flow counters and six of # Currently, the driver supports 30K (30,720) flow counters and six of
# these are used for multicast routing. # these are used for multicast routing.
local target=12282 local target=30714
if ((! should_fail)); then if ((! should_fail)); then
echo $target echo $target
......
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
lib_dir=$(dirname $0)/../../../net/forwarding
ALL_TESTS="
default_hw_stats_test
immediate_hw_stats_test
delayed_hw_stats_test
disabled_hw_stats_test
"
NUM_NETIFS=2
source $lib_dir/tc_common.sh
source $lib_dir/lib.sh
source $lib_dir/devlink_lib.sh
h1_create()
{
simple_if_init $h1 192.0.2.1/24
}
h1_destroy()
{
simple_if_fini $h1 192.0.2.1/24
}
switch_create()
{
simple_if_init $swp1 192.0.2.2/24
tc qdisc add dev $swp1 clsact
}
switch_destroy()
{
tc qdisc del dev $swp1 clsact
simple_if_fini $swp1 192.0.2.2/24
}
hw_stats_test()
{
RET=0
local name=$1
local action_hw_stats=$2
local occ_delta=$3
local expected_packet_count=$4
local orig_occ=$(devlink_resource_get "counters" "flow" | jq '.["occ"]')
tc filter add dev $swp1 ingress protocol ip pref 1 handle 101 flower \
skip_sw dst_ip 192.0.2.2 action drop $action_hw_stats
check_err $? "Failed to add rule with $name hw_stats"
local new_occ=$(devlink_resource_get "counters" "flow" | jq '.["occ"]')
local expected_occ=$((orig_occ + occ_delta))
[ "$new_occ" == "$expected_occ" ]
check_err $? "Expected occupancy of $expected_occ, got $new_occ"
$MZ $h1 -c 1 -p 64 -a $h1mac -b $swp1mac -A 192.0.2.1 -B 192.0.2.2 \
-t ip -q
tc_check_packets "dev $swp1 ingress" 101 $expected_packet_count
check_err $? "Did not match incoming packet"
tc filter del dev $swp1 ingress protocol ip pref 1 handle 101 flower
log_test "$name hw_stats"
}
default_hw_stats_test()
{
hw_stats_test "default" "" 2 1
}
immediate_hw_stats_test()
{
hw_stats_test "immediate" "hw_stats immediate" 2 1
}
delayed_hw_stats_test()
{
RET=0
tc filter add dev $swp1 ingress protocol ip pref 1 handle 101 flower \
skip_sw dst_ip 192.0.2.2 action drop hw_stats delayed
check_fail $? "Unexpected success in adding rule with delayed hw_stats"
log_test "delayed hw_stats"
}
disabled_hw_stats_test()
{
hw_stats_test "disabled" "hw_stats disabled" 0 0
}
setup_prepare()
{
h1=${NETIFS[p1]}
swp1=${NETIFS[p2]}
h1mac=$(mac_get $h1)
swp1mac=$(mac_get $swp1)
vrf_prepare
h1_create
switch_create
}
cleanup()
{
pre_cleanup
switch_destroy
h1_destroy
vrf_cleanup
}
check_tc_action_hw_stats_support
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS
...@@ -60,6 +60,15 @@ check_tc_chain_support() ...@@ -60,6 +60,15 @@ check_tc_chain_support()
fi fi
} }
check_tc_action_hw_stats_support()
{
tc actions help 2>&1 | grep -q hw_stats
if [[ $? -ne 0 ]]; then
echo "SKIP: iproute2 too old; tc is missing action hw_stats support"
exit 1
fi
}
if [[ "$(id -u)" -ne 0 ]]; then if [[ "$(id -u)" -ne 0 ]]; then
echo "SKIP: need root privileges" echo "SKIP: need root privileges"
exit 0 exit 0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment