Merge tag 'block-5.14-2021-08-07' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / block / mq-deadline-cgroup.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2
3 #if !defined(_MQ_DEADLINE_CGROUP_H_)
4 #define _MQ_DEADLINE_CGROUP_H_
5
6 #include <linux/blk-cgroup.h>
7
8 struct request_queue;
9
10 /**
11  * struct io_stats_per_prio - I/O statistics per I/O priority class.
12  * @inserted: Number of inserted requests.
13  * @merged: Number of merged requests.
14  * @dispatched: Number of dispatched requests.
15  * @completed: Number of I/O completions.
16  */
17 struct io_stats_per_prio {
18         local_t inserted;
19         local_t merged;
20         local_t dispatched;
21         local_t completed;
22 };
23
24 /* I/O statistics per I/O cgroup per I/O priority class (IOPRIO_CLASS_*). */
25 struct blkcg_io_stats {
26         struct io_stats_per_prio stats[4];
27 };
28
29 /**
30  * struct dd_blkcg - Per cgroup data.
31  * @cpd: blkcg_policy_data structure.
32  * @stats: I/O statistics.
33  */
34 struct dd_blkcg {
35         struct blkcg_policy_data cpd;   /* must be the first member */
36         struct blkcg_io_stats __percpu *stats;
37 };
38
39 /*
40  * Count one event of type 'event_type' and with I/O priority class
41  * 'prio_class'.
42  */
43 #define ddcg_count(ddcg, event_type, prio_class) do {                   \
44 if (ddcg) {                                                             \
45         struct blkcg_io_stats *io_stats = get_cpu_ptr((ddcg)->stats);   \
46                                                                         \
47         BUILD_BUG_ON(!__same_type((ddcg), struct dd_blkcg *));          \
48         BUILD_BUG_ON(!__same_type((prio_class), u8));                   \
49         local_inc(&io_stats->stats[(prio_class)].event_type);           \
50         put_cpu_ptr(io_stats);                                          \
51 }                                                                       \
52 } while (0)
53
54 /*
55  * Returns the total number of ddcg_count(ddcg, event_type, prio_class) calls
56  * across all CPUs. No locking or barriers since it is fine if the returned
57  * sum is slightly outdated.
58  */
59 #define ddcg_sum(ddcg, event_type, prio) ({                             \
60         unsigned int cpu;                                               \
61         u32 sum = 0;                                                    \
62                                                                         \
63         BUILD_BUG_ON(!__same_type((ddcg), struct dd_blkcg *));          \
64         BUILD_BUG_ON(!__same_type((prio), u8));                         \
65         for_each_present_cpu(cpu)                                       \
66                 sum += local_read(&per_cpu_ptr((ddcg)->stats, cpu)->    \
67                                   stats[(prio)].event_type);            \
68         sum;                                                            \
69 })
70
71 #ifdef CONFIG_BLK_CGROUP
72
73 /**
74  * struct dd_blkg - Per (cgroup, request queue) data.
75  * @pd: blkg_policy_data structure.
76  */
77 struct dd_blkg {
78         struct blkg_policy_data pd;     /* must be the first member */
79 };
80
81 struct dd_blkcg *dd_blkcg_from_bio(struct bio *bio);
82 int dd_activate_policy(struct request_queue *q);
83 void dd_deactivate_policy(struct request_queue *q);
84 int __init dd_blkcg_init(void);
85 void __exit dd_blkcg_exit(void);
86
87 #else /* CONFIG_BLK_CGROUP */
88
89 static inline struct dd_blkcg *dd_blkcg_from_bio(struct bio *bio)
90 {
91         return NULL;
92 }
93
94 static inline int dd_activate_policy(struct request_queue *q)
95 {
96         return 0;
97 }
98
99 static inline void dd_deactivate_policy(struct request_queue *q)
100 {
101 }
102
103 static inline int dd_blkcg_init(void)
104 {
105         return 0;
106 }
107
108 static inline void dd_blkcg_exit(void)
109 {
110 }
111
112 #endif /* CONFIG_BLK_CGROUP */
113
114 #endif /* _MQ_DEADLINE_CGROUP_H_ */