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