Hi Steven,

kernel test robot noticed the following build warnings:

[auto build test WARNING on trace/for-next]
[also build test WARNING on linus/master v6.16 next-20250806]
[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/Steven-Rostedt/tracing-Replace-syscall-RCU-pointer-assignment-with-READ-WRITE_ONCE/20250806-122312
base:   https://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace 
for-next
patch link:    https://lore.kernel.org/r/20250805193235.582013098%40kernel.org
patch subject: [PATCH 6/7] tracing: Allow syscall trace events to read more 
than one user parameter
config: x86_64-randconfig-123-20250806 
(https://download.01.org/0day-ci/archive/20250807/[email protected]/config)
compiler: gcc-12 (Debian 12.2.0-14+deb12u1) 12.2.0
reproduce (this is a W=1 build): 
(https://download.01.org/0day-ci/archive/20250807/[email protected]/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 <[email protected]>
| Closes: 
https://lore.kernel.org/oe-kbuild-all/[email protected]/

sparse warnings: (new ones prefixed by >>)
>> kernel/trace/trace_syscalls.c:620:53: sparse: sparse: incorrect type in 
>> argument 2 (different address spaces) @@     expected void const [noderef] 
>> __user *from @@     got char *ptr @@
   kernel/trace/trace_syscalls.c:620:53: sparse:     expected void const 
[noderef] __user *from
   kernel/trace/trace_syscalls.c:620:53: sparse:     got char *ptr
>> kernel/trace/trace_syscalls.c:623:54: sparse: sparse: incorrect type in 
>> argument 2 (different address spaces) @@     expected char const [noderef] 
>> __user *src @@     got char *ptr @@
   kernel/trace/trace_syscalls.c:623:54: sparse:     expected char const 
[noderef] __user *src
   kernel/trace/trace_syscalls.c:623:54: sparse:     got char *ptr
   kernel/trace/trace_syscalls.c:707:20: sparse: sparse: incorrect type in 
assignment (different address spaces) @@     expected struct trace_event_file 
*trace_file @@     got struct trace_event_file [noderef] __rcu * @@
   kernel/trace/trace_syscalls.c:707:20: sparse:     expected struct 
trace_event_file *trace_file
   kernel/trace/trace_syscalls.c:707:20: sparse:     got struct 
trace_event_file [noderef] __rcu *
   kernel/trace/trace_syscalls.c:824:20: sparse: sparse: incorrect type in 
assignment (different address spaces) @@     expected struct trace_event_file 
*trace_file @@     got struct trace_event_file [noderef] __rcu * @@
   kernel/trace/trace_syscalls.c:824:20: sparse:     expected struct 
trace_event_file *trace_file
   kernel/trace/trace_syscalls.c:824:20: sparse:     got struct 
trace_event_file [noderef] __rcu *
   kernel/trace/trace_syscalls.c:871:9: sparse: sparse: incorrect type in 
assignment (different address spaces) @@     expected struct trace_event_file 
[noderef] __rcu *volatile @@     got struct trace_event_file *file @@
   kernel/trace/trace_syscalls.c:871:9: sparse:     expected struct 
trace_event_file [noderef] __rcu *volatile
   kernel/trace/trace_syscalls.c:871:9: sparse:     got struct trace_event_file 
*file
   kernel/trace/trace_syscalls.c:909:17: sparse: sparse: incorrect type in 
assignment (different address spaces) @@     expected struct trace_event_file 
[noderef] __rcu *volatile @@     got struct trace_event_file *file @@
   kernel/trace/trace_syscalls.c:909:17: sparse:     expected struct 
trace_event_file [noderef] __rcu *volatile
   kernel/trace/trace_syscalls.c:909:17: sparse:     got struct 
trace_event_file *file

vim +620 kernel/trace/trace_syscalls.c

6bc850d6f8f730 Steven Rostedt 2025-08-05  526  
623bd9e046f95c Steven Rostedt 2025-08-05  527  static char 
*sys_fault_user(struct syscall_metadata *sys_data,
623bd9e046f95c Steven Rostedt 2025-08-05  528                       struct 
syscall_buf_info *sinfo,
623bd9e046f95c Steven Rostedt 2025-08-05  529                       unsigned 
long *args,
623bd9e046f95c Steven Rostedt 2025-08-05  530                       unsigned 
int data_size[SYSCALL_FAULT_MAX_CNT])
6bc850d6f8f730 Steven Rostedt 2025-08-05  531  {
623bd9e046f95c Steven Rostedt 2025-08-05  532   char *buffer = 
per_cpu_ptr(sinfo->sbuf, smp_processor_id())->buf;
6bc850d6f8f730 Steven Rostedt 2025-08-05  533   unsigned long mask = 
sys_data->user_mask;
623bd9e046f95c Steven Rostedt 2025-08-05  534   unsigned long size = 
SYSCALL_FAULT_ARG_SZ - 1;
6bc850d6f8f730 Steven Rostedt 2025-08-05  535   unsigned int cnt;
b979d33ec48bbd Steven Rostedt 2025-08-05  536   bool array = false;
623bd9e046f95c Steven Rostedt 2025-08-05  537   char 
*ptr_array[SYSCALL_FAULT_MAX_CNT];
623bd9e046f95c Steven Rostedt 2025-08-05  538   char *buf;
623bd9e046f95c Steven Rostedt 2025-08-05  539   int read[SYSCALL_FAULT_MAX_CNT];
6bc850d6f8f730 Steven Rostedt 2025-08-05  540   int trys = 0;
623bd9e046f95c Steven Rostedt 2025-08-05  541   int uargs;
6bc850d6f8f730 Steven Rostedt 2025-08-05  542   int ret;
623bd9e046f95c Steven Rostedt 2025-08-05  543   int i = 0;
623bd9e046f95c Steven Rostedt 2025-08-05  544  
623bd9e046f95c Steven Rostedt 2025-08-05  545   /* The extra is appended to the 
user data in the buffer */
623bd9e046f95c Steven Rostedt 2025-08-05  546   
BUILD_BUG_ON(SYSCALL_FAULT_USER_MAX + sizeof(EXTRA) >=
623bd9e046f95c Steven Rostedt 2025-08-05  547                
SYSCALL_FAULT_ARG_SZ);
623bd9e046f95c Steven Rostedt 2025-08-05  548  
623bd9e046f95c Steven Rostedt 2025-08-05  549   /*
623bd9e046f95c Steven Rostedt 2025-08-05  550    * If this system call event 
has a size argument, use
623bd9e046f95c Steven Rostedt 2025-08-05  551    * it to define how much of 
user space memory to read,
623bd9e046f95c Steven Rostedt 2025-08-05  552    * and read it as an array and 
not a string.
623bd9e046f95c Steven Rostedt 2025-08-05  553    */
623bd9e046f95c Steven Rostedt 2025-08-05  554   if (sys_data->user_arg_size >= 
0) {
623bd9e046f95c Steven Rostedt 2025-08-05  555           array = true;
623bd9e046f95c Steven Rostedt 2025-08-05  556           size = 
args[sys_data->user_arg_size];
623bd9e046f95c Steven Rostedt 2025-08-05  557           if (size > 
SYSCALL_FAULT_ARG_SZ - 1)
623bd9e046f95c Steven Rostedt 2025-08-05  558                   size = 
SYSCALL_FAULT_ARG_SZ - 1;
623bd9e046f95c Steven Rostedt 2025-08-05  559   }
623bd9e046f95c Steven Rostedt 2025-08-05  560  
623bd9e046f95c Steven Rostedt 2025-08-05  561   while (mask) {
623bd9e046f95c Steven Rostedt 2025-08-05  562           int idx = ffs(mask) - 1;
623bd9e046f95c Steven Rostedt 2025-08-05  563           mask &= ~BIT(idx);
623bd9e046f95c Steven Rostedt 2025-08-05  564  
623bd9e046f95c Steven Rostedt 2025-08-05  565           if (WARN_ON_ONCE(i == 
SYSCALL_FAULT_MAX_CNT))
623bd9e046f95c Steven Rostedt 2025-08-05  566                   break;
6bc850d6f8f730 Steven Rostedt 2025-08-05  567  
6bc850d6f8f730 Steven Rostedt 2025-08-05  568           /* Get the pointer to 
user space memory to read */
623bd9e046f95c Steven Rostedt 2025-08-05  569           ptr_array[i++] = (char 
*)args[idx];
623bd9e046f95c Steven Rostedt 2025-08-05  570   }
623bd9e046f95c Steven Rostedt 2025-08-05  571  
623bd9e046f95c Steven Rostedt 2025-08-05  572   uargs = i;
623bd9e046f95c Steven Rostedt 2025-08-05  573  
623bd9e046f95c Steven Rostedt 2025-08-05  574   /* Clear the values that are 
not used */
623bd9e046f95c Steven Rostedt 2025-08-05  575   for (; i < 
SYSCALL_FAULT_MAX_CNT; i++) {
623bd9e046f95c Steven Rostedt 2025-08-05  576           data_size[i] = -1; /* 
Denotes no pointer */
623bd9e046f95c Steven Rostedt 2025-08-05  577   }
6bc850d6f8f730 Steven Rostedt 2025-08-05  578  
6bc850d6f8f730 Steven Rostedt 2025-08-05  579   again:
6bc850d6f8f730 Steven Rostedt 2025-08-05  580   /*
6bc850d6f8f730 Steven Rostedt 2025-08-05  581    * If this task is preempted by 
another user space task, it
6bc850d6f8f730 Steven Rostedt 2025-08-05  582    * will cause this task to try 
again. But just in case something
6bc850d6f8f730 Steven Rostedt 2025-08-05  583    * changes where the copying 
from user space causes another task
6bc850d6f8f730 Steven Rostedt 2025-08-05  584    * to run, prevent this from 
going into an infinite loop.
6bc850d6f8f730 Steven Rostedt 2025-08-05  585    * 10 tries should be plenty.
6bc850d6f8f730 Steven Rostedt 2025-08-05  586    */
6bc850d6f8f730 Steven Rostedt 2025-08-05  587   if (trys++ > 10) {
6bc850d6f8f730 Steven Rostedt 2025-08-05  588           static bool once;
6bc850d6f8f730 Steven Rostedt 2025-08-05  589           /*
6bc850d6f8f730 Steven Rostedt 2025-08-05  590            * Only print a message 
instead of a WARN_ON() as this could
6bc850d6f8f730 Steven Rostedt 2025-08-05  591            * theoretically 
trigger under real load.
6bc850d6f8f730 Steven Rostedt 2025-08-05  592            */
6bc850d6f8f730 Steven Rostedt 2025-08-05  593           if (!once)
6bc850d6f8f730 Steven Rostedt 2025-08-05  594                   pr_warn("Error: 
Too many tries to read syscall %s\n", sys_data->name);
6bc850d6f8f730 Steven Rostedt 2025-08-05  595           once = true;
623bd9e046f95c Steven Rostedt 2025-08-05  596           return buffer;
6bc850d6f8f730 Steven Rostedt 2025-08-05  597   }
6bc850d6f8f730 Steven Rostedt 2025-08-05  598  
6bc850d6f8f730 Steven Rostedt 2025-08-05  599   /* Read the current sched 
switch count */
6bc850d6f8f730 Steven Rostedt 2025-08-05  600   cnt = 
this_cpu_read(sched_switch_cnt);
6bc850d6f8f730 Steven Rostedt 2025-08-05  601  
6bc850d6f8f730 Steven Rostedt 2025-08-05  602   /*
6bc850d6f8f730 Steven Rostedt 2025-08-05  603    * Preemption is going to be 
enabled, but this task must
6bc850d6f8f730 Steven Rostedt 2025-08-05  604    * remain on this CPU.
6bc850d6f8f730 Steven Rostedt 2025-08-05  605    */
6bc850d6f8f730 Steven Rostedt 2025-08-05  606   migrate_disable();
6bc850d6f8f730 Steven Rostedt 2025-08-05  607  
6bc850d6f8f730 Steven Rostedt 2025-08-05  608   /*
6bc850d6f8f730 Steven Rostedt 2025-08-05  609    * Now preemption is being 
enabed and another task can come in
6bc850d6f8f730 Steven Rostedt 2025-08-05  610    * and use the same buffer and 
corrupt our data.
6bc850d6f8f730 Steven Rostedt 2025-08-05  611    */
6bc850d6f8f730 Steven Rostedt 2025-08-05  612   preempt_enable_notrace();
6bc850d6f8f730 Steven Rostedt 2025-08-05  613  
623bd9e046f95c Steven Rostedt 2025-08-05  614   buf = buffer;
623bd9e046f95c Steven Rostedt 2025-08-05  615  
623bd9e046f95c Steven Rostedt 2025-08-05  616   for (i = 0; i < uargs; i++, buf 
+= SYSCALL_FAULT_ARG_SZ) {
623bd9e046f95c Steven Rostedt 2025-08-05  617           char *ptr = 
ptr_array[i];
623bd9e046f95c Steven Rostedt 2025-08-05  618  
b979d33ec48bbd Steven Rostedt 2025-08-05  619           if (array) {
b979d33ec48bbd Steven Rostedt 2025-08-05 @620                   ret = 
__copy_from_user(buf, ptr, size);
b979d33ec48bbd Steven Rostedt 2025-08-05  621                   ret = ret ? -1 
: size;
b979d33ec48bbd Steven Rostedt 2025-08-05  622           } else {
6bc850d6f8f730 Steven Rostedt 2025-08-05 @623                   ret = 
strncpy_from_user(buf, ptr, size);
b979d33ec48bbd Steven Rostedt 2025-08-05  624           }
623bd9e046f95c Steven Rostedt 2025-08-05  625           read[i] = ret;
623bd9e046f95c Steven Rostedt 2025-08-05  626   }
6bc850d6f8f730 Steven Rostedt 2025-08-05  627  
6bc850d6f8f730 Steven Rostedt 2025-08-05  628   preempt_disable_notrace();
6bc850d6f8f730 Steven Rostedt 2025-08-05  629   migrate_enable();
6bc850d6f8f730 Steven Rostedt 2025-08-05  630  
6bc850d6f8f730 Steven Rostedt 2025-08-05  631   /*
6bc850d6f8f730 Steven Rostedt 2025-08-05  632    * Preemption is disabled 
again, now check the sched_switch_cnt.
6bc850d6f8f730 Steven Rostedt 2025-08-05  633    * If it increased by two or 
more, then another user space process
6bc850d6f8f730 Steven Rostedt 2025-08-05  634    * may have schedule in and 
corrupted our buffer. In that case
6bc850d6f8f730 Steven Rostedt 2025-08-05  635    * the copying must be retried.
6bc850d6f8f730 Steven Rostedt 2025-08-05  636    *
6bc850d6f8f730 Steven Rostedt 2025-08-05  637    * Note, if this task was 
scheduled out and only kernel threads
6bc850d6f8f730 Steven Rostedt 2025-08-05  638    * were scheduled in (maybe to 
process the fault), then the
6bc850d6f8f730 Steven Rostedt 2025-08-05  639    * counter would increment 
again when this task scheduled in.
6bc850d6f8f730 Steven Rostedt 2025-08-05  640    * If this task scheduled out 
and another user task scheduled
6bc850d6f8f730 Steven Rostedt 2025-08-05  641    * in, this task would still 
need to be scheduled back in and
6bc850d6f8f730 Steven Rostedt 2025-08-05  642    * the counter would increment 
by at least two.
6bc850d6f8f730 Steven Rostedt 2025-08-05  643    */
6bc850d6f8f730 Steven Rostedt 2025-08-05  644   if 
(this_cpu_read(sched_switch_cnt) > cnt + 1)
6bc850d6f8f730 Steven Rostedt 2025-08-05  645           goto again;
6bc850d6f8f730 Steven Rostedt 2025-08-05  646  
623bd9e046f95c Steven Rostedt 2025-08-05  647   buf = buffer;
623bd9e046f95c Steven Rostedt 2025-08-05  648   for (i = 0; i < uargs; i++, buf 
+= SYSCALL_FAULT_ARG_SZ) {
623bd9e046f95c Steven Rostedt 2025-08-05  649  
623bd9e046f95c Steven Rostedt 2025-08-05  650           ret = read[i];
623bd9e046f95c Steven Rostedt 2025-08-05  651           if (ret < 0)
623bd9e046f95c Steven Rostedt 2025-08-05  652                   continue;
623bd9e046f95c Steven Rostedt 2025-08-05  653           buf[ret] = '\0';
623bd9e046f95c Steven Rostedt 2025-08-05  654  
b979d33ec48bbd Steven Rostedt 2025-08-05  655           /* For strings, replace 
any non-printable characters with '.' */
b979d33ec48bbd Steven Rostedt 2025-08-05  656           if (!array) {
623bd9e046f95c Steven Rostedt 2025-08-05  657                   for (int x = 0; 
x < ret; x++) {
623bd9e046f95c Steven Rostedt 2025-08-05  658                           if 
(!isprint(buf[x]))
623bd9e046f95c Steven Rostedt 2025-08-05  659                                   
buf[x] = '.';
6bc850d6f8f730 Steven Rostedt 2025-08-05  660                   }
6bc850d6f8f730 Steven Rostedt 2025-08-05  661  
6bc850d6f8f730 Steven Rostedt 2025-08-05  662                   /*
623bd9e046f95c Steven Rostedt 2025-08-05  663                    * If the text 
was truncated due to our max limit,
623bd9e046f95c Steven Rostedt 2025-08-05  664                    * add "..." to 
the string.
6bc850d6f8f730 Steven Rostedt 2025-08-05  665                    */
623bd9e046f95c Steven Rostedt 2025-08-05  666                   if (ret > 
SYSCALL_FAULT_USER_MAX) {
623bd9e046f95c Steven Rostedt 2025-08-05  667                           
strscpy(buf + SYSCALL_FAULT_USER_MAX, EXTRA,
623bd9e046f95c Steven Rostedt 2025-08-05  668                                   
sizeof(EXTRA));
623bd9e046f95c Steven Rostedt 2025-08-05  669                           ret = 
SYSCALL_FAULT_USER_MAX + sizeof(EXTRA);
6bc850d6f8f730 Steven Rostedt 2025-08-05  670                   } else {
6bc850d6f8f730 Steven Rostedt 2025-08-05  671                           
buf[ret++] = '\0';
6bc850d6f8f730 Steven Rostedt 2025-08-05  672                   }
623bd9e046f95c Steven Rostedt 2025-08-05  673           } else {
623bd9e046f95c Steven Rostedt 2025-08-05  674                   ret = min(ret, 
SYSCALL_FAULT_USER_MAX);
623bd9e046f95c Steven Rostedt 2025-08-05  675           }
623bd9e046f95c Steven Rostedt 2025-08-05  676           data_size[i] = ret;
b979d33ec48bbd Steven Rostedt 2025-08-05  677   }
6bc850d6f8f730 Steven Rostedt 2025-08-05  678  
623bd9e046f95c Steven Rostedt 2025-08-05  679   return buffer;
6bc850d6f8f730 Steven Rostedt 2025-08-05  680  }
6bc850d6f8f730 Steven Rostedt 2025-08-05  681  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

Reply via email to