Netdev List
 help / color / mirror / Atom feed
From: Ratheesh Kannoth <rkannoth@marvell.com>
To: <linux-kernel@vger.kernel.org>, <linux-rdma@vger.kernel.org>,
	<netdev@vger.kernel.org>, <oss-drivers@corigine.com>
Cc: <akiyano@amazon.com>, <andrew+netdev@lunn.ch>,
	<anthony.l.nguyen@intel.com>, <arkadiusz.kubalewski@intel.com>,
	<brett.creeley@amd.com>, <darinzon@amazon.com>,
	<davem@davemloft.net>, <donald.hunter@gmail.com>,
	<edumazet@google.com>, <horms@kernel.org>, <idosch@nvidia.com>,
	<ivecera@redhat.com>, <jiri@resnulli.us>, <kuba@kernel.org>,
	<leon@kernel.org>, <mbloch@nvidia.com>,
	<michael.chan@broadcom.com>, <pabeni@redhat.com>,
	<pavan.chebbi@broadcom.com>, <petrm@nvidia.com>,
	<Prathosh.Satish@microchip.com>, <przemyslaw.kitszel@intel.com>,
	<saeedm@nvidia.com>, <sgoutham@marvell.com>, <tariqt@nvidia.com>,
	<vadim.fedorenko@linux.dev>
Subject: Re: [PATCH v14 net-next 1/9] octeontx2-af: npc: cn20k: debugfs enhancements
Date: Fri, 15 May 2026 12:55:48 +0530	[thread overview]
Message-ID: <agbKfBoaPy3f5f7N@rkannoth-OptiPlex-7090> (raw)
In-Reply-To: <20260514062537.3813802-2-rkannoth@marvell.com>

On 2026-05-14 at 11:55:29, Ratheesh Kannoth (rkannoth@marvell.com) wrote:
> Improve MCAM visibility and field debugging for CN20K NPC.
>
> - Extend "mcam_layout" to show enabled (+) or disabled state per entry
>   so status can be verified without parsing the full "mcam_entry" dump.
> - Add "dstats" debugfs entry: reports recently hit MCAM indices with
>   packet counts; stats are cleared on read so each read shows deltas.
> - Add "mismatch" debugfs entry: lists MCAM entries that are enabled
>   but not explicitly allocated, helping diagnose allocation/field issues.
>

>> diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.h b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.h
>> index 3d5eb952cc073..9567a2d80b584 100644
>> --- a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.h
>> +++ b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.h
>[ ... ]
>> @@ -193,6 +194,9 @@ struct npc_priv_t {
>>  	const int num_banks;
>>  	int num_subbanks;
>>  	int subbank_depth;
>> +	DECLARE_BITMAP(en_map, MAX_NUM_BANKS *
>> +		       MAX_NUM_SUB_BANKS *
>> +		       MAX_SUBBANK_DEPTH);
>[ ... ]
>> diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
>> index 6b3f453fd5004..e9aad0ad3fa68 100644
>> --- a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
>> +++ b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
>[ ... ]
>> @@ -842,6 +842,12 @@ npc_cn20k_enable_mcam_entry(struct rvu *rvu, int blkaddr,
>>  			    cfg);
>>  	}
>>
>> +update_en_map:
>> +	if (enable)
>> +		set_bit(index, npc_priv.en_map);
>> +	else
>> +		clear_bit(index, npc_priv.en_map);
>> +
>>  	return 0;
>>  }
>Will index ever exceed the static size of en_map?
>If the hardware reports larger values, could the set_bit() call here perform
>an out-of-bounds write and corrupt memory?
>

The index is guaranteed to stay within the static bounds of en_map.

The bitmap dimensions are calculated using the constants:
MAX_NUM_BANKS * MAX_NUM_SUB_BANKS * MAX_SUBBANK_DEPTH. This product
represents the absolute maximum theoretical MCAM capacity for the
CN20K NPC architecture.

Furthermore, the index parameter is strictly validated upstream
within the RVU admin function layer (specifically via the resource
allocation checks in npc_get_mcam_idx) before reaching this function.
Because the hardware geometry is fixed and the index is validated
against the discovered capacity during initialization, an
out-of-bounds access is impossible.

>> +static u64 dstats[MAX_NUM_BANKS][MAX_SUBBANK_DEPTH * MAX_NUM_SUB_BANKS] = {};
>> +static int npc_mcam_dstats_show(struct seq_file *s, void *unused)
>> +{
>[ ... ]
>> +			delta = stats - dstats[bank][idx];
>> +
>> +			snprintf(buff, sizeof(buff), "%u\t%#04x\t%llu\n",
>> +				 mcam_idx, pf, delta);
>> +			seq_puts(s, buff);
>> +
>> +			dstats[bank][idx] = stats;
>> +		}
>> +	}
>> +
>> +	mutex_unlock(&stats_lock);
>> +	return 0;
>> +}
>Is it safe to modify state within a seq_file show callback?
>The kernel's seq_file framework expects the show function to be side-effect
>free. If the formatted output exceeds the initial buffer size, seq_read_iter()
>discards the buffer, allocates a larger one, and re-invokes the show function.
>If that happens, wouldn't the retried invocation calculate a delta of zero
>because dstats was already updated in the first attempt, causing the
>statistics to be lost?

