forked from mirrors/linux
		
	libbpf: remove dependency on barrier.h in xsk.h
The use of smp_rmb() and smp_wmb() creates a Linux header dependency
on barrier.h that is unnecessary in most parts. This patch implements
the two small defines that are needed from barrier.h. As a bonus, the
new implementations are faster than the default ones as they default
to sfence and lfence for x86, while we only need a compiler barrier in
our case. Just as it is when the same ring access code is compiled in
the kernel.
Fixes: 1cad078842 ("libbpf: add support for using AF_XDP sockets")
Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									a06d729646
								
							
						
					
					
						commit
						b7e3a28019
					
				
					 2 changed files with 29 additions and 3 deletions
				
			
		|  | @ -23,6 +23,31 @@ do {				\ | ||||||
| #define pr_info(fmt, ...)	__pr(LIBBPF_INFO, fmt, ##__VA_ARGS__) | #define pr_info(fmt, ...)	__pr(LIBBPF_INFO, fmt, ##__VA_ARGS__) | ||||||
| #define pr_debug(fmt, ...)	__pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__) | #define pr_debug(fmt, ...)	__pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__) | ||||||
| 
 | 
 | ||||||
|  | /* Use these barrier functions instead of smp_[rw]mb() when they are
 | ||||||
|  |  * used in a libbpf header file. That way they can be built into the | ||||||
|  |  * application that uses libbpf. | ||||||
|  |  */ | ||||||
|  | #if defined(__i386__) || defined(__x86_64__) | ||||||
|  | # define libbpf_smp_rmb() asm volatile("" : : : "memory") | ||||||
|  | # define libbpf_smp_wmb() asm volatile("" : : : "memory") | ||||||
|  | # define libbpf_smp_mb() \ | ||||||
|  | 	asm volatile("lock; addl $0,-4(%%rsp)" : : : "memory", "cc") | ||||||
|  | #elif defined(__aarch64__) | ||||||
|  | # define libbpf_smp_rmb() asm volatile("dmb ishld" : : : "memory") | ||||||
|  | # define libbpf_smp_wmb() asm volatile("dmb ishst" : : : "memory") | ||||||
|  | # define libbpf_smp_mb() asm volatile("dmb ish" : : : "memory") | ||||||
|  | #elif defined(__arm__) | ||||||
|  | /* These are only valid for armv7 and above */ | ||||||
|  | # define libbpf_smp_rmb() asm volatile("dmb ish" : : : "memory") | ||||||
|  | # define libbpf_smp_wmb() asm volatile("dmb ishst" : : : "memory") | ||||||
|  | # define libbpf_smp_mb() asm volatile("dmb ish" : : : "memory") | ||||||
|  | #else | ||||||
|  | # warning Architecture missing native barrier functions in libbpf_util.h. | ||||||
|  | # define libbpf_smp_rmb() __sync_synchronize() | ||||||
|  | # define libbpf_smp_wmb() __sync_synchronize() | ||||||
|  | # define libbpf_smp_mb() __sync_synchronize() | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } /* extern "C" */ | } /* extern "C" */ | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ | ||||||
| #include <linux/if_xdp.h> | #include <linux/if_xdp.h> | ||||||
| 
 | 
 | ||||||
| #include "libbpf.h" | #include "libbpf.h" | ||||||
|  | #include "libbpf_util.h" | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
|  | @ -123,7 +124,7 @@ static inline void xsk_ring_prod__submit(struct xsk_ring_prod *prod, size_t nb) | ||||||
| 	/* Make sure everything has been written to the ring before indicating
 | 	/* Make sure everything has been written to the ring before indicating
 | ||||||
| 	 * this to the kernel by writing the producer pointer. | 	 * this to the kernel by writing the producer pointer. | ||||||
| 	 */ | 	 */ | ||||||
| 	smp_wmb(); | 	libbpf_smp_wmb(); | ||||||
| 
 | 
 | ||||||
| 	*prod->producer += nb; | 	*prod->producer += nb; | ||||||
| } | } | ||||||
|  | @ -137,7 +138,7 @@ static inline size_t xsk_ring_cons__peek(struct xsk_ring_cons *cons, | ||||||
| 		/* Make sure we do not speculatively read the data before
 | 		/* Make sure we do not speculatively read the data before
 | ||||||
| 		 * we have received the packet buffers from the ring. | 		 * we have received the packet buffers from the ring. | ||||||
| 		 */ | 		 */ | ||||||
| 		smp_rmb(); | 		libbpf_smp_rmb(); | ||||||
| 
 | 
 | ||||||
| 		*idx = cons->cached_cons; | 		*idx = cons->cached_cons; | ||||||
| 		cons->cached_cons += entries; | 		cons->cached_cons += entries; | ||||||
|  | @ -151,7 +152,7 @@ static inline void xsk_ring_cons__release(struct xsk_ring_cons *cons, size_t nb) | ||||||
| 	/* Make sure data has been read before indicating we are done
 | 	/* Make sure data has been read before indicating we are done
 | ||||||
| 	 * with the entries by updating the consumer pointer. | 	 * with the entries by updating the consumer pointer. | ||||||
| 	 */ | 	 */ | ||||||
| 	smp_mb(); | 	libbpf_smp_mb(); | ||||||
| 
 | 
 | ||||||
| 	*cons->consumer += nb; | 	*cons->consumer += nb; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Magnus Karlsson
						Magnus Karlsson