Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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   /* !CONFIG_JUMP_LABEL */
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  /* CONFIG_JUMP_LABEL */
0096 
0097 #define static_branch_deferred_inc(x)   static_branch_inc(&(x)->key)
0098 
0099 #endif  /* _LINUX_JUMP_LABEL_RATELIMIT_H */