diff mbox series

[net-next,2/6] net: dsa: hellcreek: Report META data usage

Message ID 20210311175344.3084-3-kurt@kmk-computers.de (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series net: dsa: hellcreek: Add support for dumping tables | expand

Checks

Context Check Description
netdev/cover_letter success Link
netdev/fixes_present success Link
netdev/patch_count success Link
netdev/tree_selection success Clearly marked for net-next
netdev/subject_prefix success Link
netdev/cc_maintainers warning 1 maintainers not CCed: kurt@linutronix.de
netdev/source_inline success Was 0 now: 0
netdev/verify_signedoff success Link
netdev/module_param success Was 0 now: 0
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/verify_fixes success Link
netdev/checkpatch warning WARNING: line length of 86 exceeds 80 columns WARNING: line length of 88 exceeds 80 columns
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/header_inline success Link

Commit Message

Kurt Kanzenbach March 11, 2021, 5:53 p.m. UTC
Report the META data descriptor usage via devlink. This is a useful debug
feature. The actual size depends on the used Hellcreek version:

|root@tsn:~# devlink resource show platform/ff240000.switch
|platform/ff240000.switch:
|  name VLAN size 4096 occ 3 unit entry dpipe_tables none
|  name FDB size 256 occ 6 unit entry dpipe_tables none
|  name RAM size 320 occ 14 unit entry dpipe_tables none
|  name META size 320 occ 5 unit entry dpipe_tables none

Signed-off-by: Kurt Kanzenbach <kurt@kmk-computers.de>
---
 drivers/net/dsa/hirschmann/hellcreek.c | 36 ++++++++++++++++++++++++--
 drivers/net/dsa/hirschmann/hellcreek.h |  2 ++
 2 files changed, 36 insertions(+), 2 deletions(-)

Comments

Andrew Lunn March 11, 2021, 10:52 p.m. UTC | #1
On Thu, Mar 11, 2021 at 06:53:40PM +0100, Kurt Kanzenbach wrote:
> Report the META data descriptor usage via devlink.

Jakubs question is also relevant here. Please could you give a bit
more background about what the meta data is?

Thanks
	Andrew
Vladimir Oltean March 11, 2021, 11:17 p.m. UTC | #2
On Thu, Mar 11, 2021 at 11:52:41PM +0100, Andrew Lunn wrote:
> On Thu, Mar 11, 2021 at 06:53:40PM +0100, Kurt Kanzenbach wrote:
> > Report the META data descriptor usage via devlink.
> 
> Jakubs question is also relevant here. Please could you give a bit
> more background about what the meta data is?

Not having seen any documentation for this device, my guess is that
metadata descriptors are frame references, and the RAM page count is for
packet memory buffers. Nonetheless, I would still like to hear it from
Kurt. There is still a lot unknown even if I am correct. For example, if
the frame references or buffers can be partitioned, or if watermarks for
things like congestion/flow control can be set, then maybe devlink-sb is
a better choice (as that has an occupancy facility as well)?
Fully understand that it is not as trivial as exposing a devlink
resource, but on Ocelot/Felix I quite appreciate having the feature
(drivers/net/ethernet/mscc/ocelot_devlink.c). And knowing that this is a
TSN switch, I expect that sooner or later, the need to have control over
resource partitioning per traffic class will arise anyway.
Kurt Kanzenbach March 12, 2021, 4:11 p.m. UTC | #3
On Fri Mar 12 2021, Vladimir Oltean wrote:
> On Thu, Mar 11, 2021 at 11:52:41PM +0100, Andrew Lunn wrote:
>> On Thu, Mar 11, 2021 at 06:53:40PM +0100, Kurt Kanzenbach wrote:
>> > Report the META data descriptor usage via devlink.
>> 
>> Jakubs question is also relevant here. Please could you give a bit
>> more background about what the meta data is?
>
> Not having seen any documentation for this device, my guess is that
> metadata descriptors are frame references, and the RAM page count is
> for packet memory buffers. Nonetheless, I would still like to hear it
> from Kurt.

Yes, exactly.

> There is still a lot unknown even if I am correct. For example, if
> the frame references or buffers can be partitioned, or if watermarks for
> things like congestion/flow control can be set, then maybe devlink-sb is
> a better choice (as that has an occupancy facility as well)?
> Fully understand that it is not as trivial as exposing a devlink
> resource, but on Ocelot/Felix I quite appreciate having the feature
> (drivers/net/ethernet/mscc/ocelot_devlink.c). And knowing that this is a
> TSN switch, I expect that sooner or later, the need to have control over
> resource partitioning per traffic class will arise anyway.
>

True. The switch can actually distinguish between critical and
background traffic. Multiple limits can be configured: Maximum memory,
reserved memory for critical traffic, background traffic rates and queue
depths. I'll take a look at devlink-sb for that.

Thanks,
Kurt
diff mbox series

Patch

diff --git a/drivers/net/dsa/hirschmann/hellcreek.c b/drivers/net/dsa/hirschmann/hellcreek.c
index c7a439336336..d3760e2c9d8a 100644
--- a/drivers/net/dsa/hirschmann/hellcreek.c
+++ b/drivers/net/dsa/hirschmann/hellcreek.c
@@ -221,13 +221,15 @@  static void hellcreek_feature_detect(struct hellcreek *hellcreek)
 
 	features = hellcreek_read(hellcreek, HR_FEABITS0);
 
-	/* Detect the FDB table size and the maximum RAM page count. The size
-	 * and current utilization can be queried via devlink.
+	/* Detect the FDB table size and the maximum RAM page and meta data
+	 * count. The size and current utilization can be queried via devlink.
 	 */
 	hellcreek->fdb_entries = ((features & HR_FEABITS0_FDBBINS_MASK) >>
 				  HR_FEABITS0_FDBBINS_SHIFT) * 32;
 	hellcreek->page_count  = ((features & HR_FEABITS0_PCNT_MASK) >>
 				  HR_FEABITS0_PCNT_SHIFT) * 32;
+	hellcreek->meta_count  = ((features & HR_FEABITS0_MCNT_MASK) >>
+				  HR_FEABITS0_MCNT_SHIFT) * 32;
 }
 
 static enum dsa_tag_protocol hellcreek_get_tag_protocol(struct dsa_switch *ds,
@@ -1048,9 +1050,22 @@  static u64 hellcreek_devlink_ram_usage_get(void *priv)
 	return usage;
 }
 
