mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-06 05:13:18 +00:00
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
@ -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…
Reference in New Issue
Block a user