123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /* SPDX-License-Identifier: GPL-2.0 */
- #if !defined(_MQ_DEADLINE_CGROUP_H_)
- #define _MQ_DEADLINE_CGROUP_H_
- #include <linux/blk-cgroup.h>
- struct request_queue;
- /**
- * struct io_stats_per_prio - I/O statistics per I/O priority class.
- * @inserted: Number of inserted requests.
- * @merged: Number of merged requests.
- * @dispatched: Number of dispatched requests.
- * @completed: Number of I/O completions.
- */
- struct io_stats_per_prio {
- local_t inserted;
- local_t merged;
- local_t dispatched;
- local_t completed;
- };
- /* I/O statistics per I/O cgroup per I/O priority class (IOPRIO_CLASS_*). */
- struct blkcg_io_stats {
- struct io_stats_per_prio stats[4];
- };
- /**
- * struct dd_blkcg - Per cgroup data.
- * @cpd: blkcg_policy_data structure.
- * @stats: I/O statistics.
- */
- struct dd_blkcg {
- struct blkcg_policy_data cpd; /* must be the first member */
- struct blkcg_io_stats __percpu *stats;
- };
- /*
- * Count one event of type 'event_type' and with I/O priority class
- * 'prio_class'.
- */
- #define ddcg_count(ddcg, event_type, prio_class) do { \
- if (ddcg) { \
- struct blkcg_io_stats *io_stats = get_cpu_ptr((ddcg)->stats); \
- \
- BUILD_BUG_ON(!__same_type((ddcg), struct dd_blkcg *)); \
- BUILD_BUG_ON(!__same_type((prio_class), u8)); \
- local_inc(&io_stats->stats[(prio_class)].event_type); \
- put_cpu_ptr(io_stats); \
- } \
- } while (0)
- /*
- * Returns the total number of ddcg_count(ddcg, event_type, prio_class) calls
- * across all CPUs. No locking or barriers since it is fine if the returned
- * sum is slightly outdated.
- */
- #define ddcg_sum(ddcg, event_type, prio) ({ \
- unsigned int cpu; \
- u32 sum = 0; \
- \
- BUILD_BUG_ON(!__same_type((ddcg), struct dd_blkcg *)); \
- BUILD_BUG_ON(!__same_type((prio), u8)); \
- for_each_present_cpu(cpu) \
- sum += local_read(&per_cpu_ptr((ddcg)->stats, cpu)-> \
- stats[(prio)].event_type); \
- sum; \
- })
- #ifdef CONFIG_BLK_CGROUP
- /**
- * struct dd_blkg - Per (cgroup, request queue) data.
- * @pd: blkg_policy_data structure.
- */
- struct dd_blkg {
- struct blkg_policy_data pd; /* must be the first member */
- };
- struct dd_blkcg *dd_blkcg_from_bio(struct bio *bio);
- int dd_activate_policy(struct request_queue *q);
- void dd_deactivate_policy(struct request_queue *q);
- int __init dd_blkcg_init(void);
- void __exit dd_blkcg_exit(void);
- #else /* CONFIG_BLK_CGROUP */
- static inline struct dd_blkcg *dd_blkcg_from_bio(struct bio *bio)
- {
- return NULL;
- }
- static inline int dd_activate_policy(struct request_queue *q)
- {
- return 0;
- }
- static inline void dd_deactivate_policy(struct request_queue *q)
- {
- }
- static inline int dd_blkcg_init(void)
- {
- return 0;
- }
- static inline void dd_blkcg_exit(void)
- {
- }
- #endif /* CONFIG_BLK_CGROUP */
- #endif /* _MQ_DEADLINE_CGROUP_H_ */
|