Commit | Line | Data |
---|---|---|
c6a564ff CH |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _LINUX_PART_STAT_H | |
3 | #define _LINUX_PART_STAT_H | |
4 | ||
322cbb50 | 5 | #include <linux/blkdev.h> |
b81e0c23 | 6 | #include <asm/local.h> |
c6a564ff | 7 | |
58d4f14f CH |
8 | struct disk_stats { |
9 | u64 nsecs[NR_STAT_GROUPS]; | |
10 | unsigned long sectors[NR_STAT_GROUPS]; | |
11 | unsigned long ios[NR_STAT_GROUPS]; | |
12 | unsigned long merges[NR_STAT_GROUPS]; | |
13 | unsigned long io_ticks; | |
14 | local_t in_flight[2]; | |
15 | }; | |
16 | ||
c6a564ff CH |
17 | /* |
18 | * Macros to operate on percpu disk statistics: | |
19 | * | |
58d4f14f CH |
20 | * {disk|part|all}_stat_{add|sub|inc|dec}() modify the stat counters and should |
21 | * be called between disk_stat_lock() and disk_stat_unlock(). | |
c6a564ff CH |
22 | * |
23 | * part_stat_read() can be called at any time. | |
c6a564ff | 24 | */ |
8ab1d40a KK |
25 | #define part_stat_lock() preempt_disable() |
26 | #define part_stat_unlock() preempt_enable() | |
c6a564ff CH |
27 | |
28 | #define part_stat_get_cpu(part, field, cpu) \ | |
8446fe92 | 29 | (per_cpu_ptr((part)->bd_stats, (cpu))->field) |
c6a564ff CH |
30 | |
31 | #define part_stat_get(part, field) \ | |
32 | part_stat_get_cpu(part, field, smp_processor_id()) | |
33 | ||
34 | #define part_stat_read(part, field) \ | |
35 | ({ \ | |
8446fe92 | 36 | typeof((part)->bd_stats->field) res = 0; \ |
c6a564ff CH |
37 | unsigned int _cpu; \ |
38 | for_each_possible_cpu(_cpu) \ | |
8446fe92 | 39 | res += per_cpu_ptr((part)->bd_stats, _cpu)->field; \ |
c6a564ff CH |
40 | res; \ |
41 | }) | |
42 | ||
8446fe92 | 43 | static inline void part_stat_set_all(struct block_device *part, int value) |
c6a564ff CH |
44 | { |
45 | int i; | |
46 | ||
47 | for_each_possible_cpu(i) | |
8446fe92 | 48 | memset(per_cpu_ptr(part->bd_stats, i), value, |
c6a564ff CH |
49 | sizeof(struct disk_stats)); |
50 | } | |
51 | ||
c6a564ff CH |
52 | #define part_stat_read_accum(part, field) \ |
53 | (part_stat_read(part, field[STAT_READ]) + \ | |
54 | part_stat_read(part, field[STAT_WRITE]) + \ | |
55 | part_stat_read(part, field[STAT_DISCARD])) | |
56 | ||
57 | #define __part_stat_add(part, field, addnd) \ | |
8446fe92 | 58 | __this_cpu_add((part)->bd_stats->field, addnd) |
c6a564ff CH |
59 | |
60 | #define part_stat_add(part, field, addnd) do { \ | |
61 | __part_stat_add((part), field, addnd); \ | |
8446fe92 CH |
62 | if ((part)->bd_partno) \ |
63 | __part_stat_add(bdev_whole(part), field, addnd); \ | |
c6a564ff CH |
64 | } while (0) |
65 | ||
15e3d2c5 CH |
66 | #define part_stat_dec(part, field) \ |
67 | part_stat_add(part, field, -1) | |
68 | #define part_stat_inc(part, field) \ | |
69 | part_stat_add(part, field, 1) | |
70 | #define part_stat_sub(part, field, subnd) \ | |
71 | part_stat_add(part, field, -subnd) | |
c6a564ff | 72 | |
15e3d2c5 CH |
73 | #define part_stat_local_dec(part, field) \ |
74 | local_dec(&(part_stat_get(part, field))) | |
75 | #define part_stat_local_inc(part, field) \ | |
76 | local_inc(&(part_stat_get(part, field))) | |
77 | #define part_stat_local_read(part, field) \ | |
78 | local_read(&(part_stat_get(part, field))) | |
79 | #define part_stat_local_read_cpu(part, field, cpu) \ | |
80 | local_read(&(part_stat_get_cpu(part, field, cpu))) | |
c6a564ff CH |
81 | |
82 | #endif /* _LINUX_PART_STAT_H */ |