| #ifndef _LINUX_JUMP_LABEL_REF_H | |
| #define _LINUX_JUMP_LABEL_REF_H | |
| #include <linux/jump_label.h> | |
| #include <asm/atomic.h> | |
| #ifdef HAVE_JUMP_LABEL | |
| static inline void jump_label_inc(atomic_t *key) | |
| { | |
| if (atomic_add_return(1, key) == 1) | |
| jump_label_enable(key); | |
| } | |
| static inline void jump_label_dec(atomic_t *key) | |
| { | |
| if (atomic_dec_and_test(key)) | |
| jump_label_disable(key); | |
| } | |
| #else /* !HAVE_JUMP_LABEL */ | |
| static inline void jump_label_inc(atomic_t *key) | |
| { | |
| atomic_inc(key); | |
| } | |
| static inline void jump_label_dec(atomic_t *key) | |
| { | |
| atomic_dec(key); | |
| } | |
| #undef JUMP_LABEL | |
| #define JUMP_LABEL(key, label) \ | |
| do { \ | |
| if (unlikely(__builtin_choose_expr( \ | |
| __builtin_types_compatible_p(typeof(key), atomic_t *), \ | |
| atomic_read((atomic_t *)(key)), *(key)))) \ | |
| goto label; \ | |
| } while (0) | |
| #endif /* HAVE_JUMP_LABEL */ | |
| #endif /* _LINUX_JUMP_LABEL_REF_H */ |