cregit-Linux how code gets into the kernel

Release 4.15 include/linux/bitops.h

Directory: include/linux
/* SPDX-License-Identifier: GPL-2.0 */
#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) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h))))


#define GENMASK_ULL(h, l) \
	(((~0ULL) - (1ULL << (l)) + 1) & \
         (~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%

/** * assign_bit - Assign value to a bit in memory * @nr: the bit to set * @addr: the address to start counting from * @value: the value to assign */
static __always_inline void assign_bit(long nr, volatile unsigned long *addr, bool value) { if (value) set_bit(nr, addr); else clear_bit(nr, addr); }

Contributors

PersonTokensPropCommitsCommitProp
Lukas Wunner38100.00%1100.00%
Total38100.00%1100.00%


static __always_inline void __assign_bit(long nr, volatile unsigned long *addr, bool value) { if (value) __set_bit(nr, addr); else __clear_bit(nr, addr); }

Contributors

PersonTokensPropCommitsCommitProp
Lukas Wunner38100.00%1100.00%
Total38100.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 = READ_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 = READ_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 Harrison12814.37%12.44%
zijun_hu9310.44%12.44%
Lukas Wunner778.64%12.44%
Alexey Dobriyan647.18%12.44%
Steven Whitehouse637.07%12.44%
Matt Mackall616.85%24.88%
Andrew Morton606.73%24.88%
Akinobu Mita455.05%512.20%
Borislav Petkov394.38%12.44%
Martin Kepplinger343.82%24.88%
Andreas Herrmann323.59%12.44%
Jiri Slaby303.37%24.88%
Pavel Machek252.81%12.44%
Srinivas Pandruvada212.36%12.44%
Rusty Russell182.02%12.44%
Chen Gong171.91%12.44%
Guoqing Jiang161.80%12.44%
Theodore Y. Ts'o161.80%12.44%
Shannon Nelson101.12%12.44%
Linus Torvalds (pre-git)80.90%12.44%
Eric Dumazet70.79%12.44%
David Howells40.45%12.44%
Sasha Levin40.45%12.44%
Alexander van Heukelum40.45%12.44%
Maxime Coquelin20.22%12.44%
Robert Richter20.22%12.44%
Robert P. J. Day20.22%12.44%
Denys Vlasenko20.22%12.44%
Matthias Kaehlcke20.22%12.44%
Mark Rutland20.22%12.44%
Greg Kroah-Hartman10.11%12.44%
Yoshinori Sato10.11%12.44%
Yury Norov10.11%12.44%
Total891100.00%41100.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.