The seq_file show callback state mutation is safe in this context
because the implementation enforces a single-allocation guarantee
upstream via single_open_size().

During the .open file operation, single_open_size() is invoked with a
pre-calculated total size sufficient to contain the entire output
payload for all banks. This forces the seq_file framework to allocate
the full required buffer upfront.

Because the sequence allocation size matches the total data footprint,
seq_read_iter() will never encounter an overflow condition, avoiding the
discard-and-retry path entirely. Consequently, the show() callback is
guaranteed to execute exactly once per sequence read, eliminating the
possibility of calculating a zero delta on a re-entrant call.

>Additionally, dstats is declared as a global static array. If there are
>multiple RVU device instances, won't they overwrite each other's state and
>corrupt the delta calculations?
>The subsequent commit "octeontx2-af: npc: cn20k: Allocate npc_priv and dstats
>dynamically." might address the global array issue, but the seq_file state
>mutation appears to remain.

the system topology guarantees there is only a single RVU Admin Function (AF) device instance
active during the system life cycle. Because there are no concurrent
or multiple RVU AF instances to cause cross-device data corruption, the
global static array does not introduce an overwrite or race condition
between separate devices.

Moving dstats to a dynamic per-device structure in the subsequent patch
remains a structural improvement, but the logic in this transient commit
is functionally sound and free of data corruption risks.

  reply	other threads:[~2026-05-15  7:26 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-14  6:25 [PATCH v14 net-next 0/9] octeontx2-af: npc: Enhancements Ratheesh Kannoth
2026-05-14  6:25 ` [PATCH v14 net-next 1/9] octeontx2-af: npc: cn20k: debugfs enhancements Ratheesh Kannoth
2026-05-15  7:25   ` Ratheesh Kannoth [this message]
2026-05-14  6:25 ` [PATCH v14 net-next 2/9] net/mlx5e: Reduce stack use reading PCIe congestion thresholds Ratheesh Kannoth
2026-05-14  6:25 ` [PATCH v14 net-next 3/9] devlink: pass param values by pointer Ratheesh Kannoth
2026-05-14  6:25 ` [PATCH v14 net-next 4/9] devlink: Implement devlink param multi attribute nested data values Ratheesh Kannoth
2026-05-14  6:25 ` [PATCH v14 net-next 5/9] octeontx2-af: npc: cn20k: add subbank search order control Ratheesh Kannoth
2026-05-15  7:26   ` Ratheesh Kannoth
2026-05-14  6:25 ` [PATCH v14 net-next 6/9] octeontx2: cn20k: Coordinate default rules with NIX LF lifecycle Ratheesh Kannoth
2026-05-15  7:28   ` Ratheesh Kannoth
2026-05-14  6:25 ` [PATCH v14 net-next 7/9] octeontx2-af: npc: Support for custom KPU profile from filesystem Ratheesh Kannoth
2026-05-15  7:29   ` Ratheesh Kannoth
2026-05-14  6:25 ` [PATCH v14 net-next 8/9] octeontx2: cn20k: Respect NPC MCAM X2/X4 profile in flows and DFT alloc Ratheesh Kannoth
2026-05-14  6:25 ` [PATCH v14 net-next 9/9] octeontx2-af: npc: cn20k: Allocate npc_priv and dstats dynamically Ratheesh Kannoth
2026-05-15  7:30   ` Ratheesh Kannoth

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=agbKfBoaPy3f5f7N@rkannoth-OptiPlex-7090 \
    --to=rkannoth@marvell.com \
    --cc=Prathosh.Satish@microchip.com \
    --cc=akiyano@amazon.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=anthony.l.nguyen@intel.com \
    --cc=arkadiusz.kubalewski@intel.com \
    --cc=brett.creeley@amd.com \
    --cc=darinzon@amazon.com \
    --cc=davem@davemloft.net \
    --cc=donald.hunter@gmail.com \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=idosch@nvidia.com \
    --cc=ivecera@redhat.com \
    --cc=jiri@resnulli.us \
    --cc=kuba@kernel.org \
    --cc=leon@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=mbloch@nvidia.com \
    --cc=michael.chan@broadcom.com \
    --cc=netdev@vger.kernel.org \
    --cc=oss-drivers@corigine.com \
    --cc=pabeni@redhat.com \
    --cc=pavan.chebbi@broadcom.com \
    --cc=petrm@nvidia.com \
    --cc=przemyslaw.kitszel@intel.com \
    --cc=saeedm@nvidia.com \
    --cc=sgoutham@marvell.com \
    --cc=tariqt@nvidia.com \
    --cc=vadim.fedorenko@linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox