On 4/20/26 2:47 PM, Erni Sri Satya Vennela wrote:
> If PM resume fails (e.g., mana_attach() returns an error), mana_probe()
> calls mana_remove(), which tears down the device and sets
> gd->gdma_context = NULL and gd->driver_data = NULL.
>
> However, a failed resume callback does not automatically unbind the
> driver. When the device is eventually unbound, mana_remove() is invoked
> a second time. Without a NULL check, it dereferences gc->dev with
> gc == NULL, causing a kernel panic.
>
> Add an early return if gdma_context or driver_data is NULL so the second
> invocation is harmless. Move the dev = gc->dev assignment after the
> guard so it cannot dereference NULL.
>
> Fixes: 635096a86edb ("net: mana: Support hibernation and kexec")
> Signed-off-by: Erni Sri Satya Vennela <[email protected]>
> ---
> Changes in v4:
> * Update Fixes tag to 635096a86edb
> Changes in v3:
> * Add this patch to the patchset
> ---
> drivers/net/ethernet/microsoft/mana/mana_en.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c
> b/drivers/net/ethernet/microsoft/mana/mana_en.c
> index 468ed60a8a00..ce1b7ec46a27 100644
> --- a/drivers/net/ethernet/microsoft/mana/mana_en.c
> +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c
> @@ -3731,11 +3731,16 @@ void mana_remove(struct gdma_dev *gd, bool suspending)
> struct gdma_context *gc = gd->gdma_context;
> struct mana_context *ac = gd->driver_data;
> struct mana_port_context *apc;
> - struct device *dev = gc->dev;
> + struct device *dev;
> struct net_device *ndev;
> int err;
> int i;
The above breaks the reverse christmas tree order. I'll apply the patch
as-is to avoid additional traffic for very little to no gain, but should
you touch again this code in the future for other reasons, please
restore the above.
/P