提交 5ff356c7 编写于 作者: Y Yufeng Mo 提交者: Zheng Zengkai

net: hns3: fix the concurrency between functions reading debugfs

mainline inclusion
from mainline-v5.18-rc1
commit 9c9a0421
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I56XHY
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9c9a04212fa3

----------------------------------------------------------------------

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: 5e69ea7e ("net: hns3: refactor the debugfs process")
Signed-off-by: NYufeng Mo <moyufeng@huawei.com>
Signed-off-by: NGuangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: NPaolo Abeni <pabeni@redhat.com>
Signed-off-by: NJiantao Xiao <xiaojiantao1@h-partners.com>
Reviewed-by: NYue Haibing <yuehaibing@huawei.com>
Reviewed-by: NJian Shen <shenjian15@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 3a44f609
...@@ -845,6 +845,7 @@ struct hnae3_handle { ...@@ -845,6 +845,7 @@ struct hnae3_handle {
struct dentry *hnae3_dbgfs; struct dentry *hnae3_dbgfs;
/* protects concurrent contention between debugfs commands */ /* protects concurrent contention between debugfs commands */
struct mutex dbgfs_lock; struct mutex dbgfs_lock;
char **dbgfs_buf;
/* Network interface message level enabled bits */ /* Network interface message level enabled bits */
u32 msg_enable; u32 msg_enable;
......
...@@ -1227,7 +1227,7 @@ static ssize_t hns3_dbg_read(struct file *filp, char __user *buffer, ...@@ -1227,7 +1227,7 @@ static ssize_t hns3_dbg_read(struct file *filp, char __user *buffer,
return ret; return ret;
mutex_lock(&handle->dbgfs_lock); 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) || if (!test_bit(HNS3_NIC_STATE_INITED, &priv->state) ||
test_bit(HNS3_NIC_STATE_RESETTING, &priv->state)) { test_bit(HNS3_NIC_STATE_RESETTING, &priv->state)) {
...@@ -1332,6 +1332,13 @@ int hns3_dbg_init(struct hnae3_handle *handle) ...@@ -1332,6 +1332,13 @@ int hns3_dbg_init(struct hnae3_handle *handle)
int ret; int ret;
u32 i; 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 = hns3_dbg_dentry[HNS3_DBG_DENTRY_COMMON].dentry =
debugfs_create_dir(name, hns3_dbgfs_root); debugfs_create_dir(name, hns3_dbgfs_root);
handle->hnae3_dbgfs = hns3_dbg_dentry[HNS3_DBG_DENTRY_COMMON].dentry; handle->hnae3_dbgfs = hns3_dbg_dentry[HNS3_DBG_DENTRY_COMMON].dentry;
...@@ -1380,9 +1387,9 @@ void hns3_dbg_uninit(struct hnae3_handle *handle) ...@@ -1380,9 +1387,9 @@ void hns3_dbg_uninit(struct hnae3_handle *handle)
u32 i; u32 i;
for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++) for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++)
if (hns3_dbg_cmd[i].buf) { if (handle->dbgfs_buf[i]) {
kvfree(hns3_dbg_cmd[i].buf); kvfree(handle->dbgfs_buf[i]);
hns3_dbg_cmd[i].buf = NULL; handle->dbgfs_buf[i] = NULL;
} }
mutex_destroy(&handle->dbgfs_lock); mutex_destroy(&handle->dbgfs_lock);
......
...@@ -49,7 +49,6 @@ struct hns3_dbg_cmd_info { ...@@ -49,7 +49,6 @@ struct hns3_dbg_cmd_info {
enum hnae3_dbg_cmd cmd; enum hnae3_dbg_cmd cmd;
enum hns3_dbg_dentry_type dentry; enum hns3_dbg_dentry_type dentry;
u32 buf_len; u32 buf_len;
char *buf;
int (*init)(struct hnae3_handle *handle, unsigned int cmd); int (*init)(struct hnae3_handle *handle, unsigned int cmd);
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册