static_call: Handle tail-calls
GCC can turn our static_call(name)(args...) into a tail call, in which case we get a JMP.d32 into the trampoline (which then does a further tail-call). Teach objtool to recognise and mark these in .static_call_sites and adjust the code patching to deal with this. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Link: https://lore.kernel.org/r/20200818135805.101186767@infradead.org
This commit is contained in:

committed by
Ingo Molnar

parent
452cddbff7
commit
5b06fd3bb9
@@ -103,7 +103,7 @@
|
||||
/*
|
||||
* Either @site or @tramp can be NULL.
|
||||
*/
|
||||
extern void arch_static_call_transform(void *site, void *tramp, void *func);
|
||||
extern void arch_static_call_transform(void *site, void *tramp, void *func, bool tail);
|
||||
|
||||
#define STATIC_CALL_TRAMP_ADDR(name) &STATIC_CALL_TRAMP(name)
|
||||
|
||||
@@ -206,7 +206,7 @@ void __static_call_update(struct static_call_key *key, void *tramp, void *func)
|
||||
{
|
||||
cpus_read_lock();
|
||||
WRITE_ONCE(key->func, func);
|
||||
arch_static_call_transform(NULL, tramp, func);
|
||||
arch_static_call_transform(NULL, tramp, func, false);
|
||||
cpus_read_unlock();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user