]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blame - block/mq-deadline-cgroup.h
Merge tag 'kbuild-v5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[mirror_ubuntu-kernels.git] / block / mq-deadline-cgroup.h
CommitLineData
08a9ad8b
BVA
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
8struct 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 */
17struct 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_*). */
25struct 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 */
34struct 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 { \
44if (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 */
77struct dd_blkg {
78 struct blkg_policy_data pd; /* must be the first member */
79};
80
81struct dd_blkcg *dd_blkcg_from_bio(struct bio *bio);
82int dd_activate_policy(struct request_queue *q);
83void dd_deactivate_policy(struct request_queue *q);
84int __init dd_blkcg_init(void);
85void __exit dd_blkcg_exit(void);
86
87#else /* CONFIG_BLK_CGROUP */
88
89static inline struct dd_blkcg *dd_blkcg_from_bio(struct bio *bio)
90{
91 return NULL;
92}
93
94static inline int dd_activate_policy(struct request_queue *q)
95{
96 return 0;
97}
98
99static inline void dd_deactivate_policy(struct request_queue *q)
100{
101}
102
103static inline int dd_blkcg_init(void)
104{
105 return 0;
106}
107
108static inline void dd_blkcg_exit(void)
109{
110}
111
112#endif /* CONFIG_BLK_CGROUP */
113
114#endif /* _MQ_DEADLINE_CGROUP_H_ */