mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-05-14 21:38:46 +02:00
fde39f7df1
As IPv6 is built-in only, it does not make sense to continue using IS_BUILTIN(CONFIG_IPV6). Therefore, replace it with IS_ENABLED() when necessary and drop it if it isn't valid anymore. Notice that there is still one instance related to ICMPv6, as it requires more changes it will be handle separately. Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de> Tested-by: Ricardo B. Marlière <rbm@suse.com> Acked-by: Martin KaFai Lau <martin.lau@kernel.org> Link: https://patch.msgid.link/20260325120928.15848-4-fmancera@suse.de Signed-off-by: Jakub Kicinski <kuba@kernel.org>
76 lines
2.4 KiB
C
76 lines
2.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _LINUX_INDIRECT_CALL_WRAPPER_H
|
|
#define _LINUX_INDIRECT_CALL_WRAPPER_H
|
|
|
|
#ifdef CONFIG_MITIGATION_RETPOLINE
|
|
|
|
/*
|
|
* INDIRECT_CALL_$NR - wrapper for indirect calls with $NR known builtin
|
|
* @f: function pointer
|
|
* @f$NR: builtin functions names, up to $NR of them
|
|
* @__VA_ARGS__: arguments for @f
|
|
*
|
|
* Avoid retpoline overhead for known builtin, checking @f vs each of them and
|
|
* eventually invoking directly the builtin function. The functions are checked
|
|
* in the given order. Fallback to the indirect call.
|
|
*/
|
|
#define INDIRECT_CALL_1(f, f1, ...) \
|
|
({ \
|
|
typeof(f) __f1 = (f); \
|
|
likely(__f1 == f1) ? f1(__VA_ARGS__) : __f1(__VA_ARGS__); \
|
|
})
|
|
#define INDIRECT_CALL_2(f, f2, f1, ...) \
|
|
({ \
|
|
typeof(f) __f2 = (f); \
|
|
likely(__f2 == f2) ? f2(__VA_ARGS__) : \
|
|
INDIRECT_CALL_1(__f2, f1, __VA_ARGS__); \
|
|
})
|
|
#define INDIRECT_CALL_3(f, f3, f2, f1, ...) \
|
|
({ \
|
|
typeof(f) __f3 = (f); \
|
|
likely(__f3 == f3) ? f3(__VA_ARGS__) : \
|
|
INDIRECT_CALL_2(__f3, f2, f1, __VA_ARGS__); \
|
|
})
|
|
#define INDIRECT_CALL_4(f, f4, f3, f2, f1, ...) \
|
|
({ \
|
|
typeof(f) __f4 = (f); \
|
|
likely(__f4 == f4) ? f4(__VA_ARGS__) : \
|
|
INDIRECT_CALL_3(__f4, f3, f2, f1, __VA_ARGS__); \
|
|
})
|
|
|
|
#define INDIRECT_CALLABLE_DECLARE(f) f
|
|
#define INDIRECT_CALLABLE_SCOPE
|
|
#define EXPORT_INDIRECT_CALLABLE(f) EXPORT_SYMBOL(f)
|
|
|
|
#else
|
|
#define INDIRECT_CALL_1(f, f1, ...) f(__VA_ARGS__)
|
|
#define INDIRECT_CALL_2(f, f2, f1, ...) f(__VA_ARGS__)
|
|
#define INDIRECT_CALL_3(f, f3, f2, f1, ...) f(__VA_ARGS__)
|
|
#define INDIRECT_CALL_4(f, f4, f3, f2, f1, ...) f(__VA_ARGS__)
|
|
#define INDIRECT_CALLABLE_DECLARE(f)
|
|
#define INDIRECT_CALLABLE_SCOPE static
|
|
#define EXPORT_INDIRECT_CALLABLE(f)
|
|
#endif
|
|
|
|
/*
|
|
* We can use INDIRECT_CALL_$NR for ipv6 related functions only if ipv6 is
|
|
* builtin, this macro simplify dealing with indirect calls with only ipv4/ipv6
|
|
* alternatives
|
|
*/
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
#define INDIRECT_CALL_INET(f, f2, f1, ...) \
|
|
INDIRECT_CALL_2(f, f2, f1, __VA_ARGS__)
|
|
#elif IS_ENABLED(CONFIG_INET)
|
|
#define INDIRECT_CALL_INET(f, f2, f1, ...) INDIRECT_CALL_1(f, f1, __VA_ARGS__)
|
|
#else
|
|
#define INDIRECT_CALL_INET(f, f2, f1, ...) f(__VA_ARGS__)
|
|
#endif
|
|
|
|
#if IS_ENABLED(CONFIG_INET)
|
|
#define INDIRECT_CALL_INET_1(f, f1, ...) INDIRECT_CALL_1(f, f1, __VA_ARGS__)
|
|
#else
|
|
#define INDIRECT_CALL_INET_1(f, f1, ...) f(__VA_ARGS__)
|
|
#endif
|
|
|
|
#endif
|