cregit-Linux how code gets into the kernel

Release 4.12 include/linux/bitops.h

Directory: include/linux
#ifndef _LINUX_BITOPS_H

#define _LINUX_BITOPS_H
#include <asm/types.h>

#ifdef	__KERNEL__

#define BIT(nr)			(1UL << (nr))

#define BIT_ULL(nr)		(1ULL << (nr))

#define BIT_MASK(nr)		(1UL << ((nr) % BITS_PER_LONG))

#define BIT_WORD(nr)		((nr) / BITS_PER_LONG)

#define BIT_ULL_MASK(nr)	(1ULL << ((nr) % BITS_PER_LONG_LONG))

#define BIT_ULL_WORD(nr)	((nr) / BITS_PER_LONG_LONG)

#define BITS_PER_BYTE		8

#define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
#endif

/*
 * Create a contiguous bitmask starting at bit position @l and ending at
 * position @h. For example
 * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
 */

#define GENMASK(h, l) \
	(((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))


#define GENMASK_ULL(h, l) \
	(((~0ULL) << (l)) & (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h))))

extern unsigned int __sw_hweight8(unsigned int w);
extern unsigned int __sw_hweight16(unsigned int w);
extern unsigned int __sw_hweight32(unsigned int w);
extern unsigned long __sw_hweight64(__u64 w);

/*
 * Include this here because some architectures need generic_ffs/fls in
 * scope
 */
#include <asm/bitops.h>


#define for_each_set_bit(bit, addr, size) \
	for ((bit) = find_first_bit((addr), (size));            \
             (bit) < (size);                                    \
             (bit) = find_next_bit((addr), (size), (bit) + 1))

/* same as for_each_set_bit() but use bit as value to start with */

#define for_each_set_bit_from(bit, addr, size) \
	for ((bit) = find_next_bit((addr), (size), (bit));      \
             (bit) < (size);                                    \
             (bit) = find_next_bit((addr), (size), (bit) + 1))


#define for_each_clear_bit(bit, addr, size) \
	for ((bit) = find_first_zero_bit((addr), (size));       \
             (bit) < (size);                                    \
             (bit) = find_next_zero_bit((addr), (size), (bit) + 1))

/* same as for_each_clear_bit() but use bit as value to start with */

#define for_each_clear_bit_from(bit, addr, size) \
	for ((bit) = find_next_zero_bit((addr), (size), (bit)); \
             (bit) < (size);                                    \
             (bit) = find_next_zero_bit((addr), (size), (bit) + 1))


static inline int get_bitmask_order(unsigned int count) { int order; order = fls(count); return order; /* We could be slightly more clever with -1 here... */ }

Contributors

PersonTokensPropCommitsCommitProp
Pavel Machek2392.00%133.33%
Yoshinori Sato14.00%133.33%
Denys Vlasenko14.00%133.33%
Total25100.00%3100.00%


static __always_inline unsigned long hweight_long(unsigned long w) { return sizeof(w) == 4 ? hweight32(w) : hweight64(w); }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton2790.00%133.33%
Akinobu Mita26.67%133.33%
Denys Vlasenko13.33%133.33%
Total30100.00%3100.00%

/** * rol64 - rotate a 64-bit value left * @word: value to rotate * @shift: bits to roll */
static inline __u64 rol64(__u64 word, unsigned int shift) { return (word << shift) | (word >> (64 - shift)); }

Contributors

PersonTokensPropCommitsCommitProp
Alexey Dobriyan31100.00%1100.00%
Total31100.00%1100.00%

/** * ror64 - rotate a 64-bit value right * @word: value to rotate * @shift: bits to roll */
static inline __u64 ror64(__u64 word, unsigned int shift) { return (word >> shift) | (word << (64 - shift)); }

Contributors

PersonTokensPropCommitsCommitProp
Alexey Dobriyan31100.00%1100.00%
Total31100.00%1100.00%

/** * rol32 - rotate a 32-bit value left * @word: value to rotate * @shift: bits to roll */
static inline __u32 rol32(__u32 word, unsigned int shift) { return (word << shift) | (word >> ((-shift) & 31)); }

Contributors

PersonTokensPropCommitsCommitProp
Matt Mackall3088.24%266.67%
Sasha Levin411.76%133.33%
Total34100.00%3100.00%

/** * ror32 - rotate a 32-bit value right * @word: value to rotate * @shift: bits to roll */
static inline __u32 ror32(__u32 word, unsigned int shift) { return (word >> shift) | (word << (32 - shift)); }

Contributors

PersonTokensPropCommitsCommitProp
Matt Mackall31100.00%2100.00%
Total31100.00%2100.00%

/** * rol16 - rotate a 16-bit value left * @word: value to rotate * @shift: bits to roll */
static inline __u16 rol16(__u16 word, unsigned int shift) { return (word << shift) | (word >> (16 - shift)); }

Contributors

PersonTokensPropCommitsCommitProp
Harvey Harrison31100.00%1100.00%
Total31100.00%1100.00%

/** * ror16 - rotate a 16-bit value right * @word: value to rotate * @shift: bits to roll */
static inline __u16 ror16(__u16 word, unsigned int shift) { return (word >> shift) | (word << (16 - shift)); }

Contributors

PersonTokensPropCommitsCommitProp
Harvey Harrison31100.00%1100.00%
Total31100.00%1100.00%

/** * rol8 - rotate an 8-bit value left * @word: value to rotate * @shift: bits to roll */
static inline __u8 rol8(__u8 word, unsigned int shift) { return (word << shift) | (word >> (8 - shift)); }

Contributors

