diff mbox series

ravb: Fixed the problem that rmmod can not be done

Message ID 20200730035649.5940-1-ashiduka@fujitsu.com (mailing list archive)
State Superseded
Delegated to: Geert Uytterhoeven
Headers show
Series ravb: Fixed the problem that rmmod can not be done | expand

Commit Message

Yuusuke Ashizuka July 30, 2020, 3:56 a.m. UTC
ravb is a module driver, but I cannot rmmod it after insmod it.
ravb does mdio_init() at the time of probe, and module->refcnt is incremented
by alloc_mdio_bitbang() called after that.
Therefore, even if ifup is not performed, the driver is in use and rmmod cannot
be performed.

$ lsmod
Module                  Size  Used by
ravb                   40960  1
$ rmmod ravb
rmmod: ERROR: Module ravb is in use

Fixed to execute mdio_init() at open and free_mdio() at close, thereby rmmod is
possible in the ifdown state.

Signed-off-by: Yuusuke Ashizuka <ashiduka@fujitsu.com>
---
 drivers/net/ethernet/renesas/ravb_main.c | 110 +++++++++++------------
 1 file changed, 55 insertions(+), 55 deletions(-)

Comments

kernel test robot July 30, 2020, 7:55 a.m. UTC | #1
Hi Yuusuke,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on ipvs/master]
[also build test ERROR on linus/master v5.8-rc7 next-20200729]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Yuusuke-Ashizuka/ravb-Fixed-the-problem-that-rmmod-can-not-be-done/20200730-120910
base:   https://git.kernel.org/pub/scm/linux/kernel/git/horms/ipvs.git master
config: xtensa-allyesconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=xtensa 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from include/linux/err.h:5,
                    from include/linux/clk.h:12,
                    from drivers/net/ethernet/renesas/ravb_main.c:12:
   include/linux/scatterlist.h: In function 'sg_set_buf':
   arch/xtensa/include/asm/page.h:193:9: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits]
     193 |  ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
         |         ^~
   include/linux/compiler.h:78:42: note: in definition of macro 'unlikely'
      78 | # define unlikely(x) __builtin_expect(!!(x), 0)
         |                                          ^
   include/linux/scatterlist.h:143:2: note: in expansion of macro 'BUG_ON'
     143 |  BUG_ON(!virt_addr_valid(buf));
         |  ^~~~~~
   arch/xtensa/include/asm/page.h:201:32: note: in expansion of macro 'pfn_valid'
     201 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
         |                                ^~~~~~~~~
   include/linux/scatterlist.h:143:10: note: in expansion of macro 'virt_addr_valid'
     143 |  BUG_ON(!virt_addr_valid(buf));
         |          ^~~~~~~~~~~~~~~
   In file included from ./arch/xtensa/include/generated/asm/bug.h:1,
                    from include/linux/bug.h:5,
                    from include/linux/thread_info.h:12,
                    from arch/xtensa/include/asm/current.h:18,
                    from include/linux/mutex.h:14,
                    from include/linux/notifier.h:14,
                    from include/linux/clk.h:14,
                    from drivers/net/ethernet/renesas/ravb_main.c:12:
   include/linux/dma-mapping.h: In function 'dma_map_resource':
   arch/xtensa/include/asm/page.h:193:9: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits]
     193 |  ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
         |         ^~
   include/asm-generic/bug.h:144:27: note: in definition of macro 'WARN_ON_ONCE'
     144 |  int __ret_warn_once = !!(condition);   \
         |                           ^~~~~~~~~
   include/linux/dma-mapping.h:352:19: note: in expansion of macro 'pfn_valid'
     352 |  if (WARN_ON_ONCE(pfn_valid(PHYS_PFN(phys_addr))))
         |                   ^~~~~~~~~
   drivers/net/ethernet/renesas/ravb_main.c: In function 'ravb_open':
