Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+24 -72
-72
include/asm-generic/posix_types.h
··· 92 92 typedef unsigned short __kernel_uid16_t; 93 93 typedef unsigned short __kernel_gid16_t; 94 94 95 - #ifdef __KERNEL__ 96 - 97 - #undef __FD_SET 98 - static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) 99 - { 100 - unsigned long __tmp = __fd / __NFDBITS; 101 - unsigned long __rem = __fd % __NFDBITS; 102 - __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); 103 - } 104 - 105 - #undef __FD_CLR 106 - static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) 107 - { 108 - unsigned long __tmp = __fd / __NFDBITS; 109 - unsigned long __rem = __fd % __NFDBITS; 110 - __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); 111 - } 112 - 113 - #undef __FD_ISSET 114 - static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) 115 - { 116 - unsigned long __tmp = __fd / __NFDBITS; 117 - unsigned long __rem = __fd % __NFDBITS; 118 - return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; 119 - } 120 - 121 - /* 122 - * This will unroll the loop for the normal constant case (8 ints, 123 - * for a 256-bit fd_set) 124 - */ 125 - #undef __FD_ZERO 126 - static inline void __FD_ZERO(__kernel_fd_set *__p) 127 - { 128 - unsigned long *__tmp = __p->fds_bits; 129 - int __i; 130 - 131 - if (__builtin_constant_p(__FDSET_LONGS)) { 132 - switch (__FDSET_LONGS) { 133 - case 16: 134 - __tmp[ 0] = 0; __tmp[ 1] = 0; 135 - __tmp[ 2] = 0; __tmp[ 3] = 0; 136 - __tmp[ 4] = 0; __tmp[ 5] = 0; 137 - __tmp[ 6] = 0; __tmp[ 7] = 0; 138 - __tmp[ 8] = 0; __tmp[ 9] = 0; 139 - __tmp[10] = 0; __tmp[11] = 0; 140 - __tmp[12] = 0; __tmp[13] = 0; 141 - __tmp[14] = 0; __tmp[15] = 0; 142 - return; 143 - 144 - case 8: 145 - __tmp[ 0] = 0; __tmp[ 1] = 0; 146 - __tmp[ 2] = 0; __tmp[ 3] = 0; 147 - __tmp[ 4] = 0; __tmp[ 5] = 0; 148 - __tmp[ 6] = 0; __tmp[ 7] = 0; 149 - return; 150 - 151 - case 4: 152 - __tmp[ 0] = 0; __tmp[ 1] = 0; 153 - __tmp[ 2] = 0; __tmp[ 3] = 0; 154 - return; 155 - } 156 - } 157 - __i = __FDSET_LONGS; 158 - while (__i) { 159 - __i--; 160 - *__tmp = 0; 161 - __tmp++; 162 - } 163 - } 164 - 165 - #endif /* __KERNEL__ */ 166 - 167 95 #endif /* __ASM_GENERIC_POSIX_TYPES_H */
+24
include/linux/time.h
··· 4 4 #include <linux/types.h> 5 5 6 6 #ifdef __KERNEL__ 7 + # include <linux/bitops.h> 7 8 # include <linux/cache.h> 9 + # include <linux/posix_types.h> 8 10 # include <linux/seqlock.h> 11 + # include <linux/string.h> 9 12 # include <linux/math64.h> 10 13 #endif 11 14 ··· 259 256 a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns); 260 257 a->tv_nsec = ns; 261 258 } 259 + 260 + static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) 261 + { 262 + __set_bit(__fd, __fdsetp->fds_bits); 263 + } 264 + 265 + static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) 266 + { 267 + __clear_bit(__fd, __fdsetp->fds_bits); 268 + } 269 + 270 + static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__fdsetp) 271 + { 272 + return test_bit(__fd, __fdsetp->fds_bits); 273 + } 274 + 275 + static inline void __FD_ZERO(__kernel_fd_set *__fdsetp) 276 + { 277 + memset(__fdsetp->fds_bits, 0, sizeof __fdsetp->fds_bits); 278 + } 279 + 262 280 #endif /* __KERNEL__ */ 263 281 264 282 #define NFDBITS __NFDBITS