LCOV - code coverage report
Current view: top level - include/asm-generic/bitops - instrumented-atomic.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 14 14 100.0 %
Date: 2021-04-22 12:43:58 Functions: 4 4 100.0 %

          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/instrumented.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      382058 : static inline void set_bit(long nr, volatile unsigned long *addr)
      27             : {
      28      382058 :         instrument_atomic_write(addr + BIT_WORD(nr), sizeof(long));
      29      382072 :         arch_set_bit(nr, addr);
      30      382133 : }
      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      273706 : static inline void clear_bit(long nr, volatile unsigned long *addr)
      40             : {
      41      273706 :         instrument_atomic_write(addr + BIT_WORD(nr), sizeof(long));
      42      273716 :         arch_clear_bit(nr, addr);
      43      273830 : }
      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             :         instrument_atomic_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       82548 : static inline bool test_and_set_bit(long nr, volatile unsigned long *addr)
      69             : {
      70       82548 :         instrument_atomic_read_write(addr + BIT_WORD(nr), sizeof(long));
      71       82542 :         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      174369 : static inline bool test_and_clear_bit(long nr, volatile unsigned long *addr)
      82             : {
      83      174369 :         instrument_atomic_read_write(addr + BIT_WORD(nr), sizeof(long));
      84      174387 :         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             :         instrument_atomic_read_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 */

Generated by: LCOV version 1.14