]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: hns3: fix the concurrency between functions reading debugfs
authorYufeng Mo <moyufeng@huawei.com>
Wed, 30 Mar 2022 13:45:05 +0000 (21:45 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Apr 2022 12:06:50 +0000 (14:06 +0200)
commit 9c9a04212fa380d2e7d1412bb281309955c0a781 upstream.

Currently, the debugfs mechanism is that all functions share a
global variable to save the pointer for obtaining data. When
different functions concurrently access the same file node,
repeated release exceptions occur. Therefore, the granularity
of the pointer for storing the obtained data is adjusted to be
private for each function.

Fixes: 5e69ea7ee2a6 ("net: hns3: refactor the debugfs process")
Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/hisilicon/hns3/hnae3.h
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h

index adea528d79adabe657ee01426b4f7c52a4cebff7..8184a954f6481e1becccabd8912155ccb42c4640 100644 (file)
@@ -844,6 +844,7 @@ struct hnae3_handle {
        struct dentry *hnae3_dbgfs;
        /* protects concurrent contention between debugfs commands */
        struct mutex dbgfs_lock;
+       char **dbgfs_buf;
 
        /* Network interface message level enabled bits */
        u32 msg_enable;
index c381f8af67f082f154ad65cdb279c36e64fe7256..1b155d7452186732bfe63947654ac99261c3cf04 100644 (file)
@@ -1227,7 +1227,7 @@ static ssize_t hns3_dbg_read(struct file *filp, char __user *buffer,
                return ret;
 
        mutex_lock(&handle->dbgfs_lock);
-       save_buf = &hns3_dbg_cmd[index].buf;
+       save_buf = &handle->dbgfs_buf[index];
 
        if (!test_bit(HNS3_NIC_STATE_INITED, &priv->state) ||
            test_bit(HNS3_NIC_STATE_RESETTING, &priv->state)) {
@@ -1332,6 +1332,13 @@ int hns3_dbg_init(struct hnae3_handle *handle)
        int ret;
        u32 i;
 
+       handle->dbgfs_buf = devm_kcalloc(&handle->pdev->dev,
+                                        ARRAY_SIZE(hns3_dbg_cmd),
+                                        sizeof(*handle->dbgfs_buf),
+                                        GFP_KERNEL);
+       if (!handle->dbgfs_buf)
+               return -ENOMEM;
+
        hns3_dbg_dentry[HNS3_DBG_DENTRY_COMMON].dentry =
                                debugfs_create_dir(name, hns3_dbgfs_root);
        handle->hnae3_dbgfs = hns3_dbg_dentry[HNS3_DBG_DENTRY_COMMON].dentry;
@@ -1380,9 +1387,9 @@ void hns3_dbg_uninit(struct hnae3_handle *handle)
        u32 i;
 
        for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++)
-               if (hns3_dbg_cmd[i].buf) {
-                       kvfree(hns3_dbg_cmd[i].buf);
-                       hns3_dbg_cmd[i].buf = NULL;
+               if (handle->dbgfs_buf[i]) {
+                       kvfree(handle->dbgfs_buf[i]);
+                       handle->dbgfs_buf[i] = NULL;
                }
 
        mutex_destroy(&handle->dbgfs_lock);
index bd8801065e024823afb6f2f6d3d559ded8721551..814f7491ca08ddc13ea9a2c0187d37d066687ee8 100644 (file)
@@ -47,7 +47,6 @@ struct hns3_dbg_cmd_info {
        enum hnae3_dbg_cmd cmd;
        enum hns3_dbg_dentry_type dentry;
        u32 buf_len;
-       char *buf;
        int (*init)(struct hnae3_handle *handle, unsigned int cmd);
 };