Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : 3 : : /* 4 : : * This file provides wrappers with sanitizer instrumentation for atomic bit 5 : : * operations. 6 : : * 7 : : * To use this functionality, an arch's bitops.h file needs to define each of 8 : : * the below bit operations with an arch_ prefix (e.g. arch_set_bit(), 9 : : * arch___set_bit(), etc.). 10 : : */ 11 : : #ifndef _ASM_GENERIC_BITOPS_INSTRUMENTED_ATOMIC_H 12 : : #define _ASM_GENERIC_BITOPS_INSTRUMENTED_ATOMIC_H 13 : : 14 : : #include <linux/kasan-checks.h> 15 : : 16 : : /** 17 : : * set_bit - Atomically set a bit in memory 18 : : * @nr: the bit to set 19 : : * @addr: the address to start counting from 20 : : * 21 : : * This is a relaxed atomic operation (no implied memory barriers). 22 : : * 23 : : * Note that @nr may be almost arbitrarily large; this function is not 24 : : * restricted to acting on a single-word quantity. 25 : : */ 26 : 10735785 : static inline void set_bit(long nr, volatile unsigned long *addr) 27 : : { 28 [ # # ]: 10735785 : kasan_check_write(addr + BIT_WORD(nr), sizeof(long)); 29 [ + + ]: 10735785 : arch_set_bit(nr, addr); 30 : 10735029 : } 31 : : 32 : : /** 33 : : * clear_bit - Clears a bit in memory 34 : : * @nr: Bit to clear 35 : : * @addr: Address to start counting from 36 : : * 37 : : * This is a relaxed atomic operation (no implied memory barriers). 38 : : */ 39 : 5412086 : static inline void clear_bit(long nr, volatile unsigned long *addr) 40 : : { 41 [ # # ]: 5412086 : kasan_check_write(addr + BIT_WORD(nr), sizeof(long)); 42 [ + + ]: 5412086 : arch_clear_bit(nr, addr); 43 : 5412002 : } 44 : : 45 : : /** 46 : : * change_bit - Toggle a bit in memory 47 : : * @nr: Bit to change 48 : : * @addr: Address to start counting from 49 : : * 50 : : * This is a relaxed atomic operation (no implied memory barriers). 51 : : * 52 : : * Note that @nr may be almost arbitrarily large; this function is not 53 : : * restricted to acting on a single-word quantity. 54 : : */ 55 : : static inline void change_bit(long nr, volatile unsigned long *addr) 56 : : { 57 : : kasan_check_write(addr + BIT_WORD(nr), sizeof(long)); 58 : : arch_change_bit(nr, addr); 59 : : } 60 : : 61 : : /** 62 : : * test_and_set_bit - Set a bit and return its old value 63 : : * @nr: Bit to set 64 : : * @addr: Address to count from 65 : : * 66 : : * This is an atomic fully-ordered operation (implied full memory barrier). 67 : : */ 68 : 1442113 : static inline bool test_and_set_bit(long nr, volatile unsigned long *addr) 69 : : { 70 : 1442113 : kasan_check_write(addr + BIT_WORD(nr), sizeof(long)); 71 : 1442113 : return arch_test_and_set_bit(nr, addr); 72 : : } 73 : : 74 : : /** 75 : : * test_and_clear_bit - Clear a bit and return its old value 76 : : * @nr: Bit to clear 77 : : * @addr: Address to count from 78 : : * 79 : : * This is an atomic fully-ordered operation (implied full memory barrier). 80 : : */ 81 : 1748831 : static inline bool test_and_clear_bit(long nr, volatile unsigned long *addr) 82 : : { 83 : 1748831 : kasan_check_write(addr + BIT_WORD(nr), sizeof(long)); 84 : 1748831 : return arch_test_and_clear_bit(nr, addr); 85 : : } 86 : : 87 : : /** 88 : : * test_and_change_bit - Change a bit and return its old value 89 : : * @nr: Bit to change 90 : : * @addr: Address to count from 91 : : * 92 : : * This is an atomic fully-ordered operation (implied full memory barrier). 93 : : */ 94 : : static inline bool test_and_change_bit(long nr, volatile unsigned long *addr) 95 : : { 96 : : kasan_check_write(addr + BIT_WORD(nr), sizeof(long)); 97 : : return arch_test_and_change_bit(nr, addr); 98 : : } 99 : : 100 : : #endif /* _ASM_GENERIC_BITOPS_INSTRUMENTED_NON_ATOMIC_H */