>> drivers/net/ethernet/renesas/ravb_main.c:1470:2: error: implicit declaration of function 'ravb_mdio_release' [-Werror=implicit-function-declaration]
    1470 |  ravb_mdio_release(priv);
         |  ^~~~~~~~~~~~~~~~~
   drivers/net/ethernet/renesas/ravb_main.c: At top level:
>> drivers/net/ethernet/renesas/ravb_main.c:1705:12: error: static declaration of 'ravb_mdio_release' follows non-static declaration
    1705 | static int ravb_mdio_release(struct ravb_private *priv)
         |            ^~~~~~~~~~~~~~~~~
   drivers/net/ethernet/renesas/ravb_main.c:1470:2: note: previous implicit declaration of 'ravb_mdio_release' was here
    1470 |  ravb_mdio_release(priv);
         |  ^~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors

vim +/ravb_mdio_release +1470 drivers/net/ethernet/renesas/ravb_main.c

  1377	
  1378	/* Network device open function for Ethernet AVB */
  1379	static int ravb_open(struct net_device *ndev)
  1380	{
  1381		struct ravb_private *priv = netdev_priv(ndev);
  1382		struct platform_device *pdev = priv->pdev;
  1383		struct device *dev = &pdev->dev;
  1384		int error;
  1385	
  1386		/* MDIO bus init */
  1387		error = ravb_mdio_init(priv);
  1388		if (error) {
  1389			netdev_err(ndev, "failed to initialize MDIO\n");
  1390			return error;
  1391		}
  1392	
  1393		napi_enable(&priv->napi[RAVB_BE]);
  1394		napi_enable(&priv->napi[RAVB_NC]);
  1395	
  1396		if (priv->chip_id == RCAR_GEN2) {
  1397			error = request_irq(ndev->irq, ravb_interrupt, IRQF_SHARED,
  1398					    ndev->name, ndev);
  1399			if (error) {
  1400				netdev_err(ndev, "cannot request IRQ\n");
  1401				goto out_napi_off;
  1402			}
  1403		} else {
  1404			error = ravb_hook_irq(ndev->irq, ravb_multi_interrupt, ndev,
  1405					      dev, "ch22:multi");
  1406			if (error)
  1407				goto out_napi_off;
  1408			error = ravb_hook_irq(priv->emac_irq, ravb_emac_interrupt, ndev,
  1409					      dev, "ch24:emac");
  1410			if (error)
  1411				goto out_free_irq;
  1412			error = ravb_hook_irq(priv->rx_irqs[RAVB_BE], ravb_be_interrupt,
  1413					      ndev, dev, "ch0:rx_be");
  1414			if (error)
  1415				goto out_free_irq_emac;
  1416			error = ravb_hook_irq(priv->tx_irqs[RAVB_BE], ravb_be_interrupt,
  1417					      ndev, dev, "ch18:tx_be");
  1418			if (error)
  1419				goto out_free_irq_be_rx;
  1420			error = ravb_hook_irq(priv->rx_irqs[RAVB_NC], ravb_nc_interrupt,
  1421					      ndev, dev, "ch1:rx_nc");
  1422			if (error)
  1423				goto out_free_irq_be_tx;
  1424			error = ravb_hook_irq(priv->tx_irqs[RAVB_NC], ravb_nc_interrupt,
  1425					      ndev, dev, "ch19:tx_nc");
  1426			if (error)
  1427				goto out_free_irq_nc_rx;
  1428		}
  1429	
  1430		/* Device init */
  1431		error = ravb_dmac_init(ndev);
  1432		if (error)
  1433			goto out_free_irq_nc_tx;
  1434		ravb_emac_init(ndev);
  1435	
  1436		/* Initialise PTP Clock driver */
  1437		if (priv->chip_id == RCAR_GEN2)
  1438			ravb_ptp_init(ndev, priv->pdev);
  1439	
  1440		netif_tx_start_all_queues(ndev);
  1441	
  1442		/* PHY control start */
  1443		error = ravb_phy_start(ndev);
  1444		if (error)
  1445			goto out_ptp_stop;
  1446	
  1447		return 0;
  1448	
  1449	out_ptp_stop:
  1450		/* Stop PTP Clock driver */
  1451		if (priv->chip_id == RCAR_GEN2)
  1452			ravb_ptp_stop(ndev);
  1453	out_free_irq_nc_tx:
  1454		if (priv->chip_id == RCAR_GEN2)
  1455			goto out_free_irq;
  1456		free_irq(priv->tx_irqs[RAVB_NC], ndev);
  1457	out_free_irq_nc_rx:
  1458		free_irq(priv->rx_irqs[RAVB_NC], ndev);
  1459	out_free_irq_be_tx:
  1460		free_irq(priv->tx_irqs[RAVB_BE], ndev);
  1461	out_free_irq_be_rx:
  1462		free_irq(priv->rx_irqs[RAVB_BE], ndev);
  1463	out_free_irq_emac:
  1464		free_irq(priv->emac_irq, ndev);
  1465	out_free_irq:
  1466		free_irq(ndev->irq, ndev);
  1467	out_napi_off:
  1468		napi_disable(&priv->napi[RAVB_NC]);
  1469		napi_disable(&priv->napi[RAVB_BE]);
> 1470		ravb_mdio_release(priv);
  1471		return error;
  1472	}
  1473	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index 99f7aae102ce..c8a6176bc330 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -1342,6 +1342,39 @@  static inline int ravb_hook_irq(unsigned int irq, irq_handler_t handler,
 	return error;
 }
 
