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 |
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 --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);
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(-)