| #ifndef _DYNAMIC_PRINTK_H | 
 | #define _DYNAMIC_PRINTK_H | 
 |  | 
 | #define DYNAMIC_DEBUG_HASH_BITS 6 | 
 | #define DEBUG_HASH_TABLE_SIZE (1 << DYNAMIC_DEBUG_HASH_BITS) | 
 |  | 
 | #define TYPE_BOOLEAN 1 | 
 |  | 
 | #define DYNAMIC_ENABLED_ALL 0 | 
 | #define DYNAMIC_ENABLED_NONE 1 | 
 | #define DYNAMIC_ENABLED_SOME 2 | 
 |  | 
 | extern int dynamic_enabled; | 
 |  | 
 | /* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which | 
 |  * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They | 
 |  * use independent hash functions, to reduce the chance of false positives. | 
 |  */ | 
 | extern long long dynamic_printk_enabled; | 
 | extern long long dynamic_printk_enabled2; | 
 |  | 
 | struct mod_debug { | 
 | 	char *modname; | 
 | 	char *logical_modname; | 
 | 	char *flag_names; | 
 | 	int type; | 
 | 	int hash; | 
 | 	int hash2; | 
 | } __attribute__((aligned(8))); | 
 |  | 
 | int register_dynamic_debug_module(char *mod_name, int type, char *share_name, | 
 | 					char *flags, int hash, int hash2); | 
 |  | 
 | #if defined(CONFIG_DYNAMIC_PRINTK_DEBUG) | 
 | extern int unregister_dynamic_debug_module(char *mod_name); | 
 | extern int __dynamic_dbg_enabled_helper(char *modname, int type, | 
 | 					int value, int hash); | 
 |  | 
 | #define __dynamic_dbg_enabled(module, type, value, level, hash)  ({	     \ | 
 | 	int __ret = 0;							     \ | 
 | 	if (unlikely((dynamic_printk_enabled & (1LL << DEBUG_HASH)) &&	     \ | 
 | 			(dynamic_printk_enabled2 & (1LL << DEBUG_HASH2))))   \ | 
 | 			__ret = __dynamic_dbg_enabled_helper(module, type,   \ | 
 | 								value, hash);\ | 
 | 	__ret; }) | 
 |  | 
 | #define dynamic_pr_debug(fmt, ...) do {					    \ | 
 | 	static char mod_name[]						    \ | 
 | 	__attribute__((section("__verbose_strings")))			    \ | 
 | 	 = KBUILD_MODNAME;						    \ | 
 | 	static struct mod_debug descriptor				    \ | 
 | 	__used								    \ | 
 | 	__attribute__((section("__verbose"), aligned(8))) =		    \ | 
 | 	{ mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\ | 
 | 	if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN,		    \ | 
 | 						0, 0, DEBUG_HASH))	    \ | 
 | 		printk(KERN_DEBUG KBUILD_MODNAME ":" fmt,		    \ | 
 | 				##__VA_ARGS__);				    \ | 
 | 	} while (0) | 
 |  | 
 | #define dynamic_dev_dbg(dev, format, ...) do {				    \ | 
 | 	static char mod_name[]						    \ | 
 | 	__attribute__((section("__verbose_strings")))			    \ | 
 | 	 = KBUILD_MODNAME;						    \ | 
 | 	static struct mod_debug descriptor				    \ | 
 | 	__used								    \ | 
 | 	__attribute__((section("__verbose"), aligned(8))) =		    \ | 
 | 	{ mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\ | 
 | 	if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN,		    \ | 
 | 						0, 0, DEBUG_HASH))	    \ | 
 | 			dev_printk(KERN_DEBUG, dev,			    \ | 
 | 					KBUILD_MODNAME ": " format,	    \ | 
 | 					##__VA_ARGS__);			    \ | 
 | 	} while (0) | 
 |  | 
 | #else | 
 |  | 
 | static inline int unregister_dynamic_debug_module(const char *mod_name) | 
 | { | 
 | 	return 0; | 
 | } | 
 | static inline int __dynamic_dbg_enabled_helper(char *modname, int type, | 
 | 						int value, int hash) | 
 | { | 
 | 	return 0; | 
 | } | 
 |  | 
 | #define __dynamic_dbg_enabled(module, type, value, level, hash)  ({ 0; }) | 
 | #define dynamic_pr_debug(fmt, ...)  do { } while (0) | 
 | #define dynamic_dev_dbg(dev, format, ...)  do { } while (0) | 
 | #endif | 
 |  | 
 | #endif |