+/* MDIO bus init function */
+static int ravb_mdio_init(struct ravb_private *priv)
+{
+	struct platform_device *pdev = priv->pdev;
+	struct device *dev = &pdev->dev;
+	int error;
+
+	/* Bitbang init */
+	priv->mdiobb.ops = &bb_ops;
+
+	/* MII controller setting */
+	priv->mii_bus = alloc_mdio_bitbang(&priv->mdiobb);
+	if (!priv->mii_bus)
+		return -ENOMEM;
+
+	/* Hook up MII support for ethtool */
+	priv->mii_bus->name = "ravb_mii";
+	priv->mii_bus->parent = dev;
+	snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x",
+		 pdev->name, pdev->id);
+
+	/* Register MDIO bus */
+	error = of_mdiobus_register(priv->mii_bus, dev->of_node);
+	if (error)
+		goto out_free_bus;
+
+	return 0;
+
+out_free_bus:
+	free_mdio_bitbang(priv->mii_bus);
+	return error;
+}
+
 /* Network device open function for Ethernet AVB */
 static int ravb_open(struct net_device *ndev)
 {
@@ -1350,6 +1383,13 @@  static int ravb_open(struct net_device *ndev)
 	struct device *dev = &pdev->dev;
 	int error;
 
+	/* MDIO bus init */
+	error = ravb_mdio_init(priv);
+	if (error) {
+		netdev_err(ndev, "failed to initialize MDIO\n");
+		return error;
+	}
+
 	napi_enable(&priv->napi[RAVB_BE]);
 	napi_enable(&priv->napi[RAVB_NC]);
 
@@ -1427,6 +1467,7 @@  static int ravb_open(struct net_device *ndev)
 out_napi_off:
 	napi_disable(&priv->napi[RAVB_NC]);
 	napi_disable(&priv->napi[RAVB_BE]);
+	ravb_mdio_release(priv);
 	return error;
 }
 
@@ -1682,6 +1723,18 @@  static void ravb_set_rx_mode(struct net_device *ndev)
 	spin_unlock_irqrestore(&priv->lock, flags);
 }
 