PersonTokensPropCommitsCommitProp
Harvey Harrison31100.00%1100.00%
Total31100.00%1100.00%

/** * ror8 - rotate an 8-bit value right * @word: value to rotate * @shift: bits to roll */
static inline __u8 ror8(__u8 word, unsigned int shift) { return (word >> shift) | (word << (8 - shift)); }

Contributors

PersonTokensPropCommitsCommitProp
Harvey Harrison31100.00%1100.00%
Total31100.00%1100.00%

/** * sign_extend32 - sign extend a 32-bit value using specified bit as sign-bit * @value: value to sign extend * @index: 0 based bit index (0<=index<32) to sign bit * * This is safe to use for 16- and 8-bit types as well. */
static inline __s32 sign_extend32(__u32 value, int index) { __u8 shift = 31 - index; return (__s32)(value << shift) >> shift; }

Contributors

PersonTokensPropCommitsCommitProp
Andreas Herrmann2475.00%150.00%
Martin Kepplinger825.00%150.00%
Total32100.00%2100.00%

/** * sign_extend64 - sign extend a 64-bit value using specified bit as sign-bit * @value: value to sign extend * @index: 0 based bit index (0<=index<64) to sign bit */
static inline __s64 sign_extend64(__u64 value, int index) { __u8 shift = 63 - index; return (__s64)(value << shift) >> shift; }

Contributors

PersonTokensPropCommitsCommitProp
Martin Kepplinger2475.00%150.00%
Andreas Herrmann825.00%150.00%
Total32100.00%2100.00%


static inline unsigned fls_long(unsigned long l) { if (sizeof(l) == 4) return fls(l); return fls64(l); }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton32100.00%1100.00%
Total32100.00%1100.00%


static inline int get_count_order(unsigned int count) { int order; order = fls(count) - 1; if (count & (count - 1)) order++; return order; }

Contributors

PersonTokensPropCommitsCommitProp
zijun_hu39100.00%1100.00%
Total39100.00%1100.00%

/** * get_count_order_long - get order after rounding @l up to power of 2 * @l: parameter * * it is same as get_count_order() but with long type parameter */
static inline int get_count_order_long(unsigned long l) { if (l == 0UL) return -1; else if (l & (l - 1UL)) return (int)fls_long(l); else return (int)fls_long(l) - 1; }

Contributors

PersonTokensPropCommitsCommitProp
zijun_hu53100.00%1100.00%
Total53100.00%1100.00%

/** * __ffs64 - find first set bit in a 64 bit word * @word: The 64 bit word * * On 64 bit arches this is a synomyn for __ffs * The result is not defined if no bits are set, so check that @word * is non-zero before calling this. */
static inline unsigned long __ffs64(u64 word) { #if BITS_PER_LONG == 32 if (((u32)word) == 0UL) return __ffs((u32)(word >> 32)) + 32; #elif BITS_PER_LONG != 64 #error BITS_PER_LONG not 32 or 64 #endif return __ffs((unsigned long)word); }

Contributors

PersonTokensPropCommitsCommitProp
Steven Whitehouse62100.00%1100.00%
Total62100.00%1100.00%

#ifdef __KERNEL__ #ifndef set_mask_bits #define set_mask_bits(ptr, _mask, _bits) \ ({ \ const typeof(*ptr) mask = (_mask), bits = (_bits); \ typeof(*ptr) old, new; \ \ do { \ old = ACCESS_ONCE(*ptr); \ new = (old & ~mask) | bits; \ } while (cmpxchg(ptr, old, new) != old); \ \ new; \ }) #endif #ifndef bit_clear_unless #define bit_clear_unless(ptr, _clear, _test) \ ({ \ const typeof(*ptr) clear = (_clear), test = (_test); \ typeof(*ptr) old, new; \ \ do { \ old = ACCESS_ONCE(*ptr); \ new = old & ~clear; \ } while (!(old & test) && \ cmpxchg(ptr, old, new) != old); \ \ !(old & test); \ }) #endif #ifndef find_last_bit /** * find_last_bit - find the last set bit in a memory region * @addr: The address to start the search at * @size: The number of bits to search * * Returns the bit number of the last set bit, or size. */ extern unsigned long find_last_bit(const unsigned long *addr, unsigned long size); #endif #endif /* __KERNEL__ */ #endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Harvey Harrison12815.74%12.70%
zijun_hu9311.44%12.70%
Alexey Dobriyan647.87%12.70%
Steven Whitehouse637.75%12.70%
Matt Mackall617.50%25.41%
Andrew Morton607.38%25.41%
Akinobu Mita455.54%513.51%
Borislav Petkov394.80%12.70%
Martin Kepplinger344.18%25.41%
Andreas Herrmann323.94%12.70%
Jiri Slaby303.69%25.41%
Pavel Machek253.08%12.70%
Srinivas Pandruvada212.58%12.70%
Rusty Russell182.21%12.70%
Theodore Y. Ts'o172.09%12.70%
Chen Gong172.09%12.70%
Guoqing Jiang172.09%12.70%
Shannon Nelson101.23%12.70%
Linus Torvalds (pre-git)80.98%12.70%
Eric Dumazet70.86%12.70%
David Howells40.49%12.70%
Alexander van Heukelum40.49%12.70%
Sasha Levin40.49%12.70%
Maxime Coquelin40.49%12.70%
Robert P. J. Day20.25%12.70%
Denys Vlasenko20.25%12.70%
Robert Richter20.25%12.70%
Yoshinori Sato10.12%12.70%
Yury Norov10.12%12.70%
Total813100.00%37100.00%
Directory: include/linux
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.