0001
0002 #ifndef _LINUX_JUMP_LABEL_RATELIMIT_H
0003 #define _LINUX_JUMP_LABEL_RATELIMIT_H
0004
0005 #include <linux/jump_label.h>
0006 #include <linux/workqueue.h>
0007
0008 #if defined(CONFIG_JUMP_LABEL)
0009 struct static_key_deferred {
0010 struct static_key key;
0011 unsigned long timeout;
0012 struct delayed_work work;
0013 };
0014
0015 struct static_key_true_deferred {
0016 struct static_key_true key;
0017 unsigned long timeout;
0018 struct delayed_work work;
0019 };
0020
0021 struct static_key_false_deferred {
0022 struct static_key_false key;
0023 unsigned long timeout;
0024 struct delayed_work work;
0025 };
0026
0027 #define static_key_slow_dec_deferred(x) \
0028 __static_key_slow_dec_deferred(&(x)->key, &(x)->work, (x)->timeout)
0029 #define static_branch_slow_dec_deferred(x) \
0030 __static_key_slow_dec_deferred(&(x)->key.key, &(x)->work, (x)->timeout)
0031
0032 #define static_key_deferred_flush(x) \
0033 __static_key_deferred_flush((x), &(x)->work)
0034
0035 extern void
0036 __static_key_slow_dec_deferred(struct static_key *key,
0037 struct delayed_work *work,
0038 unsigned long timeout);
0039 extern void __static_key_deferred_flush(void *key, struct delayed_work *work);
0040 extern void
0041 jump_label_rate_limit(struct static_key_deferred *key, unsigned long rl);
0042
0043 extern void jump_label_update_timeout(struct work_struct *work);
0044
0045 #define DEFINE_STATIC_KEY_DEFERRED_TRUE(name, rl) \
0046 struct static_key_true_deferred name = { \
0047 .key = { STATIC_KEY_INIT_TRUE }, \
0048 .timeout = (rl), \
0049 .work = __DELAYED_WORK_INITIALIZER((name).work, \
0050 jump_label_update_timeout, \
0051 0), \
0052 }
0053
0054 #define DEFINE_STATIC_KEY_DEFERRED_FALSE(name, rl) \
0055 struct static_key_false_deferred name = { \
0056 .key = { STATIC_KEY_INIT_FALSE }, \
0057 .timeout = (rl), \
0058 .work = __DELAYED_WORK_INITIALIZER((name).work, \
0059 jump_label_update_timeout, \
0060 0), \
0061 }
0062
0063 #else
0064 struct static_key_deferred {
0065 struct static_key key;
0066 };
0067 struct static_key_true_deferred {
0068 struct static_key_true key;
0069 };
0070 struct static_key_false_deferred {
0071 struct static_key_false key;
0072 };
0073 #define DEFINE_STATIC_KEY_DEFERRED_TRUE(name, rl) \
0074 struct static_key_true_deferred name = { STATIC_KEY_TRUE_INIT }
0075 #define DEFINE_STATIC_KEY_DEFERRED_FALSE(name, rl) \
0076 struct static_key_false_deferred name = { STATIC_KEY_FALSE_INIT }
0077
0078 #define static_branch_slow_dec_deferred(x) static_branch_dec(&(x)->key)
0079
0080 static inline void static_key_slow_dec_deferred(struct static_key_deferred *key)
0081 {
0082 STATIC_KEY_CHECK_USE(key);
0083 static_key_slow_dec(&key->key);
0084 }
0085 static inline void static_key_deferred_flush(void *key)
0086 {
0087 STATIC_KEY_CHECK_USE(key);
0088 }
0089 static inline void
0090 jump_label_rate_limit(struct static_key_deferred *key,
0091 unsigned long rl)
0092 {
0093 STATIC_KEY_CHECK_USE(key);
0094 }
0095 #endif
0096
0097 #define static_branch_deferred_inc(x) static_branch_inc(&(x)->key)
0098
0099 #endif