#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 */