| From 9611cb26f38093050e8ea3fb9b30edc2631d8510 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 6 Feb 2024 13:30:54 +0100 |
| Subject: lan966x: Fix crash when adding interface under a lag |
| |
| From: Horatiu Vultur <horatiu.vultur@microchip.com> |
| |
| [ Upstream commit 15faa1f67ab405d47789d4702f587ec7df7ef03e ] |
| |
| There is a crash when adding one of the lan966x interfaces under a lag |
| interface. The issue can be reproduced like this: |
| ip link add name bond0 type bond miimon 100 mode balance-xor |
| ip link set dev eth0 master bond0 |
| |
| The reason is because when adding a interface under the lag it would go |
| through all the ports and try to figure out which other ports are under |
| that lag interface. And the issue is that lan966x can have ports that are |
| NULL pointer as they are not probed. So then iterating over these ports |
| it would just crash as they are NULL pointers. |
| The fix consists in actually checking for NULL pointers before accessing |
| something from the ports. Like we do in other places. |
| |
| Fixes: cabc9d49333d ("net: lan966x: Add lag support for lan966x") |
| Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com> |
| Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com> |
| Reviewed-by: Simon Horman <horms@kernel.org> |
| Link: https://lore.kernel.org/r/20240206123054.3052966-1-horatiu.vultur@microchip.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/microchip/lan966x/lan966x_lag.c | 9 +++++++-- |
| 1 file changed, 7 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_lag.c b/drivers/net/ethernet/microchip/lan966x/lan966x_lag.c |
| index 41fa2523d91d..5f2cd9a8cf8f 100644 |
| --- a/drivers/net/ethernet/microchip/lan966x/lan966x_lag.c |
| +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_lag.c |
| @@ -37,19 +37,24 @@ static void lan966x_lag_set_aggr_pgids(struct lan966x *lan966x) |
| |
| /* Now, set PGIDs for each active LAG */ |
| for (lag = 0; lag < lan966x->num_phys_ports; ++lag) { |
| - struct net_device *bond = lan966x->ports[lag]->bond; |
| + struct lan966x_port *port = lan966x->ports[lag]; |
| int num_active_ports = 0; |
| + struct net_device *bond; |
| unsigned long bond_mask; |
| u8 aggr_idx[16]; |
| |
| - if (!bond || (visited & BIT(lag))) |
| + if (!port || !port->bond || (visited & BIT(lag))) |
| continue; |
| |
| + bond = port->bond; |
| bond_mask = lan966x_lag_get_mask(lan966x, bond); |
| |
| for_each_set_bit(p, &bond_mask, lan966x->num_phys_ports) { |
| struct lan966x_port *port = lan966x->ports[p]; |
| |
| + if (!port) |
| + continue; |
| + |
| lan_wr(ANA_PGID_PGID_SET(bond_mask), |
| lan966x, ANA_PGID(p)); |
| if (port->lag_tx_active) |
| -- |
| 2.43.0 |
| |