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