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