summaryrefslogtreecommitdiff
path: root/kernel/static_call.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/static_call.c')
-rw-r--r--kernel/static_call.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/kernel/static_call.c b/kernel/static_call.c
index 97142cb6bfa6..d98e0e4272c1 100644
--- a/kernel/static_call.c
+++ b/kernel/static_call.c
@@ -15,8 +15,6 @@ extern struct static_call_site __start_static_call_sites[],
static bool static_call_initialized;
-#define STATIC_CALL_INIT 1UL
-
/* mutex to protect key modules/sites */
static DEFINE_MUTEX(static_call_mutex);
@@ -39,18 +37,23 @@ static inline void *static_call_addr(struct static_call_site *site)
static inline struct static_call_key *static_call_key(const struct static_call_site *site)
{
return (struct static_call_key *)
- (((long)site->key + (long)&site->key) & ~STATIC_CALL_INIT);
+ (((long)site->key + (long)&site->key) & ~STATIC_CALL_SITE_FLAGS);
}
/* These assume the key is word-aligned. */
static inline bool static_call_is_init(struct static_call_site *site)
{
- return ((long)site->key + (long)&site->key) & STATIC_CALL_INIT;
+ return ((long)site->key + (long)&site->key) & STATIC_CALL_SITE_INIT;
+}
+
+static inline bool static_call_is_tail(struct static_call_site *site)
+{
+ return ((long)site->key + (long)&site->key) & STATIC_CALL_SITE_TAIL;
}
static inline void static_call_set_init(struct static_call_site *site)
{
- site->key = ((long)static_call_key(site) | STATIC_CALL_INIT) -
+ site->key = ((long)static_call_key(site) | STATIC_CALL_SITE_INIT) -
(long)&site->key;
}
@@ -104,7 +107,7 @@ void __static_call_update(struct static_call_key *key, void *tramp, void *func)
key->func = func;
- arch_static_call_transform(NULL, tramp, func);
+ arch_static_call_transform(NULL, tramp, func, false);
/*
* If uninitialized, we'll not update the callsites, but they still
@@ -154,7 +157,8 @@ void __static_call_update(struct static_call_key *key, void *tramp, void *func)
continue;
}
- arch_static_call_transform(site_addr, NULL, func);
+ arch_static_call_transform(site_addr, NULL, func,
+ static_call_is_tail(site));
}
}
@@ -198,7 +202,8 @@ static int __static_call_init(struct module *mod,
key->mods = site_mod;
}
- arch_static_call_transform(site_addr, NULL, key->func);
+ arch_static_call_transform(site_addr, NULL, key->func,
+ static_call_is_tail(site));
}
return 0;