+/* MDIO bus release function */
+static int ravb_mdio_release(struct ravb_private *priv)
+{
+	/* Unregister mdio bus */
+	mdiobus_unregister(priv->mii_bus);
+
+	/* Free bitbang info */
+	free_mdio_bitbang(priv->mii_bus);
+
+	return 0;
+}
+
 /* Device close function for Ethernet AVB */
 static int ravb_close(struct net_device *ndev)
 {
@@ -1736,6 +1789,8 @@  static int ravb_close(struct net_device *ndev)
 	ravb_ring_free(ndev, RAVB_BE);
 	ravb_ring_free(ndev, RAVB_NC);
 
+	ravb_mdio_release(priv);
+
 	return 0;
 }
 
@@ -1887,51 +1942,6 @@  static const struct net_device_ops ravb_netdev_ops = {
 	.ndo_set_features	= ravb_set_features,
 };
 
-/* MDIO bus init function */
-static int ravb_mdio_init(struct ravb_private *priv)
-{
-	struct platform_device *pdev = priv->pdev;
-	struct device *dev = &pdev->dev;
-	int error;
-
-	/* Bitbang init */
-	priv->mdiobb.ops = &bb_ops;
-
-	/* MII controller setting */
-	priv->mii_bus = alloc_mdio_bitbang(&priv->mdiobb);
-	if (!priv->mii_bus)
-		return -ENOMEM;
-
-	/* Hook up MII support for ethtool */
-	priv->mii_bus->name = "ravb_mii";
-	priv->mii_bus->parent = dev;
-	snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x",
-		 pdev->name, pdev->id);
-
-	/* Register MDIO bus */
-	error = of_mdiobus_register(priv->mii_bus, dev->of_node);
-	if (error)
-		goto out_free_bus;
-
-	return 0;
-
-out_free_bus:
-	free_mdio_bitbang(priv->mii_bus);
-	return error;
-}
-
-/* MDIO bus release function */
-static int ravb_mdio_release(struct ravb_private *priv)
-{
-	/* Unregister mdio bus */
-	mdiobus_unregister(priv->mii_bus);
-
-	/* Free bitbang info */
-	free_mdio_bitbang(priv->mii_bus);
-
-	return 0;
-}
-
 static const struct of_device_id ravb_match_table[] = {
 	{ .compatible = "renesas,etheravb-r8a7790", .data = (void *)RCAR_GEN2 },
 	{ .compatible = "renesas,etheravb-r8a7794", .data = (void *)RCAR_GEN2 },
@@ -2174,13 +2184,6 @@  static int ravb_probe(struct platform_device *pdev)
 		eth_hw_addr_random(ndev);
 	}
 
-	/* MDIO bus init */
-	error = ravb_mdio_init(priv);
-	if (error) {
-		dev_err(&pdev->dev, "failed to initialize MDIO\n");
-		goto out_dma_free;
-	}
-
 	netif_napi_add(ndev, &priv->napi[RAVB_BE], ravb_poll, 64);
 	netif_napi_add(ndev, &priv->napi[RAVB_NC], ravb_poll, 64);
 
@@ -2202,8 +2205,6 @@  static int ravb_probe(struct platform_device *pdev)
 out_napi_del:
 	netif_napi_del(&priv->napi[RAVB_NC]);
 	netif_napi_del(&priv->napi[RAVB_BE]);
-	ravb_mdio_release(priv);
-out_dma_free:
 	dma_free_coherent(ndev->dev.parent, priv->desc_bat_size, priv->desc_bat,
 			  priv->desc_bat_dma);
 
@@ -2235,7 +2236,6 @@  static int ravb_remove(struct platform_device *pdev)
 	unregister_netdev(ndev);
 	netif_napi_del(&priv->napi[RAVB_NC]);
 	netif_napi_del(&priv->napi[RAVB_BE]);
-	ravb_mdio_release(priv);
 	pm_runtime_disable(&pdev->dev);
 	free_netdev(ndev);
 	platform_set_drvdata(pdev, NULL);