Message ID | 875xwd1g44.fsf@a16n.net (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net,v2] net: b44: set pause params only when interface is up | expand |
On Fri, Apr 19, 2024 at 06:17:47PM +0200, Peter Münster wrote: > Hi, > > This patch fixes a kernel panic when using netifd. > Could you please apply it also to linux-5.15.y at least? > > TIA and kind regards, > -- > Peter Hi Peter This is better, but still has some process issues. > b44_free_rings() accesses b44::rx_buffers (and ::tx_buffers) > unconditionally, but b44::rx_buffers is only valid when the > device is up (they get allocated in b44_open(), and deallocated > again in b44_close()), any other time these is just a NULL pointers. > > So if you try to change the pause params while the network interface > is disabled/administratively down, everything explodes (which likely > netifd tries to do). > > Link: https://github.com/openwrt/openwrt/issues/13789 > Fixes: 1da177e4c3f4 (Linux-2.6.12-rc2) Cc: stable@vger.kernel.org needs to go here. Your patch will first get applied to the next -rc release. Once it is published there, any patches with this tag are automatically added to the list for backporting to stable. That will include all long term stable branches, so there is no need to request specifically linux-5.15. There is some documentation about this here: https://www.kernel.org/doc/Documentation/process/stable-kernel-rules.rst > Reported-by: Peter Münster <pm@a16n.net> > Suggested-by: Jonas Gorski <jonas.gorski@gmail.com> > Signed-off-by: Vaclav Svoboda <svoboda@neng.cz> > Tested-by: Peter Münster <pm@a16n.net> > Signed-off-by: Peter Münster <pm@a16n.net> > --- Anything above the --- gets merged as the commit message. Anything below it and the patch proper gets discarded. This is where you can add comments for Maintainers etc. For this patch, you don't actually need any such comments. I often say to mainline newbies: The code is easy, the hard bit is the processes. Andrew
b44_free_rings() accesses b44::rx_buffers (and ::tx_buffers) unconditionally, but b44::rx_buffers is only valid when the device is up (they get allocated in b44_open(), and deallocated again in b44_close()), any other time these is just a NULL pointers. So if you try to change the pause params while the network interface is disabled/administratively down, everything explodes (which likely netifd tries to do). Link: https://github.com/openwrt/openwrt/issues/13789 Fixes: 1da177e4c3f4 (Linux-2.6.12-rc2) Reported-by: Peter Münster <pm@a16n.net> Suggested-by: Jonas Gorski <jonas.gorski@gmail.com> Signed-off-by: Vaclav Svoboda <svoboda@neng.cz> Tested-by: Peter Münster <pm@a16n.net> Signed-off-by: Peter Münster <pm@a16n.net> --- drivers/net/ethernet/broadcom/b44.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c index 3e4fb3c3e834..1be6d14030bc 100644 --- a/drivers/net/ethernet/broadcom/b44.c +++ b/drivers/net/ethernet/broadcom/b44.c @@ -2009,12 +2009,14 @@ static int b44_set_pauseparam(struct net_device *dev, bp->flags |= B44_FLAG_TX_PAUSE; else bp->flags &= ~B44_FLAG_TX_PAUSE; - if (bp->flags & B44_FLAG_PAUSE_AUTO) { - b44_halt(bp); - b44_init_rings(bp); - b44_init_hw(bp, B44_FULL_RESET); - } else { - __b44_set_flow_ctrl(bp, bp->flags); + if (netif_running(dev)) { + if (bp->flags & B44_FLAG_PAUSE_AUTO) { + b44_halt(bp); + b44_init_rings(bp); + b44_init_hw(bp, B44_FULL_RESET); + } else { + __b44_set_flow_ctrl(bp, bp->flags); + } } spin_unlock_irq(&bp->lock); -- 2.35.3