Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _LINUX_PART_STAT_H
0003 #define _LINUX_PART_STAT_H
0004 
0005 #include <linux/blkdev.h>
0006 #include <asm/local.h>
0007 
0008 struct disk_stats {
0009     u64 nsecs[NR_STAT_GROUPS];
0010     unsigned long sectors[NR_STAT_GROUPS];
0011     unsigned long ios[NR_STAT_GROUPS];
0012     unsigned long merges[NR_STAT_GROUPS];
0013     unsigned long io_ticks;
0014     local_t in_flight[2];
0015 };
0016 
0017 /*
0018  * Macros to operate on percpu disk statistics:
0019  *
0020  * {disk|part|all}_stat_{add|sub|inc|dec}() modify the stat counters and should
0021  * be called between disk_stat_lock() and disk_stat_unlock().
0022  *
0023  * part_stat_read() can be called at any time.
0024  */
0025 #define part_stat_lock()    preempt_disable()
0026 #define part_stat_unlock()  preempt_enable()
0027 
0028 #define part_stat_get_cpu(part, field, cpu)             \
0029     (per_cpu_ptr((part)->bd_stats, (cpu))->field)
0030 
0031 #define part_stat_get(part, field)                  \
0032     part_stat_get_cpu(part, field, smp_processor_id())
0033 
0034 #define part_stat_read(part, field)                 \
0035 ({                                  \
0036     typeof((part)->bd_stats->field) res = 0;            \
0037     unsigned int _cpu;                      \
0038     for_each_possible_cpu(_cpu)                 \
0039         res += per_cpu_ptr((part)->bd_stats, _cpu)->field; \
0040     res;                                \
0041 })
0042 
0043 static inline void part_stat_set_all(struct block_device *part, int value)
0044 {
0045     int i;
0046 
0047     for_each_possible_cpu(i)
0048         memset(per_cpu_ptr(part->bd_stats, i), value,
0049                 sizeof(struct disk_stats));
0050 }
0051 
0052 #define part_stat_read_accum(part, field)               \
0053     (part_stat_read(part, field[STAT_READ]) +           \
0054      part_stat_read(part, field[STAT_WRITE]) +          \
0055      part_stat_read(part, field[STAT_DISCARD]))
0056 
0057 #define __part_stat_add(part, field, addnd)             \
0058     __this_cpu_add((part)->bd_stats->field, addnd)
0059 
0060 #define part_stat_add(part, field, addnd)   do {            \
0061     __part_stat_add((part), field, addnd);              \
0062     if ((part)->bd_partno)                      \
0063         __part_stat_add(bdev_whole(part), field, addnd);    \
0064 } while (0)
0065 
0066 #define part_stat_dec(part, field)                  \
0067     part_stat_add(part, field, -1)
0068 #define part_stat_inc(part, field)                  \
0069     part_stat_add(part, field, 1)
0070 #define part_stat_sub(part, field, subnd)               \
0071     part_stat_add(part, field, -subnd)
0072 
0073 #define part_stat_local_dec(part, field)                \
0074     local_dec(&(part_stat_get(part, field)))
0075 #define part_stat_local_inc(part, field)                \
0076     local_inc(&(part_stat_get(part, field)))
0077 #define part_stat_local_read(part, field)               \
0078     local_read(&(part_stat_get(part, field)))
0079 #define part_stat_local_read_cpu(part, field, cpu)          \
0080     local_read(&(part_stat_get_cpu(part, field, cpu)))
0081 
0082 #endif /* _LINUX_PART_STAT_H */