1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Include this file from a header that uses vendor hooks. 4 * Typical usage: 5 * In the header file: 6 * 7 * #include <linux/android_hook_defs.h> 8 * 9 * DECLARE_INDIRECT_HOOK(android_vh_del_folio_from_lrulist, 10 * TP_PROTO(struct folio *folio, enum lru_list lru), 11 * TP_ARGS(folio, lru)); 12 * 13 * static __always_inline 14 * void lruvec_del_folio(struct lruvec *lruvec, struct folio *folio) 15 * { 16 * ... 17 * _trace_android_vh_del_folio_from_lrulist(folio, lru); 18 * } 19 * 20 * In the source file: 21 * 22 * DEFINE_INDIRECT_HOOK(android_vh_del_folio_from_lrulist, 23 * TP_PROTO(struct folio *folio, enum lru_list lru), 24 * TP_ARGS(folio, lru)); 25 */ 26 27 #ifndef _LINUX_ANDROID_HOOK_DEFS_H 28 #define _LINUX_ANDROID_HOOK_DEFS_H 29 30 /* Users of these macros need TP_PROTO() and TP_ARGS() */ 31 #include <linux/tracepoint.h> 32 33 #define DECLARE_INDIRECT_HOOK(name, proto, args) \ 34 extern struct tracepoint __tracepoint_##name; \ 35 void __trace_##name(proto); \ 36 static __always_inline void _trace_##name(proto) \ 37 { \ 38 if (static_key_false(&__tracepoint_##name.key)) \ 39 __trace_##name(args); \ 40 } 41 42 #define DEFINE_INDIRECT_HOOK(name, proto, args) \ 43 void __trace_##name(proto) \ 44 { \ 45 trace_##name(args); \ 46 } \ 47 EXPORT_SYMBOL_GPL(__trace_##name); 48 49 #endif /* _LINUX_ANDROID_HOOK_DEFS_H */ 50