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

From: kernel test robot
Date: Sat Dec 23 2023 - 10:22:05 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 5254c0cbc92d2a08e75443bdb914f1c4839cdf5a
commit: 3306fc4aff464f9c08c8899695a218f4b1125d4a ftrace: Create new ftrace_internal.h header
date: 5 years ago
config: i386-randconfig-061-20231101 (https://download.01.org/0day-ci/archive/20231223/202312232303.ywYrcraO-lkp@xxxxxxxxx/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231223/202312232303.ywYrcraO-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
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202312232303.ywYrcraO-lkp@xxxxxxxxx/

sparse warnings: (new ones prefixed by >>)
kernel/trace/ftrace.c:118:59: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct ftrace_ops [noderef] __rcu *[addressable] [toplevel] ftrace_ops_list @@ got struct ftrace_ops * @@
kernel/trace/ftrace.c:118:59: sparse: expected struct ftrace_ops [noderef] __rcu *[addressable] [toplevel] ftrace_ops_list
kernel/trace/ftrace.c:118:59: sparse: got struct ftrace_ops *
kernel/trace/ftrace.c:212:49: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct ftrace_ops *ops @@ got struct ftrace_ops [noderef] __rcu *[addressable] [toplevel] ftrace_ops_list @@
kernel/trace/ftrace.c:212:49: sparse: expected struct ftrace_ops *ops
kernel/trace/ftrace.c:212:49: sparse: got struct ftrace_ops [noderef] __rcu *[addressable] [toplevel] ftrace_ops_list
kernel/trace/ftrace.c:295:23: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_ops [noderef] __rcu * @@ got struct ftrace_ops * @@
kernel/trace/ftrace.c:295:23: sparse: expected struct ftrace_ops [noderef] __rcu *
kernel/trace/ftrace.c:295:23: sparse: got struct ftrace_ops *
kernel/trace/ftrace.c:299:16: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_ops **p @@ got struct ftrace_ops [noderef] __rcu **list @@
kernel/trace/ftrace.c:299:16: sparse: expected struct ftrace_ops **p
kernel/trace/ftrace.c:299:16: sparse: got struct ftrace_ops [noderef] __rcu **list
kernel/trace/ftrace.c:299:50: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_ops **p @@ got struct ftrace_ops [noderef] __rcu ** @@
kernel/trace/ftrace.c:299:50: sparse: expected struct ftrace_ops **p
kernel/trace/ftrace.c:299:50: sparse: got struct ftrace_ops [noderef] __rcu **
kernel/trace/ftrace.c:306:12: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_ops * @@ got struct ftrace_ops [noderef] __rcu *next @@
kernel/trace/ftrace.c:306:12: sparse: expected struct ftrace_ops *
kernel/trace/ftrace.c:306:12: sparse: got struct ftrace_ops [noderef] __rcu *next
kernel/trace/ftrace.c:592:5: sparse: sparse: symbol 'ftrace_profile_pages_init' was not declared. Should it be static?
kernel/trace/ftrace.c:1045:43: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *notrace_hash @@ got struct ftrace_hash * @@
kernel/trace/ftrace.c:1045:43: sparse: expected struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:1045:43: sparse: got struct ftrace_hash *
kernel/trace/ftrace.c:1046:43: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct ftrace_hash [noderef] __rcu *filter_hash @@ got struct ftrace_hash * @@
kernel/trace/ftrace.c:1046:43: sparse: expected struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:1046:43: sparse: got struct ftrace_hash *
kernel/trace/ftrace.c:1268:40: 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:1268:40: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:1268:40: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:1269:40: 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:1269:40: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:1269:40: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:1930:54: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct ftrace_hash *old_hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:1930:54: sparse: expected struct ftrace_hash *old_hash
kernel/trace/ftrace.c:1930:54: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:1445:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/trace/ftrace.c:1445:9: sparse: struct ftrace_hash [noderef] __rcu *
kernel/trace/ftrace.c:1445:9: sparse: struct ftrace_hash *
kernel/trace/ftrace.c:1445:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/trace/ftrace.c:1445:9: sparse: struct ftrace_hash [noderef] __rcu *
kernel/trace/ftrace.c:1445:9: sparse: struct ftrace_hash *
kernel/trace/ftrace.c:1461:39: 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:1461:39: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:1461:39: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:1462:40: 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:1462:40: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:1462:40: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:1463:40: 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:1463:40: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:1463:40: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:1464:42: 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:1464:42: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:1464:42: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
>> kernel/trace/ftrace.c:1608: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:1608:18: sparse: expected struct ftrace_ops *ops
kernel/trace/ftrace.c:1608:18: sparse: got struct ftrace_ops [noderef] __rcu *[addressable] [toplevel] ftrace_ops_list
kernel/trace/ftrace.c:1609:43: 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:1609:43: sparse: expected struct ftrace_ops *ops
kernel/trace/ftrace.c:1609:43: sparse: got struct ftrace_ops [noderef] __rcu *next
kernel/trace/ftrace.c:1650: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:1650:22: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:1650:22: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:1651:28: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *other_hash @@ got struct ftrace_hash [noderef] __rcu *notrace_hash @@
kernel/trace/ftrace.c:1651:28: sparse: expected struct ftrace_hash *other_hash
kernel/trace/ftrace.c:1651:28: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:1656: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:1656:22: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:1656:22: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:1657:28: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct ftrace_hash *other_hash @@ got struct ftrace_hash [noderef] __rcu *filter_hash @@
kernel/trace/ftrace.c:1657:28: sparse: expected struct ftrace_hash *other_hash
kernel/trace/ftrace.c:1657:28: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:1908: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:1908:50: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:1908:50: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:1919: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:1919:50: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:1919:50: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:2993:24: sparse: sparse: Using plain integer as NULL pointer
kernel/trace/ftrace.c:3085: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:3085:14: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3085:14: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:3094: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:3094:22: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3094:22: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:3546: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:3546:22: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3546:22: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:3549: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:3549:22: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:3549:22: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:3913: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:3913:27: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:3913:27: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:3915: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:3915:27: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:3915:27: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:4280: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:4280:19: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:4280:19: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:4417: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:4417:19: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:4417:19: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:4423: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:4423:34: sparse: expected struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:4423:34: sparse: got struct ftrace_hash *[assigned] old_hash
kernel/trace/ftrace.c:4675: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:4675:27: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:4675:27: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:4677: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:4677:27: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:4677:27: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:4714:37: sparse: sparse: Using plain integer as NULL pointer
kernel/trace/ftrace.c:4961: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:4961:35: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:4961:35: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:4965: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:4965:35: sparse: expected struct ftrace_hash **orig_hash
kernel/trace/ftrace.c:4965:35: sparse: got struct ftrace_hash [noderef] __rcu **
kernel/trace/ftrace.c:5601: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:5601:18: sparse: expected struct ftrace_ops *ops
kernel/trace/ftrace.c:5601:18: sparse: got struct ftrace_ops [noderef] __rcu *[addressable] [toplevel] ftrace_ops_list
kernel/trace/ftrace.c:5601: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:5601:66: sparse: expected struct ftrace_ops *ops
kernel/trace/ftrace.c:5601:66: sparse: got struct ftrace_ops [noderef] __rcu *next
kernel/trace/ftrace.c:5642: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:5642:59: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:5642:59: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:5643: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:5643:59: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:5643:59: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:6000: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:6000:62: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:6000:62: sparse: got struct ftrace_hash [noderef] __rcu *filter_hash
kernel/trace/ftrace.c:6001: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:6001:62: sparse: expected struct ftrace_hash *hash
kernel/trace/ftrace.c:6001:62: sparse: got struct ftrace_hash [noderef] __rcu *notrace_hash
kernel/trace/ftrace.c:6047:36: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/trace/ftrace.c:6047:36: sparse: struct ftrace_ops [noderef] __rcu *
kernel/trace/ftrace.c:6047:36: sparse: struct ftrace_ops *
kernel/trace/ftrace.c:210:20: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:210:20: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c:210:20: sparse: sparse: dereference of noderef expression
kernel/trace/ftrace.c: note: in included file:
include/linux/slab.h:332:43: sparse: sparse: dubious: x & !y
include/linux/slab.h:332:43: sparse: sparse: dubious: x & !y
include/linux/slab.h:332:43: sparse: sparse: dubious: x & !y
include/linux/slab.h:332:43: sparse: sparse: dubious: x & !y
include/linux/slab.h:332:43: sparse: sparse: dubious: x & !y
include/linux/slab.h:332:43: sparse: sparse: dubious: x & !y
include/linux/slab.h:332:43: sparse: sparse: dubious: x & !y

vim +1608 kernel/trace/ftrace.c

33dc9b1267d59c Steven Rostedt 2011-05-02 1451
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1452) static bool hash_contains_ip(unsigned long ip,
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1453) struct ftrace_ops_hash *hash)
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1454) {
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1455) /*
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1456) * The function record is a match if it exists in the filter
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1457) * hash and not in the notrace hash. Note, an emty hash is
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1458) * considered a match for the filter hash, but an empty
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1459) * notrace hash is considered not in the notrace hash.
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1460) */
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1461) return (ftrace_hash_empty(hash->filter_hash) ||
2b2c279c814112 Steven Rostedt (VMware 2017-02-01 @1462) __ftrace_lookup_ip(hash->filter_hash, ip)) &&
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1463) (ftrace_hash_empty(hash->notrace_hash) ||
2b2c279c814112 Steven Rostedt (VMware 2017-02-01 1464) !__ftrace_lookup_ip(hash->notrace_hash, ip));
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1465) }
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1466)
b848914ce39589 Steven Rostedt 2011-05-04 1467 /*
b848914ce39589 Steven Rostedt 2011-05-04 1468 * Test the hashes for this ops to see if we want to call
b848914ce39589 Steven Rostedt 2011-05-04 1469 * the ops->func or not.
b848914ce39589 Steven Rostedt 2011-05-04 1470 *
b848914ce39589 Steven Rostedt 2011-05-04 1471 * It's a match if the ip is in the ops->filter_hash or
b848914ce39589 Steven Rostedt 2011-05-04 1472 * the filter_hash does not exist or is empty,
b848914ce39589 Steven Rostedt 2011-05-04 1473 * AND
b848914ce39589 Steven Rostedt 2011-05-04 1474 * the ip is not in the ops->notrace_hash.
cdbe61bfe70440 Steven Rostedt 2011-05-05 1475 *
cdbe61bfe70440 Steven Rostedt 2011-05-05 1476 * This needs to be called with preemption disabled as
cdbe61bfe70440 Steven Rostedt 2011-05-05 1477 * the hashes are freed with call_rcu_sched().
b848914ce39589 Steven Rostedt 2011-05-04 1478 */
3306fc4aff464f Steven Rostedt (VMware 2018-11-15 1479) int
195a8afc7ac962 Steven Rostedt (Red Hat 2013-07-23 1480) ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip, void *regs)
b848914ce39589 Steven Rostedt 2011-05-04 1481 {
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1482) struct ftrace_ops_hash hash;
b848914ce39589 Steven Rostedt 2011-05-04 1483 int ret;
b848914ce39589 Steven Rostedt 2011-05-04 1484
195a8afc7ac962 Steven Rostedt (Red Hat 2013-07-23 1485) #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
195a8afc7ac962 Steven Rostedt (Red Hat 2013-07-23 1486) /*
195a8afc7ac962 Steven Rostedt (Red Hat 2013-07-23 1487) * There's a small race when adding ops that the ftrace handler
195a8afc7ac962 Steven Rostedt (Red Hat 2013-07-23 1488) * that wants regs, may be called without them. We can not
195a8afc7ac962 Steven Rostedt (Red Hat 2013-07-23 1489) * allow that handler to be called if regs is NULL.
195a8afc7ac962 Steven Rostedt (Red Hat 2013-07-23 1490) */
195a8afc7ac962 Steven Rostedt (Red Hat 2013-07-23 1491) if (regs == NULL && (ops->flags & FTRACE_OPS_FL_SAVE_REGS))
195a8afc7ac962 Steven Rostedt (Red Hat 2013-07-23 1492) return 0;
195a8afc7ac962 Steven Rostedt (Red Hat 2013-07-23 1493) #endif
195a8afc7ac962 Steven Rostedt (Red Hat 2013-07-23 1494)
f86f418059b94a Chunyan Zhang 2017-06-07 1495 rcu_assign_pointer(hash.filter_hash, ops->func_hash->filter_hash);
f86f418059b94a Chunyan Zhang 2017-06-07 1496 rcu_assign_pointer(hash.notrace_hash, ops->func_hash->notrace_hash);
b848914ce39589 Steven Rostedt 2011-05-04 1497
fef5aeeee9e371 Steven Rostedt (Red Hat 2014-07-24 1498) if (hash_contains_ip(ip, &hash))
b848914ce39589 Steven Rostedt 2011-05-04 1499 ret = 1;
b848914ce39589 Steven Rostedt 2011-05-04 1500 else
b848914ce39589 Steven Rostedt 2011-05-04 1501 ret = 0;
b848914ce39589 Steven Rostedt 2011-05-04 1502
b848914ce39589 Steven Rostedt 2011-05-04 1503 return ret;
b848914ce39589 Steven Rostedt 2011-05-04 1504 }
b848914ce39589 Steven Rostedt 2011-05-04 1505
493762fc534c71 Steven Rostedt 2009-03-23 1506 /*
493762fc534c71 Steven Rostedt 2009-03-23 1507 * This is a double for. Do not use 'break' to break out of the loop,
493762fc534c71 Steven Rostedt 2009-03-23 1508 * you must use a goto.
493762fc534c71 Steven Rostedt 2009-03-23 1509 */
493762fc534c71 Steven Rostedt 2009-03-23 1510 #define do_for_each_ftrace_rec(pg, rec) \
493762fc534c71 Steven Rostedt 2009-03-23 1511 for (pg = ftrace_pages_start; pg; pg = pg->next) { \
493762fc534c71 Steven Rostedt 2009-03-23 1512 int _____i; \
493762fc534c71 Steven Rostedt 2009-03-23 1513 for (_____i = 0; _____i < pg->index; _____i++) { \
493762fc534c71 Steven Rostedt 2009-03-23 1514 rec = &pg->records[_____i];
493762fc534c71 Steven Rostedt 2009-03-23 1515
493762fc534c71 Steven Rostedt 2009-03-23 1516 #define while_for_each_ftrace_rec() \
493762fc534c71 Steven Rostedt 2009-03-23 1517 } \
bac429f037f1a5 Steven Rostedt 2009-03-20 1518 }
bac429f037f1a5 Steven Rostedt 2009-03-20 1519
5855fead9cc358 Steven Rostedt 2011-12-16 1520
5855fead9cc358 Steven Rostedt 2011-12-16 1521 static int ftrace_cmp_recs(const void *a, const void *b)
5855fead9cc358 Steven Rostedt 2011-12-16 1522 {
a650e02a528ab9 Steven Rostedt 2012-04-25 1523 const struct dyn_ftrace *key = a;
a650e02a528ab9 Steven Rostedt 2012-04-25 1524 const struct dyn_ftrace *rec = b;
5855fead9cc358 Steven Rostedt 2011-12-16 1525
a650e02a528ab9 Steven Rostedt 2012-04-25 1526 if (key->flags < rec->ip)
5855fead9cc358 Steven Rostedt 2011-12-16 1527 return -1;
a650e02a528ab9 Steven Rostedt 2012-04-25 1528 if (key->ip >= rec->ip + MCOUNT_INSN_SIZE)
a650e02a528ab9 Steven Rostedt 2012-04-25 1529 return 1;
5855fead9cc358 Steven Rostedt 2011-12-16 1530 return 0;
5855fead9cc358 Steven Rostedt 2011-12-16 1531 }
5855fead9cc358 Steven Rostedt 2011-12-16 1532
04cf31a759ef57 Michael Ellerman 2016-03-24 1533 /**
04cf31a759ef57 Michael Ellerman 2016-03-24 1534 * ftrace_location_range - return the first address of a traced location
04cf31a759ef57 Michael Ellerman 2016-03-24 1535 * if it touches the given ip range
04cf31a759ef57 Michael Ellerman 2016-03-24 1536 * @start: start of range to search.
04cf31a759ef57 Michael Ellerman 2016-03-24 1537 * @end: end of range to search (inclusive). @end points to the last byte
04cf31a759ef57 Michael Ellerman 2016-03-24 1538 * to check.
04cf31a759ef57 Michael Ellerman 2016-03-24 1539 *
04cf31a759ef57 Michael Ellerman 2016-03-24 1540 * Returns rec->ip if the related ftrace location is a least partly within
04cf31a759ef57 Michael Ellerman 2016-03-24 1541 * the given address range. That is, the first address of the instruction
04cf31a759ef57 Michael Ellerman 2016-03-24 1542 * that is either a NOP or call to the function tracer. It checks the ftrace
04cf31a759ef57 Michael Ellerman 2016-03-24 1543 * internal tables to determine if the address belongs or not.
04cf31a759ef57 Michael Ellerman 2016-03-24 1544 */
04cf31a759ef57 Michael Ellerman 2016-03-24 1545 unsigned long ftrace_location_range(unsigned long start, unsigned long end)
c88fd8634ea68e Steven Rostedt 2011-08-16 1546 {
c88fd8634ea68e Steven Rostedt 2011-08-16 1547 struct ftrace_page *pg;
c88fd8634ea68e Steven Rostedt 2011-08-16 1548 struct dyn_ftrace *rec;
5855fead9cc358 Steven Rostedt 2011-12-16 1549 struct dyn_ftrace key;
c88fd8634ea68e Steven Rostedt 2011-08-16 1550
a650e02a528ab9 Steven Rostedt 2012-04-25 1551 key.ip = start;
a650e02a528ab9 Steven Rostedt 2012-04-25 1552 key.flags = end; /* overload flags, as it is unsigned long */
5855fead9cc358 Steven Rostedt 2011-12-16 1553
5855fead9cc358 Steven Rostedt 2011-12-16 1554 for (pg = ftrace_pages_start; pg; pg = pg->next) {
a650e02a528ab9 Steven Rostedt 2012-04-25 1555 if (end < pg->records[0].ip ||
a650e02a528ab9 Steven Rostedt 2012-04-25 1556 start >= (pg->records[pg->index - 1].ip + MCOUNT_INSN_SIZE))
9644302e3315e7 Steven Rostedt 2012-04-25 1557 continue;
5855fead9cc358 Steven Rostedt 2011-12-16 1558 rec = bsearch(&key, pg->records, pg->index,
5855fead9cc358 Steven Rostedt 2011-12-16 1559 sizeof(struct dyn_ftrace),
5855fead9cc358 Steven Rostedt 2011-12-16 1560 ftrace_cmp_recs);
5855fead9cc358 Steven Rostedt 2011-12-16 1561 if (rec)
f0cf973a224a3e Steven Rostedt 2012-04-25 1562 return rec->ip;
5855fead9cc358 Steven Rostedt 2011-12-16 1563 }
c88fd8634ea68e Steven Rostedt 2011-08-16 1564
c88fd8634ea68e Steven Rostedt 2011-08-16 1565 return 0;
c88fd8634ea68e Steven Rostedt 2011-08-16 1566 }
c88fd8634ea68e Steven Rostedt 2011-08-16 1567
a650e02a528ab9 Steven Rostedt 2012-04-25 1568 /**
a650e02a528ab9 Steven Rostedt 2012-04-25 1569 * ftrace_location - return true if the ip giving is a traced location
a650e02a528ab9 Steven Rostedt 2012-04-25 1570 * @ip: the instruction pointer to check
a650e02a528ab9 Steven Rostedt 2012-04-25 1571 *
f0cf973a224a3e Steven Rostedt 2012-04-25 1572 * Returns rec->ip if @ip given is a pointer to a ftrace location.
a650e02a528ab9 Steven Rostedt 2012-04-25 1573 * That is, the instruction that is either a NOP or call to
a650e02a528ab9 Steven Rostedt 2012-04-25 1574 * the function tracer. It checks the ftrace internal tables to
a650e02a528ab9 Steven Rostedt 2012-04-25 1575 * determine if the address belongs or not.
a650e02a528ab9 Steven Rostedt 2012-04-25 1576 */
f0cf973a224a3e Steven Rostedt 2012-04-25 1577 unsigned long ftrace_location(unsigned long ip)
a650e02a528ab9 Steven Rostedt 2012-04-25 1578 {
a650e02a528ab9 Steven Rostedt 2012-04-25 1579 return ftrace_location_range(ip, ip);
a650e02a528ab9 Steven Rostedt 2012-04-25 1580 }
a650e02a528ab9 Steven Rostedt 2012-04-25 1581
a650e02a528ab9 Steven Rostedt 2012-04-25 1582 /**
a650e02a528ab9 Steven Rostedt 2012-04-25 1583 * ftrace_text_reserved - return true if range contains an ftrace location
a650e02a528ab9 Steven Rostedt 2012-04-25 1584 * @start: start of range to search
a650e02a528ab9 Steven Rostedt 2012-04-25 1585 * @end: end of range to search (inclusive). @end points to the last byte to check.
a650e02a528ab9 Steven Rostedt 2012-04-25 1586 *
a650e02a528ab9 Steven Rostedt 2012-04-25 1587 * Returns 1 if @start and @end contains a ftrace location.
a650e02a528ab9 Steven Rostedt 2012-04-25 1588 * That is, the instruction that is either a NOP or call to
a650e02a528ab9 Steven Rostedt 2012-04-25 1589 * the function tracer. It checks the ftrace internal tables to
a650e02a528ab9 Steven Rostedt 2012-04-25 1590 * determine if the address belongs or not.
a650e02a528ab9 Steven Rostedt 2012-04-25 1591 */
d88471cb8b17a7 Sasha Levin 2013-01-09 1592 int ftrace_text_reserved(const void *start, const void *end)
a650e02a528ab9 Steven Rostedt 2012-04-25 1593 {
f0cf973a224a3e Steven Rostedt 2012-04-25 1594 unsigned long ret;
f0cf973a224a3e Steven Rostedt 2012-04-25 1595
f0cf973a224a3e Steven Rostedt 2012-04-25 1596 ret = ftrace_location_range((unsigned long)start,
a650e02a528ab9 Steven Rostedt 2012-04-25 1597 (unsigned long)end);
f0cf973a224a3e Steven Rostedt 2012-04-25 1598
f0cf973a224a3e Steven Rostedt 2012-04-25 1599 return (int)!!ret;
a650e02a528ab9 Steven Rostedt 2012-04-25 1600 }
a650e02a528ab9 Steven Rostedt 2012-04-25 1601
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1602) /* Test if ops registered to this rec needs regs */
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1603) static bool test_rec_ops_needs_regs(struct dyn_ftrace *rec)
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1604) {
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1605) struct ftrace_ops *ops;
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1606) bool keep_regs = false;
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1607)
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 @1608) for (ops = ftrace_ops_list;
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1609) ops != &ftrace_list_end; ops = ops->next) {
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1610) /* pass rec in as regs to have non-NULL val */
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1611) if (ftrace_ops_test(ops, rec->ip, rec)) {
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1612) if (ops->flags & FTRACE_OPS_FL_SAVE_REGS) {
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1613) keep_regs = true;
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1614) break;
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1615) }
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1616) }
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1617) }
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1618)
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1619) return keep_regs;
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1620) }
4fbb48cb110be6 Steven Rostedt (Red Hat 2014-04-30 1621)

:::::: The code at line 1608 was first introduced by commit
:::::: 4fbb48cb110be653adcd97a87506e0ba8c16d585 ftrace: Allow no regs if no more callbacks require it

:::::: TO: Steven Rostedt (Red Hat) <rostedt@xxxxxxxxxxx>
:::::: CC: Steven Rostedt <rostedt@xxxxxxxxxxx>

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