lib/bsearch: Provide __always_inline variant
For code that needs the ultimate performance (it can inline the @cmp function too) or simply needs to avoid calling external functions for whatever reason, provide an __always_inline variant of bsearch(). [ tglx: Renamed to __inline_bsearch() as suggested by Andy ] Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com> Acked-by: Andy Lutomirski <luto@kernel.org> Link: https://lkml.kernel.org/r/20200505135313.624443814@linutronix.de
This commit is contained in:
		
							parent
							
								
									ef882bfef9
								
							
						
					
					
						commit
						df65bba1dc
					
				| @ -4,7 +4,29 @@ | ||||
| 
 | ||||
| #include <linux/types.h> | ||||
| 
 | ||||
| void *bsearch(const void *key, const void *base, size_t num, size_t size, | ||||
| 	      cmp_func_t cmp); | ||||
| static __always_inline | ||||
| void *__inline_bsearch(const void *key, const void *base, size_t num, size_t size, cmp_func_t cmp) | ||||
| { | ||||
| 	const char *pivot; | ||||
| 	int result; | ||||
| 
 | ||||
| 	while (num > 0) { | ||||
| 		pivot = base + (num >> 1) * size; | ||||
| 		result = cmp(key, pivot); | ||||
| 
 | ||||
| 		if (result == 0) | ||||
| 			return (void *)pivot; | ||||
| 
 | ||||
| 		if (result > 0) { | ||||
| 			base = pivot + size; | ||||
| 			num--; | ||||
| 		} | ||||
| 		num >>= 1; | ||||
| 	} | ||||
| 
 | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| extern void *bsearch(const void *key, const void *base, size_t num, size_t size, cmp_func_t cmp); | ||||
| 
 | ||||
| #endif /* _LINUX_BSEARCH_H */ | ||||
|  | ||||
| @ -28,27 +28,9 @@ | ||||
|  * the key and elements in the array are of the same type, you can use | ||||
|  * the same comparison function for both sort() and bsearch(). | ||||
|  */ | ||||
| void *bsearch(const void *key, const void *base, size_t num, size_t size, | ||||
| 	      cmp_func_t cmp) | ||||
| void *bsearch(const void *key, const void *base, size_t num, size_t size, cmp_func_t cmp) | ||||
| { | ||||
| 	const char *pivot; | ||||
| 	int result; | ||||
| 
 | ||||
| 	while (num > 0) { | ||||
| 		pivot = base + (num >> 1) * size; | ||||
| 		result = cmp(key, pivot); | ||||
| 
 | ||||
| 		if (result == 0) | ||||
| 			return (void *)pivot; | ||||
| 
 | ||||
| 		if (result > 0) { | ||||
| 			base = pivot + size; | ||||
| 			num--; | ||||
| 		} | ||||
| 		num >>= 1; | ||||
| 	} | ||||
| 
 | ||||
| 	return NULL; | ||||
| 	return __inline_bsearch(key, base, num, size, cmp); | ||||
| } | ||||
| EXPORT_SYMBOL(bsearch); | ||||
| NOKPROBE_SYMBOL(bsearch); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user