lkml.org 
[lkml]   [2022]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 207/530] net: mvpp2: fix mvpp2 debugfs leak
    Date
    From: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>

    [ Upstream commit 0152dfee235e87660f52a117fc9f70dc55956bb4 ]

    When mvpp2 is unloaded, the driver specific debugfs directory is not
    removed, which technically leads to a memory leak. However, this
    directory is only created when the first device is probed, so the
    hardware is present. Removing the module is only something a developer
    would to when e.g. testing out changes, so the module would be
    reloaded. So this memory leak is minor.

    The original attempt in commit fe2c9c61f668 ("net: mvpp2: debugfs: fix
    memory leak when using debugfs_lookup()") that was labelled as a memory
    leak fix was not, it fixed a refcount leak, but in doing so created a
    problem when the module is reloaded - the directory already exists, but
    mvpp2_root is NULL, so we lose all debugfs entries. This fix has been
    reverted.

    This is the alternative fix, where we remove the offending directory
    whenever the driver is unloaded.

    Fixes: 21da57a23125 ("net: mvpp2: add a debugfs interface for the Header Parser")
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Reviewed-by: Marcin Wojtas <mw@semihalf.com>
    Link: https://lore.kernel.org/r/E1ofOAB-00CzkG-UO@rmk-PC.armlinux.org.uk
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/marvell/mvpp2/mvpp2.h | 1 +
    drivers/net/ethernet/marvell/mvpp2/mvpp2_debugfs.c | 10 ++++++++--
    drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 13 ++++++++++++-
    3 files changed, 21 insertions(+), 3 deletions(-)

    diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
    index cf8acabb90ac..72608a47d4e0 100644
    --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
    +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
    @@ -1529,6 +1529,7 @@ u32 mvpp2_read(struct mvpp2 *priv, u32 offset);
    void mvpp2_dbgfs_init(struct mvpp2 *priv, const char *name);

    void mvpp2_dbgfs_cleanup(struct mvpp2 *priv);
    +void mvpp2_dbgfs_exit(void);

    void mvpp23_rx_fifo_fc_en(struct mvpp2 *priv, int port, bool en);

    diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_debugfs.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_debugfs.c
    index 4a3baa7e0142..75e83ea2a926 100644
    --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_debugfs.c
    +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_debugfs.c
    @@ -691,6 +691,13 @@ static int mvpp2_dbgfs_port_init(struct dentry *parent,
    return 0;
    }

    +static struct dentry *mvpp2_root;
    +
    +void mvpp2_dbgfs_exit(void)
    +{
    + debugfs_remove(mvpp2_root);
    +}
    +
    void mvpp2_dbgfs_cleanup(struct mvpp2 *priv)
    {
    debugfs_remove_recursive(priv->dbgfs_dir);
    @@ -700,10 +707,9 @@ void mvpp2_dbgfs_cleanup(struct mvpp2 *priv)

    void mvpp2_dbgfs_init(struct mvpp2 *priv, const char *name)
    {
    - struct dentry *mvpp2_dir, *mvpp2_root;
    + struct dentry *mvpp2_dir;
    int ret, i;

    - mvpp2_root = debugfs_lookup(MVPP2_DRIVER_NAME, NULL);
    if (!mvpp2_root)
    mvpp2_root = debugfs_create_dir(MVPP2_DRIVER_NAME, NULL);

    diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
    index 2baa909290b3..ae586f8895fc 100644
    --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
    +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
    @@ -7710,7 +7710,18 @@ static struct platform_driver mvpp2_driver = {
    },
    };

    -module_platform_driver(mvpp2_driver);
    +static int __init mvpp2_driver_init(void)
    +{
    + return platform_driver_register(&mvpp2_driver);
    +}
    +module_init(mvpp2_driver_init);
    +
    +static void __exit mvpp2_driver_exit(void)
    +{
    + platform_driver_unregister(&mvpp2_driver);
    + mvpp2_dbgfs_exit();
    +}
    +module_exit(mvpp2_driver_exit);

    MODULE_DESCRIPTION("Marvell PPv2 Ethernet Driver - www.marvell.com");
    MODULE_AUTHOR("Marcin Wojtas <mw@semihalf.com>");
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-24 18:42    [W:3.833 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site