+static u64 hellcreek_devlink_meta_usage_get(void *priv)
+{
+	struct hellcreek *hellcreek = priv;
+	u64 usage = 0;
+
+	/* Indicates how many free meta data descriptors are available. */
+	usage = hellcreek_read(hellcreek, HR_MFREE);
+	usage = hellcreek->meta_count - usage;
+
+	return usage;
+}
+
 static int hellcreek_setup_devlink_resources(struct dsa_switch *ds)
 {
 	struct devlink_resource_size_params size_vlan_params;
+	struct devlink_resource_size_params size_meta_params;
 	struct devlink_resource_size_params size_fdb_params;
 	struct devlink_resource_size_params size_ram_params;
 	struct hellcreek *hellcreek = ds->priv;
@@ -1070,6 +1085,11 @@  static int hellcreek_setup_devlink_resources(struct dsa_switch *ds)
 					  hellcreek->page_count,
 					  1, DEVLINK_RESOURCE_UNIT_ENTRY);
 
+	devlink_resource_size_params_init(&size_meta_params,
+					  hellcreek->meta_count,
+					  hellcreek->meta_count,
+					  1, DEVLINK_RESOURCE_UNIT_ENTRY);
+
 	err = dsa_devlink_resource_register(ds, "VLAN", VLAN_N_VID,
 					    HELLCREEK_DEVLINK_PARAM_ID_VLAN_TABLE,
 					    DEVLINK_RESOURCE_ID_PARENT_TOP,
@@ -1091,6 +1111,13 @@  static int hellcreek_setup_devlink_resources(struct dsa_switch *ds)
 	if (err)
 		goto out;
 
+	err = dsa_devlink_resource_register(ds, "META", hellcreek->meta_count,
+					    HELLCREEK_DEVLINK_PARAM_ID_METADATA_USAGE,
+					    DEVLINK_RESOURCE_ID_PARENT_TOP,
+					    &size_meta_params);
+	if (err)
+		goto out;
+
 	dsa_devlink_resource_occ_get_register(ds,
 					      HELLCREEK_DEVLINK_PARAM_ID_VLAN_TABLE,
 					      hellcreek_devlink_vlan_table_get,
@@ -1106,6 +1133,11 @@  static int hellcreek_setup_devlink_resources(struct dsa_switch *ds)
 					      hellcreek_devlink_ram_usage_get,
 					      hellcreek);
 
+	dsa_devlink_resource_occ_get_register(ds,
+					      HELLCREEK_DEVLINK_PARAM_ID_METADATA_USAGE,
+					      hellcreek_devlink_meta_usage_get,
+					      hellcreek);
+
 	return 0;
 
 out:
diff --git a/drivers/net/dsa/hirschmann/hellcreek.h b/drivers/net/dsa/hirschmann/hellcreek.h
index 9c08aeabbc24..06737caac37e 100644
--- a/drivers/net/dsa/hirschmann/hellcreek.h
+++ b/drivers/net/dsa/hirschmann/hellcreek.h
@@ -287,6 +287,7 @@  struct hellcreek {
 	u16 status_out;		/* ptp.status_out shadow */
 	size_t fdb_entries;
 	size_t page_count;
+	size_t meta_count;
 };
 
 /* A Qbv schedule can only started up to 8 seconds in the future. If the delta
@@ -304,6 +305,7 @@  enum hellcreek_devlink_resource_id {
 	HELLCREEK_DEVLINK_PARAM_ID_VLAN_TABLE,
 	HELLCREEK_DEVLINK_PARAM_ID_FDB_TABLE,
 	HELLCREEK_DEVLINK_PARAM_ID_RAM_USAGE,
+	HELLCREEK_DEVLINK_PARAM_ID_METADATA_USAGE,
 };
 
 #endif /* _HELLCREEK_H_ */