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 9/9] octeontx2-af: npc: cn20k: Allocate npc_priv and dstats dynamically.
Date: Fri, 15 May 2026 13:00:30 +0530 [thread overview]
Message-ID: <agbLlpli-whxptBX@rkannoth-OptiPlex-7090> (raw)
In-Reply-To: <20260514062537.3813802-10-rkannoth@marvell.com>
On 2026-05-14 at 11:55:37, Ratheesh Kannoth (rkannoth@marvell.com) wrote:
> Replace the file-scope static npc_priv with a kcalloc'd struct filled
> from hardware bank/subbank geometry at init (num_banks is no longer a
> const compile-time constant; drop init_done and use a non-NULL
> npc_priv pointer for liveness). Thread npc_priv_get() / pointer access
> through the CN20K NPC code paths, extend teardown to kfree the root
> struct on failure and in npc_cn20k_deinit, and adjust MCAM section
> setup to use the discovered subbank count.
>
>> #include "cn20k/reg.h"
>> #include "rvu_npc_fs.h"
>>
>> -static struct npc_priv_t npc_priv = {
>> - .num_banks = MAX_NUM_BANKS,
>> -};
>> +static struct npc_priv_t *npc_priv;
>Since npc_priv and dstats are still declared as global file-scope variables,
>won't probing multiple RVU devices cause these pointers to be overwritten?
>If a second device is probed, the allocations for the first device would be
>leaked and both devices would end up sharing the second device's state.
>On device unbind, devres will automatically free dstats, leaving a dangling
>global pointer. Additionally, npc_cn20k_deinit() explicitly frees npc_priv
>and sets it to NULL.
>If a userspace process reads a debugfs file after device unbind, could it
>cause a NULL pointer dereference on npc_priv or a use-after-free when
>accessing the dstats array?
While a global file-scope pointer introduces a shared-state risk in
drivers that support multiple instances, the structural design and
physical topology of the OcteonTX2 platform eliminate this hazard.
First, the system architecture dictates that exactly one physical RVU
Admin Function (AF) hardware block exists per SoC layout. Because the
hardware platform cannot expose multiple active AF instances, there is
no parallel or sequential device probing sequence to trigger a race
condition, overwrite existing allocations, or cause memory leaks between distinct devices.
Second, the debugfs nodes and the driver's structural life cycle are
fundamentally serialized. When a device unbind occurs, the kernel’s
driver model coordinates the teardown by systematically removing the
associated debugfs entries before finalizing the subsystem de-initialization.
Because the debugfs file operations are unlinked and blocked from further
invocation prior to executing the kfree(npc_priv) routine in
npc_cn20k_deinit(), any userspace read attempt is rejected at the VFS
layer, removing the possibility of a post-unbind NULL pointer dereference
or use-after-free regression.
>> */
>> struct npc_priv_t {
>> int bank_depth;
>> - const int num_banks;
>> + int num_banks;
>> int num_subbanks;
>> int subbank_depth;
>> DECLARE_BITMAP(en_map, MAX_NUM_BANKS *
>Now that num_banks and bank_depth are populated from hardware values
>instead of compile-time constants, do we need to validate them against the
>MAX_NUM_BANKS and MAX_SUBBANK_DEPTH constants?
>Looking at npc_mcam_dstats_show(), it loops based on these hardware values
>and indexes into the dstats array:
>npc_mcam_dstats_show() {
> ...
> for (int bank = npc_priv->num_banks - 1; bank >= 0; bank--) {
> for (int idx = npc_priv->bank_depth - 1; idx >= 0; idx--) {
> ...
> if (stats < dstats[0][bank][idx])
> dstats[0][bank][idx] = 0;
> ...
>}
>Since dstats is still statically sized using MAX_NUM_BANKS and related
>macros, will this result in out-of-bounds accesses if the hardware returns
>larger values?
>Similarly, the en_map bitmap is sized using these same static constants.
>Could operations like set_bit(index, npc_priv->en_map) in
>npc_cn20k_enable_mcam_entry() corrupt the npc_priv_t structure if the
>hardware dimensions exceed the static bitmap size?
The static definitions for the tracking arrays and bitmaps are based
strictly on the silicon's hard limits, preventing any possibility of
out-of-bounds corruption.
The compile-time constants (MAX_NUM_BANKS, MAX_NUM_SUB_BANKS, and
MAX_SUBBANK_DEPTH) do not represent arbitrary bounds; they define the
absolute, physical maximum limits across all existing and planned SoC
variants for the CN20K hardware profile. The hardware registers cannot
expose configuration dimensions that exceed these maximum architectural limits
because the underlying silicon layout lacks the physical lines or registers
to support larger structures.
Because the statically allocated arrays and bitmaps (like dstats and
en_map) are configured to support this full architectural envelope, the
runtime values assigned to num_banks and bank_depth are structurally
guaranteed to be less than or equal to these maximum limits. As a result,
the loops inside npc_mcam_dstats_show() and bit operations inside
npc_cn20k_enable_mcam_entry() will never cross the boundaries of the
allocated memory footprint, making runtime validation checks redundant.
prev parent reply other threads:[~2026-05-15 7:30 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
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 [this message]
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=agbLlpli-whxptBX@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