37 lines
		
	
	
		
			708 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			708 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #ifndef PERF_CACHELINE_H
 | |
| #define PERF_CACHELINE_H
 | |
| 
 | |
| #include <linux/compiler.h>
 | |
| 
 | |
| int __pure cacheline_size(void);
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * Some architectures have 'Adjacent Cacheline Prefetch' feature,
 | |
|  * which performs like the cacheline size being doubled.
 | |
|  */
 | |
| static inline u64 cl_address(u64 address, bool double_cl)
 | |
| {
 | |
| 	u64 size = cacheline_size();
 | |
| 
 | |
| 	if (double_cl)
 | |
| 		size *= 2;
 | |
| 
 | |
| 	/* return the cacheline of the address */
 | |
| 	return (address & ~(size - 1));
 | |
| }
 | |
| 
 | |
| static inline u64 cl_offset(u64 address, bool double_cl)
 | |
| {
 | |
| 	u64 size = cacheline_size();
 | |
| 
 | |
| 	if (double_cl)
 | |
| 		size *= 2;
 | |
| 
 | |
| 	/* return the offset inside cacheline */
 | |
| 	return (address & (size - 1));
 | |
| }
 | |
| 
 | |
| #endif // PERF_CACHELINE_H
 |