On Wed, Oct 13, 2021 at 12:04 PM Dongliang Mu <mudongliangabcd@xxxxxxxxx> wrote: > > If register_candev fails, xcan_probe does not clean the napi > created by netif_napi_add. > It seems the netif_napi_del operation is done in the free_candev (free_netdev precisely). list_for_each_entry_safe(p, n, &dev->napi_list, dev_list) netif_napi_del(p); And list_add_rcu(&napi->dev_list, &dev->napi_list) is done in the netif_napi_add. Therefore, I suggest removing "netif_napi_del" operation in the xcan_remove to match probe and remove function. > Fix this by adding error handling code to clean napi when > register_candev fails. > > Signed-off-by: Dongliang Mu <mudongliangabcd@xxxxxxxxx> > --- > drivers/net/can/xilinx_can.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/can/xilinx_can.c b/drivers/net/can/xilinx_can.c > index 3b883e607d8b..6ee0b5a8cdfc 100644 > --- a/drivers/net/can/xilinx_can.c > +++ b/drivers/net/can/xilinx_can.c > @@ -1807,7 +1807,7 @@ static int xcan_probe(struct platform_device *pdev) > ret = register_candev(ndev); > if (ret) { > dev_err(&pdev->dev, "fail to register failed (err=%d)\n", ret); > - goto err_disableclks; > + goto err_del_napi; > } > > devm_can_led_init(ndev); > @@ -1825,6 +1825,8 @@ static int xcan_probe(struct platform_device *pdev) > > return 0; > > +err_del_napi: > + netif_napi_del(&priv->napi); > err_disableclks: > pm_runtime_put(priv->dev); > pm_runtime_disable(&pdev->dev); > -- > 2.25.1 >