All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Jiri Olsa <jolsa@kernel.org>
Cc: oe-kbuild-all@lists.linux.dev
Subject: [jolsa-perf:bpf/tracing_multi_1 13/22] kernel/bpf/trampoline.c:1206:9: error: implicit declaration of function 'free_ftrace_hash'
Date: Tue, 24 Jun 2025 10:18:56 +0800	[thread overview]
Message-ID: <202506241031.HO3JVM22-lkp@intel.com> (raw)

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git bpf/tracing_multi_1
head:   28441de17b08aa419e3a354e2940268a9078d418
commit: d17f5a03a1bba684c70591ef012dbf178896f3cd [13/22] bpf: Add bpf_trampoline_multi_attach/detach functions
config: arm-randconfig-002-20250621 (https://download.01.org/0day-ci/archive/20250624/202506241031.HO3JVM22-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250624/202506241031.HO3JVM22-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/202506241031.HO3JVM22-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from kernel/bpf/trampoline.c:6:
   include/linux/ftrace.h:575:5: warning: no previous prototype for 'register_ftrace_direct_hash' [-Wmissing-prototypes]
     575 | int register_ftrace_direct_hash(struct ftrace_ops *ops, struct ftrace_hash *hash)
         |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/ftrace.h:580:5: warning: no previous prototype for 'unregister_ftrace_direct_hash' [-Wmissing-prototypes]
     580 | int unregister_ftrace_direct_hash(struct ftrace_ops *ops, struct ftrace_hash *hash)
         |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/ftrace.h:585:5: warning: no previous prototype for 'modify_ftrace_direct_hash' [-Wmissing-prototypes]
     585 | int modify_ftrace_direct_hash(struct ftrace_ops *ops, struct ftrace_hash *hash)
         |     ^~~~~~~~~~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:279:15: error: variable 'trampoline_ops' has initializer but incomplete type
     279 | static struct bpf_trampoline_ops trampoline_ops = {
         |               ^~~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:280:10: error: 'struct bpf_trampoline_ops' has no member named 'register_fentry'
     280 |         .register_fentry   = register_fentry,
         |          ^~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:280:30: warning: excess elements in struct initializer
     280 |         .register_fentry   = register_fentry,
         |                              ^~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:280:30: note: (near initialization for 'trampoline_ops')
   kernel/bpf/trampoline.c:281:10: error: 'struct bpf_trampoline_ops' has no member named 'unregister_fentry'
     281 |         .unregister_fentry = unregister_fentry,
         |          ^~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:281:30: warning: excess elements in struct initializer
     281 |         .unregister_fentry = unregister_fentry,
         |                              ^~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:281:30: note: (near initialization for 'trampoline_ops')
   kernel/bpf/trampoline.c:282:10: error: 'struct bpf_trampoline_ops' has no member named 'modify_fentry'
     282 |         .modify_fentry     = modify_fentry,
         |          ^~~~~~~~~~~~~
   kernel/bpf/trampoline.c:282:30: warning: excess elements in struct initializer
     282 |         .modify_fentry     = modify_fentry,
         |                              ^~~~~~~~~~~~~
   kernel/bpf/trampoline.c:282:30: note: (near initialization for 'trampoline_ops')
   kernel/bpf/trampoline.c: In function 'bpf_trampoline_update_ops':
   kernel/bpf/trampoline.c:465:26: error: invalid use of undefined type 'struct bpf_trampoline_ops'
     465 |                 err = ops->unregister_fentry(tr, tr->cur_image->image, data);
         |                          ^~
   kernel/bpf/trampoline.c:525:26: error: invalid use of undefined type 'struct bpf_trampoline_ops'
     525 |                 err = ops->modify_fentry(tr, tr->cur_image->image, im->image, lock_direct_mutex, data);
         |                          ^~
   kernel/bpf/trampoline.c:528:26: error: invalid use of undefined type 'struct bpf_trampoline_ops'
     528 |                 err = ops->register_fentry(tr, im->image, data);
         |                          ^~
   kernel/bpf/trampoline.c: In function 'free_fentry_multi_data':
>> kernel/bpf/trampoline.c:1206:9: error: implicit declaration of function 'free_ftrace_hash' [-Wimplicit-function-declaration]
    1206 |         free_ftrace_hash(data->reg);
         |         ^~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c: In function 'register_fentry_multi':
>> kernel/bpf/trampoline.c:1215:16: error: implicit declaration of function 'add_hash_entry_direct' [-Wimplicit-function-declaration]
    1215 |         return add_hash_entry_direct(data->reg, tr->ptr->ip,
         |                ^~~~~~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c: At top level:
>> kernel/bpf/trampoline.c:1236:15: error: variable 'trampoline_multi_ops' has initializer but incomplete type
    1236 | static struct bpf_trampoline_ops trampoline_multi_ops = {
         |               ^~~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:1237:10: error: 'struct bpf_trampoline_ops' has no member named 'register_fentry'
    1237 |         .register_fentry   = register_fentry_multi,
         |          ^~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:1237:30: warning: excess elements in struct initializer
    1237 |         .register_fentry   = register_fentry_multi,
         |                              ^~~~~~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:1237:30: note: (near initialization for 'trampoline_multi_ops')
   kernel/bpf/trampoline.c:1238:10: error: 'struct bpf_trampoline_ops' has no member named 'unregister_fentry'
    1238 |         .unregister_fentry = unregister_fentry_multi,
         |          ^~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:1238:30: warning: excess elements in struct initializer
    1238 |         .unregister_fentry = unregister_fentry_multi,
         |                              ^~~~~~~~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:1238:30: note: (near initialization for 'trampoline_multi_ops')
   kernel/bpf/trampoline.c:1239:10: error: 'struct bpf_trampoline_ops' has no member named 'modify_fentry'
    1239 |         .modify_fentry     = modify_fentry_multi,
         |          ^~~~~~~~~~~~~
   kernel/bpf/trampoline.c:1239:30: warning: excess elements in struct initializer
    1239 |         .modify_fentry     = modify_fentry_multi,
         |                              ^~~~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:1239:30: note: (near initialization for 'trampoline_multi_ops')
   kernel/bpf/trampoline.c:1242:8: error: variable 'direct_ops' has initializer but incomplete type
    1242 | struct ftrace_ops direct_ops = {
         |        ^~~~~~~~~~
   kernel/bpf/trampoline.c: In function 'bpf_trampoline_multi_attach':
>> kernel/bpf/trampoline.c:1258:20: error: implicit declaration of function 'alloc_ftrace_hash' [-Wimplicit-function-declaration]
    1258 |         data.reg = alloc_ftrace_hash(FTRACE_HASH_DEFAULT_BITS);
         |                    ^~~~~~~~~~~~~~~~~
>> kernel/bpf/trampoline.c:1258:38: error: 'FTRACE_HASH_DEFAULT_BITS' undeclared (first use in this function)
    1258 |         data.reg = alloc_ftrace_hash(FTRACE_HASH_DEFAULT_BITS);
         |                                      ^~~~~~~~~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:1258:38: note: each undeclared identifier is reported only once for each function it appears in
   kernel/bpf/trampoline.c: In function 'bpf_trampoline_multi_detach':
   kernel/bpf/trampoline.c:1341:40: error: 'FTRACE_HASH_DEFAULT_BITS' undeclared (first use in this function)
    1341 |         data.unreg = alloc_ftrace_hash(FTRACE_HASH_DEFAULT_BITS);
         |                                        ^~~~~~~~~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c: At top level:
   kernel/bpf/trampoline.c:279:34: error: storage size of 'trampoline_ops' isn't known
     279 | static struct bpf_trampoline_ops trampoline_ops = {
         |                                  ^~~~~~~~~~~~~~
>> kernel/bpf/trampoline.c:1236:34: error: storage size of 'trampoline_multi_ops' isn't known
    1236 | static struct bpf_trampoline_ops trampoline_multi_ops = {
         |                                  ^~~~~~~~~~~~~~~~~~~~
   kernel/bpf/trampoline.c:1242:19: error: storage size of 'direct_ops' isn't known
    1242 | struct ftrace_ops direct_ops = {
         |                   ^~~~~~~~~~
   kernel/bpf/trampoline.c:563:12: warning: 'bpf_trampoline_update' defined but not used [-Wunused-function]
     563 | static int bpf_trampoline_update(struct bpf_trampoline *tr, bool lock_direct_mutex)
         |            ^~~~~~~~~~~~~~~~~~~~~


vim +/free_ftrace_hash +1206 kernel/bpf/trampoline.c

  1203	
  1204	static void free_fentry_multi_data(struct fentry_multi_data *data)
  1205	{
> 1206		free_ftrace_hash(data->reg);
  1207		free_ftrace_hash(data->unreg);
  1208		free_ftrace_hash(data->modify);
  1209	}
  1210	
  1211	static int register_fentry_multi(struct bpf_trampoline *tr, void *new_addr, void *ptr)
  1212	{
  1213		struct fentry_multi_data *data = ptr;
  1214	
> 1215		return add_hash_entry_direct(data->reg, tr->ptr->ip,
  1216					     (unsigned long) new_addr) ? 0 : -ENOMEM;
  1217	}
  1218	
  1219	static int unregister_fentry_multi(struct bpf_trampoline *tr, void *old_addr, void *ptr)
  1220	{
  1221		struct fentry_multi_data *data = ptr;
  1222	
  1223		return add_hash_entry_direct(data->unreg, tr->ptr->ip,
  1224					     (unsigned long) old_addr) ? 0 : -ENOMEM;
  1225	}
  1226	
  1227	static int modify_fentry_multi(struct bpf_trampoline *tr, void *old_addr, void *new_addr,
  1228				       bool lock_direct_mutex, void *ptr)
  1229	{
  1230		struct fentry_multi_data *data = ptr;
  1231	
  1232		return add_hash_entry_direct(data->modify, tr->ptr->ip,
  1233					     (unsigned long) new_addr) ? 0 : -ENOMEM;
  1234	}
  1235	
> 1236	static struct bpf_trampoline_ops trampoline_multi_ops = {
  1237		.register_fentry   = register_fentry_multi,
  1238		.unregister_fentry = unregister_fentry_multi,
  1239		.modify_fentry     = modify_fentry_multi,
  1240	};
  1241	
  1242	struct ftrace_ops direct_ops = {
  1243	#ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
  1244	       .ops_func = bpf_tramp_ftrace_ops_func,
  1245	#endif
  1246	};
  1247	
  1248	int bpf_trampoline_multi_attach(struct bpf_prog *prog, u32 *ids,
  1249					struct bpf_tracing_multi_link *link)
  1250	{
  1251		struct bpf_attach_target_info tgt_info = {};
  1252		struct bpf_tracing_multi_node *mnode;
  1253		int j, i, err, cnt = link->nodes_cnt;
  1254		struct fentry_multi_data data = {};
  1255		struct bpf_trampoline *tr;
  1256		u64 key;
  1257	
> 1258		data.reg = alloc_ftrace_hash(FTRACE_HASH_DEFAULT_BITS);
  1259		if (!data.reg)
  1260			return -ENOMEM;
  1261	
  1262		data.modify = alloc_ftrace_hash(FTRACE_HASH_DEFAULT_BITS);
  1263		if (!data.modify) {
  1264			free_ftrace_hash(data.reg);
  1265			return -ENOMEM;
  1266		}
  1267	
  1268		for (i = 0; i < cnt; i++) {
  1269			mnode = &link->nodes[i];
  1270			err = bpf_check_attach_target(NULL, prog, NULL, ids[i], &tgt_info);
  1271			if (err)
  1272				goto rollback_put;
  1273	
  1274			key = bpf_trampoline_compute_key(NULL, prog->aux->attach_btf, ids[i]);
  1275	
  1276			tr = bpf_trampoline_get(key, &tgt_info);
  1277			if (!tr)
  1278				goto rollback_put;
  1279	
  1280			mnode->trampoline = tr;
  1281			mnode->node.prog = prog;
  1282		}
  1283	
  1284		for (i = 0; i < cnt; i++) {
  1285			mnode = &link->nodes[i];
  1286			tr = mnode->trampoline;
  1287	
  1288			mutex_lock(&tr->mutex);
  1289	
  1290			err = __bpf_trampoline_link_prog(&mnode->node, tr, NULL, &trampoline_multi_ops, &data);
  1291			if (err) {
  1292				mutex_unlock(&tr->mutex);
  1293				goto rollback_unlink;
  1294			}
  1295		}
  1296	
  1297		err = register_ftrace_direct_hash(&direct_ops, data.reg);
  1298		if (err)
  1299			goto rollback_unlink;
  1300	
  1301		err = modify_ftrace_direct_hash(&direct_ops, data.modify);
  1302		if (err) {
  1303			WARN_ON_ONCE(unregister_ftrace_direct_hash(&direct_ops, data.reg));
  1304			goto rollback_unlink;
  1305		}
  1306	
  1307		for (i = 0; i < cnt; i++) {
  1308			tr = link->nodes[i].trampoline;
  1309			mutex_unlock(&tr->mutex);
  1310		}
  1311	
  1312		free_fentry_multi_data(&data);
  1313		return 0;
  1314	
  1315	rollback_unlink:
  1316		for (j = 0; j < i; j++) {
  1317			mnode = &link->nodes[j];
  1318			tr = mnode->trampoline;
  1319			WARN_ON_ONCE(__bpf_trampoline_unlink_prog(&mnode->node, tr, NULL,
  1320				     &trampoline_multi_ops, &data));
  1321			mutex_unlock(&tr->mutex);
  1322		}
  1323	
  1324	rollback_put:
  1325		for (j = 0; j < i; j++) {
  1326			mnode = &link->nodes[j];
  1327			bpf_trampoline_put(mnode->trampoline);
  1328		}
  1329	
  1330		free_fentry_multi_data(&data);
  1331		return err;
  1332	}
  1333	

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

                 reply	other threads:[~2025-06-24  2:19 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202506241031.HO3JVM22-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=jolsa@kernel.org \
    --cc=oe-kbuild-all@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.