kernel/trace/ftrace.c:6357:25: sparse: sparse: incorrect type in assignment (different address spaces)

From: kernel test robot

Date: Sun Jun 14 2026 - 18:59:09 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 8cd9520d35a6c38db6567e97dd93b1f11f185dc6
commit: 05dc5e9c1fe156fd9dddc4c2f81e8fc6c7e50eb5 ftrace: Add update_ftrace_direct_add function
date: 5 months ago
config: arm64-randconfig-r123-20260614 (https://download.01.org/0day-ci/archive/20260615/202606150616.lbd51JvK-lkp@xxxxxxxxx/config)
compiler: aarch64-linux-gcc (GCC) 13.4.0
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260615/202606150616.lbd51JvK-lkp@xxxxxxxxx/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
| Fixes: 05dc5e9c1fe1 ("ftrace: Add update_ftrace_direct_add function")
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202606150616.lbd51JvK-lkp@xxxxxxxxx/

sparse warnings: (new ones prefixed by >>)
kernel/trace/ftrace.c:3578:46: sparse: got struct ftrace_hash *[addressable] notrace_hash
kernel/trace/ftrace.c:3583:53: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *filter_hash @@ got struct ftrace_hash *save_filter_hash @@
kernel/trace/ftrace.c:3583:53: sparse: expected struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:3583:53: sparse: got struct ftrace_hash *save_filter_hash
kernel/trace/ftrace.c:3584:54: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *notrace_hash @@ got struct ftrace_hash *save_notrace_hash @@
kernel/trace/ftrace.c:3584:54: sparse: expected struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:3584:54: sparse: got struct ftrace_hash *save_notrace_hash
kernel/trace/ftrace.c:3631:31: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *filter_hash @@ got struct ftrace_hash * @@
kernel/trace/ftrace.c:3631:31: sparse: expected struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:3631:31: sparse: got struct ftrace_hash *
kernel/trace/ftrace.c:3632:32: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *notrace_hash @@ got struct ftrace_hash * @@
kernel/trace/ftrace.c:3632:32: sparse: expected struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:3632:32: sparse: got struct ftrace_hash *
kernel/trace/ftrace.c:3647:59: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *[addressable] filter_hash @@
kernel/trace/ftrace.c:3647:59: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3647:59: sparse: got struct ftrace_hash [noderef] __rcu *[addressable] filter_hash
kernel/trace/ftrace.c:3648:59: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *[addressable] notrace_hash @@
kernel/trace/ftrace.c:3648:59: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3648:59: sparse: got struct ftrace_hash [noderef] __rcu *[addressable] notrace_hash
kernel/trace/ftrace.c:3653:43: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *[addressable] filter_hash @@
kernel/trace/ftrace.c:3653:43: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3653:43: sparse: got struct ftrace_hash [noderef] __rcu *[addressable] filter_hash
kernel/trace/ftrace.c:3654:43: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *[addressable] notrace_hash @@
kernel/trace/ftrace.c:3654:43: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3654:43: sparse: got struct ftrace_hash [noderef] __rcu *[addressable] notrace_hash
kernel/trace/ftrace.c:3656:39: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *[addressable] filter_hash @@ got struct ftrace_hash * @@
kernel/trace/ftrace.c:3656:39: sparse: expected struct ftrace_hash [noderef] __rcu *[addressable] filter_hash
kernel/trace/ftrace.c:3656:39: sparse: got struct ftrace_hash *
kernel/trace/ftrace.c:3657:40: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *[addressable] notrace_hash @@ got struct ftrace_hash * @@
kernel/trace/ftrace.c:3657:40: sparse: expected struct ftrace_hash [noderef] __rcu *[addressable] notrace_hash
kernel/trace/ftrace.c:3657:40: sparse: got struct ftrace_hash *
kernel/trace/ftrace.c:3699:48: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:3699:48: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3699:48: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:3700:48: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *notrace_hash @@
kernel/trace/ftrace.c:3700:48: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3700:48: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:3701:45: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *filter_hash @@ got struct ftrace_hash * @@
kernel/trace/ftrace.c:3701:45: sparse: expected struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:3701:45: sparse: got struct ftrace_hash *
kernel/trace/ftrace.c:3702:46: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *notrace_hash @@ got struct ftrace_hash * @@
kernel/trace/ftrace.c:3702:46: sparse: expected struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:3702:46: sparse: got struct ftrace_hash *
kernel/trace/ftrace.c:3988:14: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:3988:14: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3988:14: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:4005:22: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:4005:22: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:4005:22: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:4694:22: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *notrace_hash @@
kernel/trace/ftrace.c:4694:22: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:4694:22: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:4697:22: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:4697:22: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:4697:22: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:5108:27: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash **orig_hash @@ got struct ftrace_hash [noderef] __rcu ** @@
kernel/trace/ftrace.c:5108:27: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:5108:27: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:5110:27: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash **orig_hash @@ got struct ftrace_hash [noderef] __rcu ** @@
kernel/trace/ftrace.c:5110:27: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:5110:27: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:5490:19: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash **orig_hash @@ got struct ftrace_hash [noderef] __rcu ** @@
kernel/trace/ftrace.c:5490:19: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:5490:19: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:5634:19: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash **orig_hash @@ got struct ftrace_hash [noderef] __rcu ** @@
kernel/trace/ftrace.c:5634:19: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:5634:19: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:5640:34: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *filter_hash @@ got struct ftrace_hash *[assigned] old_hash @@
kernel/trace/ftrace.c:5640:34: sparse: expected struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:5640:34: sparse: got struct ftrace_hash *[assigned] old_hash
kernel/trace/ftrace.c:5905:27: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash **orig_hash @@ got struct ftrace_hash [noderef] __rcu ** @@
kernel/trace/ftrace.c:5905:27: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:5905:27: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:5907:27: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash **orig_hash @@ got struct ftrace_hash [noderef] __rcu ** @@
kernel/trace/ftrace.c:5907:27: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:5907:27: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:5988:50: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *static [toplevel] direct_functions @@
kernel/trace/ftrace.c:5988:50: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:5988:50: sparse: got struct ftrace_hash [noderef] __rcu *static [toplevel] direct_functions
kernel/trace/ftrace.c:5991:51: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *static [toplevel] direct_functions @@
kernel/trace/ftrace.c:5991:51: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:5991:51: sparse: got struct ftrace_hash [noderef] __rcu *static [toplevel] direct_functions
kernel/trace/ftrace.c:6007:50: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:6007:50: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:6007:50: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:6051:14: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:6051:14: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:6051:14: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:6101:19: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *free_hash @@ got struct ftrace_hash [noderef] __rcu *static [toplevel] direct_functions @@
kernel/trace/ftrace.c:6101:19: sparse: expected struct ftrace_hash *free_hash
kernel/trace/ftrace.c:6101:19: sparse: got struct ftrace_hash [noderef] __rcu *static [toplevel] direct_functions
kernel/trace/ftrace.c:6166:50: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:6166:50: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:6166:50: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:6204:52: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *static [addressable] [assigned] [toplevel] direct_functions @@
kernel/trace/ftrace.c:6204:52: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:6204:52: sparse: got struct ftrace_hash [noderef] __rcu *static [addressable] [assigned] [toplevel] direct_functions
kernel/trace/ftrace.c:6352:48: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *static [addressable] [assigned] [toplevel] direct_functions @@
kernel/trace/ftrace.c:6352:48: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:6352:48: sparse: got struct ftrace_hash [noderef] __rcu *static [addressable] [assigned] [toplevel] direct_functions
>> kernel/trace/ftrace.c:6357:25: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *old_filter_hash @@ got struct ftrace_hash [noderef] __rcu * @@
kernel/trace/ftrace.c:6357:25: sparse: expected struct ftrace_hash *old_filter_hash
kernel/trace/ftrace.c:6357:25: sparse: got struct ftrace_hash [noderef] __rcu *
kernel/trace/ftrace.c:6373:41: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *a @@ got struct ftrace_hash [noderef] __rcu *static [addressable] [assigned] [toplevel] direct_functions @@
kernel/trace/ftrace.c:6373:41: sparse: expected struct ftrace_hash *a
kernel/trace/ftrace.c:6373:41: sparse: got struct ftrace_hash [noderef] __rcu *static [addressable] [assigned] [toplevel] direct_functions
kernel/trace/ftrace.c:6377:30: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *old_direct_functions @@ got struct ftrace_hash [noderef] __rcu *static [addressable] [assigned] [toplevel] direct_functions @@
kernel/trace/ftrace.c:6377:30: sparse: expected struct ftrace_hash *old_direct_functions
kernel/trace/ftrace.c:6377:30: sparse: got struct ftrace_hash [noderef] __rcu *static [addressable] [assigned] [toplevel] direct_functions
kernel/trace/ftrace.c:6384:45: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *filter_hash @@ got struct ftrace_hash *[assigned] new_filter_hash @@
kernel/trace/ftrace.c:6384:45: sparse: expected struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:6384:45: sparse: got struct ftrace_hash *[assigned] new_filter_hash
kernel/trace/ftrace.c:6389:53: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *filter_hash @@ got struct ftrace_hash *old_filter_hash @@
kernel/trace/ftrace.c:6389:53: sparse: expected struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:6389:53: sparse: got struct ftrace_hash *old_filter_hash
kernel/trace/ftrace.c:6742:35: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash **orig_hash @@ got struct ftrace_hash [noderef] __rcu ** @@
kernel/trace/ftrace.c:6742:35: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:6742:35: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:6750:35: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash **orig_hash @@ got struct ftrace_hash [noderef] __rcu ** @@
kernel/trace/ftrace.c:6750:35: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:6750:35: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:7535:46: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:7535:46: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:7535:46: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:7536:47: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:7536:47: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:7536:47: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:7540:44: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *notrace_hash @@
kernel/trace/ftrace.c:7540:44: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:7540:44: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:7558:18: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_ops *ops @@ got struct ftrace_ops [noderef] __rcu *[addressable] [toplevel] ftrace_ops_list @@
kernel/trace/ftrace.c:7558:18: sparse: expected struct ftrace_ops *ops
kernel/trace/ftrace.c:7558:18: sparse: got struct ftrace_ops [noderef] __rcu *[addressable] [toplevel] ftrace_ops_list
kernel/trace/ftrace.c:7558:66: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_ops *ops @@ got struct ftrace_ops [noderef] __rcu *next @@
kernel/trace/ftrace.c:7558:66: sparse: expected struct ftrace_ops *ops
kernel/trace/ftrace.c:7558:66: sparse: got struct ftrace_ops [noderef] __rcu *next
kernel/trace/ftrace.c:7610:59: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:7610:59: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:7610:59: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:7611:59: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *notrace_hash @@
kernel/trace/ftrace.c:7611:59: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:7611:59: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:8000:62: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:8000:62: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:8000:62: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:8001:62: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *notrace_hash @@
kernel/trace/ftrace.c:8001:62: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:8001:62: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:8045:36: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/trace/ftrace.c:8045:36: sparse: struct ftrace_ops [noderef] __rcu *
kernel/trace/ftrace.c:8045:36: sparse: struct ftrace_ops *
kernel/trace/ftrace.c:8821:14: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:8821:14: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:8821:14: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:8870:14: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:8870:14: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:8870:14: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:230:20: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:230:20: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:230:20: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3475:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3475:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3475:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3475:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3475:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3475:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3509:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3509:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3509:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3509:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3509:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3509:29: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:6069:30: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:6078:21: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:6080:17: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:3780:48: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:3780:48: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3780:48: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:3781:49: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_hash *hash @@ got struct ftrace_hash [noderef] __rcu *notrace_hash @@
kernel/trace/ftrace.c:3781:49: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3781:49: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash

vim +6357 kernel/trace/ftrace.c

6162
6163 static int
6164 __modify_ftrace_direct(struct ftrace_ops *ops, unsigned long addr)
6165 {
> 6166 struct ftrace_hash *hash = ops->func_hash->filter_hash;
6167 struct ftrace_func_entry *entry, *iter;
6168 static struct ftrace_ops tmp_ops = {
6169 .func = ftrace_stub,
6170 .flags = FTRACE_OPS_FL_STUB,
6171 };
6172 int i, size;
6173 int err;
6174
6175 lockdep_assert_held_once(&direct_mutex);
6176
6177 /* Enable the tmp_ops to have the same functions as the direct ops */
6178 ftrace_ops_init(&tmp_ops);
6179 tmp_ops.func_hash = ops->func_hash;
6180 tmp_ops.direct_call = addr;
6181
6182 err = register_ftrace_function_nolock(&tmp_ops);
6183 if (err)
6184 return err;
6185
6186 /*
6187 * Call __ftrace_hash_update_ipmodify() here, so that we can call
6188 * ops->ops_func for the ops. This is needed because the above
6189 * register_ftrace_function_nolock() worked on tmp_ops.
6190 */
6191 err = __ftrace_hash_update_ipmodify(ops, hash, hash, true);
6192 if (err)
6193 goto out;
6194
6195 /*
6196 * Now the ftrace_ops_list_func() is called to do the direct callers.
6197 * We can safely change the direct functions attached to each entry.
6198 */
6199 mutex_lock(&ftrace_lock);
6200
6201 size = 1 << hash->size_bits;
6202 for (i = 0; i < size; i++) {
6203 hlist_for_each_entry(iter, &hash->buckets[i], hlist) {
6204 entry = __ftrace_lookup_ip(direct_functions, iter->ip);
6205 if (!entry)
6206 continue;
6207 entry->direct = addr;
6208 }
6209 }
6210 /* Prevent store tearing if a trampoline concurrently accesses the value */
6211 WRITE_ONCE(ops->direct_call, addr);
6212
6213 mutex_unlock(&ftrace_lock);
6214
6215 out:
6216 /* Removing the tmp_ops will add the updated direct callers to the functions */
6217 unregister_ftrace_function(&tmp_ops);
6218
6219 return err;
6220 }
6221
6222 /**
6223 * modify_ftrace_direct_nolock - Modify an existing direct 'multi' call
6224 * to call something else
6225 * @ops: The address of the struct ftrace_ops object
6226 * @addr: The address of the new trampoline to call at @ops functions
6227 *
6228 * This is used to unregister currently registered direct caller and
6229 * register new one @addr on functions registered in @ops object.
6230 *
6231 * Note there's window between ftrace_shutdown and ftrace_startup calls
6232 * where there will be no callbacks called.
6233 *
6234 * Caller should already have direct_mutex locked, so we don't lock
6235 * direct_mutex here.
6236 *
6237 * Returns: zero on success. Non zero on error, which includes:
6238 * -EINVAL - The @ops object was not properly registered.
6239 */
6240 int modify_ftrace_direct_nolock(struct ftrace_ops *ops, unsigned long addr)
6241 {
6242 if (check_direct_multi(ops))
6243 return -EINVAL;
6244 if (!(ops->flags & FTRACE_OPS_FL_ENABLED))
6245 return -EINVAL;
6246
6247 return __modify_ftrace_direct(ops, addr);
6248 }
6249 EXPORT_SYMBOL_GPL(modify_ftrace_direct_nolock);
6250
6251 /**
6252 * modify_ftrace_direct - Modify an existing direct 'multi' call
6253 * to call something else
6254 * @ops: The address of the struct ftrace_ops object
6255 * @addr: The address of the new trampoline to call at @ops functions
6256 *
6257 * This is used to unregister currently registered direct caller and
6258 * register new one @addr on functions registered in @ops object.
6259 *
6260 * Note there's window between ftrace_shutdown and ftrace_startup calls
6261 * where there will be no callbacks called.
6262 *
6263 * Returns: zero on success. Non zero on error, which includes:
6264 * -EINVAL - The @ops object was not properly registered.
6265 */
6266 int modify_ftrace_direct(struct ftrace_ops *ops, unsigned long addr)
6267 {
6268 int err;
6269
6270 if (check_direct_multi(ops))
6271 return -EINVAL;
6272 if (!(ops->flags & FTRACE_OPS_FL_ENABLED))
6273 return -EINVAL;
6274
6275 mutex_lock(&direct_mutex);
6276 err = __modify_ftrace_direct(ops, addr);
6277 mutex_unlock(&direct_mutex);
6278 return err;
6279 }
6280 EXPORT_SYMBOL_GPL(modify_ftrace_direct);
6281
6282 static unsigned long hash_count(struct ftrace_hash *hash)
6283 {
6284 return hash ? hash->count : 0;
6285 }
6286
6287 /**
6288 * hash_add - adds two struct ftrace_hash and returns the result
6289 * @a: struct ftrace_hash object
6290 * @b: struct ftrace_hash object
6291 *
6292 * Returns struct ftrace_hash object on success, NULL on error.
6293 */
6294 static struct ftrace_hash *hash_add(struct ftrace_hash *a, struct ftrace_hash *b)
6295 {
6296 struct ftrace_func_entry *entry;
6297 struct ftrace_hash *add;
6298 int size;
6299
6300 size = hash_count(a) + hash_count(b);
6301 if (size > 32)
6302 size = 32;
6303
6304 add = alloc_and_copy_ftrace_hash(fls(size), a);
6305 if (!add)
6306 return NULL;
6307
6308 size = 1 << b->size_bits;
6309 for (int i = 0; i < size; i++) {
6310 hlist_for_each_entry(entry, &b->buckets[i], hlist) {
6311 if (add_ftrace_hash_entry_direct(add, entry->ip, entry->direct) == NULL) {
6312 free_ftrace_hash(add);
6313 return NULL;
6314 }
6315 }
6316 }
6317 return add;
6318 }
6319
6320 /**
6321 * update_ftrace_direct_add - Updates @ops by adding direct
6322 * callers provided in @hash
6323 * @ops: The address of the struct ftrace_ops object
6324 * @hash: The address of the struct ftrace_hash object
6325 *
6326 * This is used to add custom direct callers (ip -> addr) to @ops,
6327 * specified in @hash. The @ops will be either registered or updated.
6328 *
6329 * Returns: zero on success. Non zero on error, which includes:
6330 * -EINVAL - The @hash is empty
6331 */
6332 int update_ftrace_direct_add(struct ftrace_ops *ops, struct ftrace_hash *hash)
6333 {
6334 struct ftrace_hash *old_direct_functions = NULL;
6335 struct ftrace_hash *new_direct_functions;
6336 struct ftrace_hash *old_filter_hash;
6337 struct ftrace_hash *new_filter_hash = NULL;
6338 struct ftrace_func_entry *entry;
6339 int err = -EINVAL;
6340 int size;
6341 bool reg;
6342
6343 if (!hash_count(hash))
6344 return -EINVAL;
6345
6346 mutex_lock(&direct_mutex);
6347
6348 /* Make sure requested entries are not already registered. */
6349 size = 1 << hash->size_bits;
6350 for (int i = 0; i < size; i++) {
6351 hlist_for_each_entry(entry, &hash->buckets[i], hlist) {
6352 if (__ftrace_lookup_ip(direct_functions, entry->ip))
6353 goto out_unlock;
6354 }
6355 }
6356
> 6357 old_filter_hash = ops->func_hash ? ops->func_hash->filter_hash : NULL;
6358
6359 /* If there's nothing in filter_hash we need to register the ops. */
6360 reg = hash_count(old_filter_hash) == 0;
6361 if (reg) {
6362 if (ops->func || ops->trampoline)
6363 goto out_unlock;
6364 if (ops->flags & FTRACE_OPS_FL_ENABLED)
6365 goto out_unlock;
6366 }
6367
6368 err = -ENOMEM;
6369 new_filter_hash = hash_add(old_filter_hash, hash);
6370 if (!new_filter_hash)
6371 goto out_unlock;
6372
6373 new_direct_functions = hash_add(direct_functions, hash);
6374 if (!new_direct_functions)
6375 goto out_unlock;
6376
6377 old_direct_functions = direct_functions;
6378 rcu_assign_pointer(direct_functions, new_direct_functions);
6379
6380 if (reg) {
6381 ops->func = call_direct_funcs;
6382 ops->flags |= MULTI_FLAGS;
6383 ops->trampoline = FTRACE_REGS_ADDR;
6384 ops->local_hash.filter_hash = new_filter_hash;
6385
6386 err = register_ftrace_function_nolock(ops);
6387 if (err) {
6388 /* restore old filter on error */
6389 ops->local_hash.filter_hash = old_filter_hash;
6390
6391 /* cleanup for possible another register call */
6392 ops->func = NULL;
6393 ops->trampoline = 0;
6394 } else {
6395 new_filter_hash = old_filter_hash;
6396 }
6397 } else {
6398 err = ftrace_update_ops(ops, new_filter_hash, EMPTY_HASH);
6399 /*
6400 * new_filter_hash is dup-ed, so we need to release it anyway,
6401 * old_filter_hash either stays on error or is already released
6402 */
6403 }
6404
6405 if (err) {
6406 /* reset direct_functions and free the new one */
6407 rcu_assign_pointer(direct_functions, old_direct_functions);
6408 old_direct_functions = new_direct_functions;
6409 }
6410
6411 out_unlock:
6412 mutex_unlock(&direct_mutex);
6413
6414 if (old_direct_functions && old_direct_functions != EMPTY_HASH)
6415 call_rcu_tasks(&old_direct_functions->rcu, register_ftrace_direct_cb);
6416 free_ftrace_hash(new_filter_hash);
6417
6418 return err;
6419 }
6420

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