posix_types: Remove fd_set macros
<asm/posix_types.h> includes a set of macros that operate on file descriptors. Way long ago those were exported to user space, but nowadays they are #ifdef __KERNEL__. However, they are nothing but standard (nonatomic) bit operations, and we already have optimized versions of bit operations in the kernel. We can't include <linux/bitops.h> in <asm/posix_types.h> but we can move the definitions to <linux/time.h> and define them there in terms of standard kernel bitops. [ v2: folds the following fixes in: a) Stray space in __FD_SET(), reported by Andrew Morton b) #include <linux/string.h> needed for memset(), reported by Tony Luck ] Signed-off-by: H. Peter Anvin <hpa@zytor.com> Link: http://lkml.kernel.org/r/1328677745-20121-22-git-send-email-hpa@zytor.com Cc: Arnd Bergmann <arnd@arndb.de> Cc: Tony Luck <tony.luck@intel.com> Cc: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
		
					parent
					
						
							
								2759e6512e
							
						
					
				
			
			
				commit
				
					
						8b3d1cda4f
					
				
			
		
					 2 changed files with 24 additions and 72 deletions
				
			
		|  | @ -92,76 +92,4 @@ typedef char *		__kernel_caddr_t; | ||||||
| typedef unsigned short	__kernel_uid16_t; | typedef unsigned short	__kernel_uid16_t; | ||||||
| typedef unsigned short	__kernel_gid16_t; | typedef unsigned short	__kernel_gid16_t; | ||||||
| 
 | 
 | ||||||
| #ifdef __KERNEL__ |  | ||||||
| 
 |  | ||||||
| #undef __FD_SET |  | ||||||
| static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) |  | ||||||
| { |  | ||||||
| 	unsigned long __tmp = __fd / __NFDBITS; |  | ||||||
| 	unsigned long __rem = __fd % __NFDBITS; |  | ||||||
| 	__fdsetp->fds_bits[__tmp] |= (1UL<<__rem); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #undef __FD_CLR |  | ||||||
| static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) |  | ||||||
| { |  | ||||||
| 	unsigned long __tmp = __fd / __NFDBITS; |  | ||||||
| 	unsigned long __rem = __fd % __NFDBITS; |  | ||||||
| 	__fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #undef __FD_ISSET |  | ||||||
| static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) |  | ||||||
| { |  | ||||||
| 	unsigned long __tmp = __fd / __NFDBITS; |  | ||||||
| 	unsigned long __rem = __fd % __NFDBITS; |  | ||||||
| 	return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * This will unroll the loop for the normal constant case (8 ints, |  | ||||||
|  * for a 256-bit fd_set) |  | ||||||
|  */ |  | ||||||
| #undef __FD_ZERO |  | ||||||
| static inline void __FD_ZERO(__kernel_fd_set *__p) |  | ||||||
| { |  | ||||||
| 	unsigned long *__tmp = __p->fds_bits; |  | ||||||
| 	int __i; |  | ||||||
| 
 |  | ||||||
| 	if (__builtin_constant_p(__FDSET_LONGS)) { |  | ||||||
| 		switch (__FDSET_LONGS) { |  | ||||||
| 		case 16: |  | ||||||
| 			__tmp[ 0] = 0; __tmp[ 1] = 0; |  | ||||||
| 			__tmp[ 2] = 0; __tmp[ 3] = 0; |  | ||||||
| 			__tmp[ 4] = 0; __tmp[ 5] = 0; |  | ||||||
| 			__tmp[ 6] = 0; __tmp[ 7] = 0; |  | ||||||
| 			__tmp[ 8] = 0; __tmp[ 9] = 0; |  | ||||||
| 			__tmp[10] = 0; __tmp[11] = 0; |  | ||||||
| 			__tmp[12] = 0; __tmp[13] = 0; |  | ||||||
| 			__tmp[14] = 0; __tmp[15] = 0; |  | ||||||
| 			return; |  | ||||||
| 
 |  | ||||||
| 		case 8: |  | ||||||
| 			__tmp[ 0] = 0; __tmp[ 1] = 0; |  | ||||||
| 			__tmp[ 2] = 0; __tmp[ 3] = 0; |  | ||||||
| 			__tmp[ 4] = 0; __tmp[ 5] = 0; |  | ||||||
| 			__tmp[ 6] = 0; __tmp[ 7] = 0; |  | ||||||
| 			return; |  | ||||||
| 
 |  | ||||||
| 		case 4: |  | ||||||
| 			__tmp[ 0] = 0; __tmp[ 1] = 0; |  | ||||||
| 			__tmp[ 2] = 0; __tmp[ 3] = 0; |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	__i = __FDSET_LONGS; |  | ||||||
| 	while (__i) { |  | ||||||
| 		__i--; |  | ||||||
| 		*__tmp = 0; |  | ||||||
| 		__tmp++; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #endif /* __KERNEL__ */ |  | ||||||
| 
 |  | ||||||
| #endif /* __ASM_GENERIC_POSIX_TYPES_H */ | #endif /* __ASM_GENERIC_POSIX_TYPES_H */ | ||||||
|  |  | ||||||
|  | @ -4,8 +4,11 @@ | ||||||
| #include <linux/types.h> | #include <linux/types.h> | ||||||
| 
 | 
 | ||||||
| #ifdef __KERNEL__ | #ifdef __KERNEL__ | ||||||
|  | # include <linux/bitops.h> | ||||||
| # include <linux/cache.h> | # include <linux/cache.h> | ||||||
|  | # include <linux/posix_types.h> | ||||||
| # include <linux/seqlock.h> | # include <linux/seqlock.h> | ||||||
|  | # include <linux/string.h> | ||||||
| # include <linux/math64.h> | # include <linux/math64.h> | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | @ -256,6 +259,27 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns) | ||||||
| 	a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns); | 	a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns); | ||||||
| 	a->tv_nsec = ns; | 	a->tv_nsec = ns; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) | ||||||
|  | { | ||||||
|  | 	__set_bit(__fd, __fdsetp->fds_bits); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) | ||||||
|  | { | ||||||
|  | 	__clear_bit(__fd, __fdsetp->fds_bits); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__fdsetp) | ||||||
|  | { | ||||||
|  | 	return test_bit(__fd, __fdsetp->fds_bits); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static inline void __FD_ZERO(__kernel_fd_set *__fdsetp) | ||||||
|  | { | ||||||
|  | 	memset(__fdsetp->fds_bits, 0, sizeof __fdsetp->fds_bits); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #endif /* __KERNEL__ */ | #endif /* __KERNEL__ */ | ||||||
| 
 | 
 | ||||||
| #define NFDBITS			__NFDBITS | #define NFDBITS			__NFDBITS | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 H. Peter Anvin
				H. Peter Anvin