* [net v4 PATCH 1/1] net: mvpp2: clear BM pool before initialization
@ 2024-01-19 3:59 Jenishkumar Maheshbhai Patel
2024-01-19 14:04 ` Maxime Chevallier
2024-01-24 20:40 ` patchwork-bot+netdevbpf
0 siblings, 2 replies; 5+ messages in thread
From: Jenishkumar Maheshbhai Patel @ 2024-01-19 3:59 UTC (permalink / raw)
To: marcin.s.wojtas, linux, davem, edumazet, kuba, pabeni, netdev,
linux-kernel
Cc: Jenishkumar Maheshbhai Patel
Register value persist after booting the kernel using
kexec which results in kernel panic. Thus clear the
BM pool registers before initialisation to fix the issue.
Fixes: 3f518509dedc ("ethernet: Add new driver for Marvell Armada 375 network unit")
Signed-off-by: Jenishkumar Maheshbhai Patel <jpatel2@marvell.com>
---
v1-v2:
-Move comments outside the loop
-remove unrequired brances.
v2-v3:
-improve readability
-correct register read API
v3-v4:
-optimize the code
-improve readability
.../net/ethernet/marvell/mvpp2/mvpp2_main.c | 27 ++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
index 820b1fabe297..23adf53c2aa1 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
@@ -614,12 +614,38 @@ static void mvpp23_bm_set_8pool_mode(struct mvpp2 *priv)
mvpp2_write(priv, MVPP22_BM_POOL_BASE_ADDR_HIGH_REG, val);
}
+/* Cleanup pool before actual initialization in the OS */
+static void mvpp2_bm_pool_cleanup(struct mvpp2 *priv, int pool_id)
+{
+ unsigned int thread = mvpp2_cpu_to_thread(priv, get_cpu());
+ u32 val;
+ int i;
+
+ /* Drain the BM from all possible residues left by firmware */
+ for (i = 0; i < MVPP2_BM_POOL_SIZE_MAX; i++)
+ mvpp2_thread_read(priv, thread, MVPP2_BM_PHY_ALLOC_REG(pool_id));
+
+ put_cpu();
+
+ /* Stop the BM pool */
+ val = mvpp2_read(priv, MVPP2_BM_POOL_CTRL_REG(pool_id));
+ val |= MVPP2_BM_STOP_MASK;
+ mvpp2_write(priv, MVPP2_BM_POOL_CTRL_REG(pool_id), val);
+}
+
static int mvpp2_bm_init(struct device *dev, struct mvpp2 *priv)
{
enum dma_data_direction dma_dir = DMA_FROM_DEVICE;
int i, err, poolnum = MVPP2_BM_POOLS_NUM;
struct mvpp2_port *port;
+ if (priv->percpu_pools)
+ poolnum = mvpp2_get_nrxqs(priv) * 2;
+
+ /* Clean up the pool state in case it contains stale state */
+ for (i = 0; i < poolnum; i++)
+ mvpp2_bm_pool_cleanup(priv, i);
+
if (priv->percpu_pools) {
for (i = 0; i < priv->port_count; i++) {
port = priv->port_list[i];
@@ -629,7 +655,6 @@ static int mvpp2_bm_init(struct device *dev, struct mvpp2 *priv)
}
}
- poolnum = mvpp2_get_nrxqs(priv) * 2;
for (i = 0; i < poolnum; i++) {
/* the pool in use */
int pn = i / (poolnum / 2);
--
2.25.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [net v4 PATCH 1/1] net: mvpp2: clear BM pool before initialization
2024-01-19 3:59 [net v4 PATCH 1/1] net: mvpp2: clear BM pool before initialization Jenishkumar Maheshbhai Patel
@ 2024-01-19 14:04 ` Maxime Chevallier
2024-01-22 6:02 ` [EXT] " Jenishkumar Patel [C]
2024-01-24 20:40 ` patchwork-bot+netdevbpf
1 sibling, 1 reply; 5+ messages in thread
From: Maxime Chevallier @ 2024-01-19 14:04 UTC (permalink / raw)
To: Jenishkumar Maheshbhai Patel
Cc: marcin.s.wojtas, linux, davem, edumazet, kuba, pabeni, netdev,
linux-kernel, Antoine Tenart
Hello,
On Thu, 18 Jan 2024 19:59:14 -0800
Jenishkumar Maheshbhai Patel <jpatel2@marvell.com> wrote:
> Register value persist after booting the kernel using
> kexec which results in kernel panic. Thus clear the
> BM pool registers before initialisation to fix the issue.
>
> Fixes: 3f518509dedc ("ethernet: Add new driver for Marvell Armada 375 network unit")
> Signed-off-by: Jenishkumar Maheshbhai Patel <jpatel2@marvell.com>
> ---
> v1-v2:
> -Move comments outside the loop
> -remove unrequired brances.
> v2-v3:
> -improve readability
> -correct register read API
> v3-v4:
> -optimize the code
> -improve readability
Thanks for taking the reviews into account, however ...
> .../net/ethernet/marvell/mvpp2/mvpp2_main.c | 27 ++++++++++++++++++-
> 1 file changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
> index 820b1fabe297..23adf53c2aa1 100644
> --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
> +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
> @@ -614,12 +614,38 @@ static void mvpp23_bm_set_8pool_mode(struct mvpp2 *priv)
> mvpp2_write(priv, MVPP22_BM_POOL_BASE_ADDR_HIGH_REG, val);
> }
>
> +/* Cleanup pool before actual initialization in the OS */
> +static void mvpp2_bm_pool_cleanup(struct mvpp2 *priv, int pool_id)
> +{
> + unsigned int thread = mvpp2_cpu_to_thread(priv, get_cpu());
> + u32 val;
> + int i;
> +
> + /* Drain the BM from all possible residues left by firmware */
> + for (i = 0; i < MVPP2_BM_POOL_SIZE_MAX; i++)
> + mvpp2_thread_read(priv, thread, MVPP2_BM_PHY_ALLOC_REG(pool_id));
... I think you didn't answer Antoine's comment on that loop from the
V2, regarding what this does exactly. From the other sites this is
used, it seems to perform an allocation from the pool, can you clarify
how safe it is to do so here, if for example the BM was never configured
by the firmware beforehand and is therefore already in a Stopped state ?
And are we not risking any leak if there was something in the pool that
we don't release ?
Thanks,
Maxime
^ permalink raw reply [flat|nested] 5+ messages in thread
* RE: [EXT] Re: [net v4 PATCH 1/1] net: mvpp2: clear BM pool before initialization
2024-01-19 14:04 ` Maxime Chevallier
@ 2024-01-22 6:02 ` Jenishkumar Patel [C]
2024-01-23 9:15 ` Maxime Chevallier
0 siblings, 1 reply; 5+ messages in thread
From: Jenishkumar Patel [C] @ 2024-01-22 6:02 UTC (permalink / raw)
To: 'Maxime Chevallier'
Cc: marcin.s.wojtas@gmail.com, linux@armlinux.org.uk,
davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, Antoine Tenart
-----Original Message-----
From: Maxime Chevallier <maxime.chevallier@bootlin.com>
Sent: Friday, January 19, 2024 7:35 PM
To: Jenishkumar Patel [C] <jpatel2@marvell.com>
Cc: marcin.s.wojtas@gmail.com; linux@armlinux.org.uk; davem@davemloft.net; edumazet@google.com; kuba@kernel.org; pabeni@redhat.com; netdev@vger.kernel.org; linux-kernel@vger.kernel.org; Antoine Tenart <atenart@kernel.org>
Subject: [EXT] Re: [net v4 PATCH 1/1] net: mvpp2: clear BM pool before initialization
External Email
----------------------------------------------------------------------
Hello,
On Thu, 18 Jan 2024 19:59:14 -0800
Jenishkumar Maheshbhai Patel <jpatel2@marvell.com> wrote:
> Register value persist after booting the kernel using kexec which
> results in kernel panic. Thus clear the BM pool registers before
> initialisation to fix the issue.
>
> Fixes: 3f518509dedc ("ethernet: Add new driver for Marvell Armada 375
> network unit")
> Signed-off-by: Jenishkumar Maheshbhai Patel <jpatel2@marvell.com>
> ---
> v1-v2:
> -Move comments outside the loop
> -remove unrequired brances.
> v2-v3:
> -improve readability
> -correct register read API
> v3-v4:
> -optimize the code
> -improve readability
Thanks for taking the reviews into account, however ...
> .../net/ethernet/marvell/mvpp2/mvpp2_main.c | 27 ++++++++++++++++++-
> 1 file changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
> b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
> index 820b1fabe297..23adf53c2aa1 100644
> --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
> +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
> @@ -614,12 +614,38 @@ static void mvpp23_bm_set_8pool_mode(struct mvpp2 *priv)
> mvpp2_write(priv, MVPP22_BM_POOL_BASE_ADDR_HIGH_REG, val); }
>
> +/* Cleanup pool before actual initialization in the OS */ static void
> +mvpp2_bm_pool_cleanup(struct mvpp2 *priv, int pool_id) {
> + unsigned int thread = mvpp2_cpu_to_thread(priv, get_cpu());
> + u32 val;
> + int i;
> +
> + /* Drain the BM from all possible residues left by firmware */
> + for (i = 0; i < MVPP2_BM_POOL_SIZE_MAX; i++)
> + mvpp2_thread_read(priv, thread, MVPP2_BM_PHY_ALLOC_REG(pool_id));
... I think you didn't answer Antoine's comment on that loop from the V2, regarding what this does exactly. From the other sites this is used, it seems to perform an allocation from the pool, can you clarify how safe it is to do so here, if for example the BM was never configured by the firmware beforehand and is therefore already in a Stopped state ?
Reading the register provides a pointer to buffer that is already allocated during BM initialization. When multiple reading is done on the register, it will drain all the pointers that are stored by previous firmware. Also reading this register does not perform any allocation as it is only performing register read operation, thus when the BM is not configured earlier then it will not lead to any stop state.
And are we not risking any leak if there was something in the pool that we don't release ?
The data on the pointer given by register read is written after the read operation is preformed, which means the pointer does not contain any data, thus there is no leak.
Thanks,
Maxime
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [EXT] Re: [net v4 PATCH 1/1] net: mvpp2: clear BM pool before initialization
2024-01-22 6:02 ` [EXT] " Jenishkumar Patel [C]
@ 2024-01-23 9:15 ` Maxime Chevallier
0 siblings, 0 replies; 5+ messages in thread
From: Maxime Chevallier @ 2024-01-23 9:15 UTC (permalink / raw)
To: Jenishkumar Patel [C]
Cc: marcin.s.wojtas@gmail.com, linux@armlinux.org.uk,
davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, Antoine Tenart
Hi,
On Mon, 22 Jan 2024 06:02:07 +0000
"Jenishkumar Patel [C]" <jpatel2@marvell.com> wrote:
> > > +/* Cleanup pool before actual initialization in the OS */ static void
> > > +mvpp2_bm_pool_cleanup(struct mvpp2 *priv, int pool_id) {
> > > + unsigned int thread = mvpp2_cpu_to_thread(priv, get_cpu());
> > > + u32 val;
> > > + int i;
> > > +
> > > + /* Drain the BM from all possible residues left by firmware */
> > > + for (i = 0; i < MVPP2_BM_POOL_SIZE_MAX; i++)
> > > + mvpp2_thread_read(priv, thread, MVPP2_BM_PHY_ALLOC_REG(pool_id));
> >
> > ... I think you didn't answer Antoine's comment on that loop from the V2, regarding what this does exactly. From the other sites this is used, it seems to perform an allocation from the pool, can you clarify how safe it is to do so here, if for example the BM was never configured by the firmware beforehand and is therefore already in a Stopped state ?
>
> Reading the register provides a pointer to buffer that is already allocated during BM initialization. When multiple reading is done on the register, it will drain all the pointers that are stored by previous firmware. Also reading this register does not perform any allocation as it is only performing register read operation, thus when the BM is not configured earlier then it will not lead to any stop state.
>
> > And are we not risking any leak if there was something in the pool that we don't release ?
>
> The data on the pointer given by register read is written after the read operation is preformed, which means the pointer does not contain any data, thus there is no leak.
Thanks for your answers, I think that's clear to me then.
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Maxime
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [net v4 PATCH 1/1] net: mvpp2: clear BM pool before initialization
2024-01-19 3:59 [net v4 PATCH 1/1] net: mvpp2: clear BM pool before initialization Jenishkumar Maheshbhai Patel
2024-01-19 14:04 ` Maxime Chevallier
@ 2024-01-24 20:40 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 5+ messages in thread
From: patchwork-bot+netdevbpf @ 2024-01-24 20:40 UTC (permalink / raw)
To: Jenishkumar
Cc: marcin.s.wojtas, linux, davem, edumazet, kuba, pabeni, netdev,
linux-kernel
Hello:
This patch was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:
On Thu, 18 Jan 2024 19:59:14 -0800 you wrote:
> Register value persist after booting the kernel using
> kexec which results in kernel panic. Thus clear the
> BM pool registers before initialisation to fix the issue.
>
> Fixes: 3f518509dedc ("ethernet: Add new driver for Marvell Armada 375 network unit")
> Signed-off-by: Jenishkumar Maheshbhai Patel <jpatel2@marvell.com>
>
> [...]
Here is the summary with links:
- [net,v4,1/1] net: mvpp2: clear BM pool before initialization
https://git.kernel.org/netdev/net/c/9f538b415db8
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-01-24 20:40 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-19 3:59 [net v4 PATCH 1/1] net: mvpp2: clear BM pool before initialization Jenishkumar Maheshbhai Patel
2024-01-19 14:04 ` Maxime Chevallier
2024-01-22 6:02 ` [EXT] " Jenishkumar Patel [C]
2024-01-23 9:15 ` Maxime Chevallier
2024-01-24 20:40 ` patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).