From: Ran Xiaokai <ran.xiaokai@zte.com.cn>
This is a preparation patch, when converted to rcu lock,
set_report_filterlist_whitelist() may fail due to memory alloction,
refactor it to return a value, so the error codes can be
passed to the userspace.
Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn>
---
kernel/kcsan/debugfs.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/kernel/kcsan/debugfs.c b/kernel/kcsan/debugfs.c
index ed483987869e..30547507f497 100644
--- a/kernel/kcsan/debugfs.c
+++ b/kernel/kcsan/debugfs.c
@@ -131,13 +131,14 @@ bool kcsan_skip_report_debugfs(unsigned long func_addr)
return ret;
}
-static void set_report_filterlist_whitelist(bool whitelist)
+static ssize_t set_report_filterlist_whitelist(bool whitelist)
{
unsigned long flags;
spin_lock_irqsave(&report_filterlist_lock, flags);
report_filterlist.whitelist = whitelist;
spin_unlock_irqrestore(&report_filterlist_lock, flags);
+ return 0;
}
/* Returns 0 on success, error-code otherwise. */
@@ -225,6 +226,7 @@ debugfs_write(struct file *file, const char __user *buf, size_t count, loff_t *o
char kbuf[KSYM_NAME_LEN];
char *arg;
const size_t read_len = min(count, sizeof(kbuf) - 1);
+ ssize_t ret;
if (copy_from_user(kbuf, buf, read_len))
return -EFAULT;
@@ -242,19 +244,19 @@ debugfs_write(struct file *file, const char __user *buf, size_t count, loff_t *o
return -EINVAL;
microbenchmark(iters);
} else if (!strcmp(arg, "whitelist")) {
- set_report_filterlist_whitelist(true);
+ ret = set_report_filterlist_whitelist(true);
} else if (!strcmp(arg, "blacklist")) {
- set_report_filterlist_whitelist(false);
+ ret = set_report_filterlist_whitelist(false);
} else if (arg[0] == '!') {
- ssize_t ret = insert_report_filterlist(&arg[1]);
-
- if (ret < 0)
- return ret;
+ ret = insert_report_filterlist(&arg[1]);
} else {
return -EINVAL;
}
- return count;
+ if (ret < 0)
+ return ret;
+ else
+ return count;
}
static const struct file_operations debugfs_ops =
--
2.15.2
On Wed, 25 Sept 2024 at 16:32, ran xiaokai <ranxiaokai627@163.com> wrote: > > From: Ran Xiaokai <ran.xiaokai@zte.com.cn> > > This is a preparation patch, when converted to rcu lock, > set_report_filterlist_whitelist() may fail due to memory alloction, > refactor it to return a value, so the error codes can be > passed to the userspace. > > Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> > --- > kernel/kcsan/debugfs.c | 18 ++++++++++-------- > 1 file changed, 10 insertions(+), 8 deletions(-) > > diff --git a/kernel/kcsan/debugfs.c b/kernel/kcsan/debugfs.c > index ed483987869e..30547507f497 100644 > --- a/kernel/kcsan/debugfs.c > +++ b/kernel/kcsan/debugfs.c > @@ -131,13 +131,14 @@ bool kcsan_skip_report_debugfs(unsigned long func_addr) > return ret; > } > > -static void set_report_filterlist_whitelist(bool whitelist) > +static ssize_t set_report_filterlist_whitelist(bool whitelist) > { > unsigned long flags; > > spin_lock_irqsave(&report_filterlist_lock, flags); > report_filterlist.whitelist = whitelist; > spin_unlock_irqrestore(&report_filterlist_lock, flags); > + return 0; > } > > /* Returns 0 on success, error-code otherwise. */ > @@ -225,6 +226,7 @@ debugfs_write(struct file *file, const char __user *buf, size_t count, loff_t *o > char kbuf[KSYM_NAME_LEN]; > char *arg; > const size_t read_len = min(count, sizeof(kbuf) - 1); > + ssize_t ret; This may be uninitialized depending on the branch taken below. > if (copy_from_user(kbuf, buf, read_len)) > return -EFAULT; > @@ -242,19 +244,19 @@ debugfs_write(struct file *file, const char __user *buf, size_t count, loff_t *o > return -EINVAL; > microbenchmark(iters); > } else if (!strcmp(arg, "whitelist")) { > - set_report_filterlist_whitelist(true); > + ret = set_report_filterlist_whitelist(true); > } else if (!strcmp(arg, "blacklist")) { > - set_report_filterlist_whitelist(false); > + ret = set_report_filterlist_whitelist(false); > } else if (arg[0] == '!') { > - ssize_t ret = insert_report_filterlist(&arg[1]); > - > - if (ret < 0) > - return ret; > + ret = insert_report_filterlist(&arg[1]); > } else { > return -EINVAL; > } > > - return count; > + if (ret < 0) > + return ret; > + else > + return count; > } > > static const struct file_operations debugfs_ops = > -- > 2.15.2 >
Hi ran, kernel test robot noticed the following build warnings: [auto build test WARNING on linus/master] [also build test WARNING on next-20240925] [cannot apply to v6.11] [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#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/ran-xiaokai/kcsan-debugfs-Remove-redundant-call-of-kallsyms_lookup_name/20240925-231034 base: linus/master patch link: https://lore.kernel.org/r/20240925143154.2322926-3-ranxiaokai627%40163.com patch subject: [PATCH 2/4] kcsan, debugfs: refactor set_report_filterlist_whitelist() to return a value config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20240926/202409261331.9NyGRPt2-lkp@intel.com/config) compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240926/202409261331.9NyGRPt2-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202409261331.9NyGRPt2-lkp@intel.com/ All warnings (new ones prefixed by >>): >> kernel/kcsan/debugfs.c:243:7: warning: variable 'ret' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized] 243 | if (kstrtoul(&arg[strlen("microbench=")], 0, &iters)) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/kcsan/debugfs.c:256:6: note: uninitialized use occurs here 256 | if (ret < 0) | ^~~ kernel/kcsan/debugfs.c:243:3: note: remove the 'if' if its condition is always true 243 | if (kstrtoul(&arg[strlen("microbench=")], 0, &iters)) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | return -EINVAL; >> kernel/kcsan/debugfs.c:238:13: warning: variable 'ret' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized] 238 | } else if (!strcmp(arg, "off")) { | ^~~~~~~~~~~~~~~~~~~ kernel/kcsan/debugfs.c:256:6: note: uninitialized use occurs here 256 | if (ret < 0) | ^~~ kernel/kcsan/debugfs.c:238:9: note: remove the 'if' if its condition is always false 238 | } else if (!strcmp(arg, "off")) { | ^~~~~~~~~~~~~~~~~~~~~~~~~~ 239 | WRITE_ONCE(kcsan_enabled, false); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | } else if (str_has_prefix(arg, "microbench=")) { | ~~~~~~ kernel/kcsan/debugfs.c:236:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized] 236 | if (!strcmp(arg, "on")) { | ^~~~~~~~~~~~~~~~~~ kernel/kcsan/debugfs.c:256:6: note: uninitialized use occurs here 256 | if (ret < 0) | ^~~ kernel/kcsan/debugfs.c:236:2: note: remove the 'if' if its condition is always false 236 | if (!strcmp(arg, "on")) { | ^~~~~~~~~~~~~~~~~~~~~~~~~ 237 | WRITE_ONCE(kcsan_enabled, true); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | } else if (!strcmp(arg, "off")) { | ~~~~~~ kernel/kcsan/debugfs.c:229:13: note: initialize the variable 'ret' to silence this warning 229 | ssize_t ret; | ^ | = 0 3 warnings generated. vim +243 kernel/kcsan/debugfs.c dfd402a4c4baae Marco Elver 2019-11-14 222 5cbaefe9743bf1 Ingo Molnar 2019-11-20 223 static ssize_t 5cbaefe9743bf1 Ingo Molnar 2019-11-20 224 debugfs_write(struct file *file, const char __user *buf, size_t count, loff_t *off) dfd402a4c4baae Marco Elver 2019-11-14 225 { dfd402a4c4baae Marco Elver 2019-11-14 226 char kbuf[KSYM_NAME_LEN]; dfd402a4c4baae Marco Elver 2019-11-14 227 char *arg; 43d631bf06ec96 Thorsten Blum 2024-06-24 228 const size_t read_len = min(count, sizeof(kbuf) - 1); 52313281c8b7ca Ran Xiaokai 2024-09-25 229 ssize_t ret; dfd402a4c4baae Marco Elver 2019-11-14 230 dfd402a4c4baae Marco Elver 2019-11-14 231 if (copy_from_user(kbuf, buf, read_len)) dfd402a4c4baae Marco Elver 2019-11-14 232 return -EFAULT; dfd402a4c4baae Marco Elver 2019-11-14 233 kbuf[read_len] = '\0'; dfd402a4c4baae Marco Elver 2019-11-14 234 arg = strstrip(kbuf); dfd402a4c4baae Marco Elver 2019-11-14 235 dfd402a4c4baae Marco Elver 2019-11-14 236 if (!strcmp(arg, "on")) { dfd402a4c4baae Marco Elver 2019-11-14 237 WRITE_ONCE(kcsan_enabled, true); dfd402a4c4baae Marco Elver 2019-11-14 @238 } else if (!strcmp(arg, "off")) { dfd402a4c4baae Marco Elver 2019-11-14 239 WRITE_ONCE(kcsan_enabled, false); a4e74fa5f0d3e2 Marco Elver 2020-07-31 240 } else if (str_has_prefix(arg, "microbench=")) { dfd402a4c4baae Marco Elver 2019-11-14 241 unsigned long iters; dfd402a4c4baae Marco Elver 2019-11-14 242 a4e74fa5f0d3e2 Marco Elver 2020-07-31 @243 if (kstrtoul(&arg[strlen("microbench=")], 0, &iters)) dfd402a4c4baae Marco Elver 2019-11-14 244 return -EINVAL; dfd402a4c4baae Marco Elver 2019-11-14 245 microbenchmark(iters); dfd402a4c4baae Marco Elver 2019-11-14 246 } else if (!strcmp(arg, "whitelist")) { 52313281c8b7ca Ran Xiaokai 2024-09-25 247 ret = set_report_filterlist_whitelist(true); dfd402a4c4baae Marco Elver 2019-11-14 248 } else if (!strcmp(arg, "blacklist")) { 52313281c8b7ca Ran Xiaokai 2024-09-25 249 ret = set_report_filterlist_whitelist(false); dfd402a4c4baae Marco Elver 2019-11-14 250 } else if (arg[0] == '!') { 52313281c8b7ca Ran Xiaokai 2024-09-25 251 ret = insert_report_filterlist(&arg[1]); dfd402a4c4baae Marco Elver 2019-11-14 252 } else { dfd402a4c4baae Marco Elver 2019-11-14 253 return -EINVAL; dfd402a4c4baae Marco Elver 2019-11-14 254 } dfd402a4c4baae Marco Elver 2019-11-14 255 52313281c8b7ca Ran Xiaokai 2024-09-25 256 if (ret < 0) 52313281c8b7ca Ran Xiaokai 2024-09-25 257 return ret; 52313281c8b7ca Ran Xiaokai 2024-09-25 258 else dfd402a4c4baae Marco Elver 2019-11-14 259 return count; dfd402a4c4baae Marco Elver 2019-11-14 260 } dfd402a4c4baae Marco Elver 2019-11-14 261 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
© 2016 - 2024 Red Hat, Inc.