xref: /openbmc/qemu/include/block/throttle-groups.h (revision 022cdc9f407434ad6eb7ace80362a1218a009bcc)
12ff1f2e3SAlberto Garcia /*
22ff1f2e3SAlberto Garcia  * QEMU block throttling group infrastructure
32ff1f2e3SAlberto Garcia  *
42ff1f2e3SAlberto Garcia  * Copyright (C) Nodalink, EURL. 2014
52ff1f2e3SAlberto Garcia  * Copyright (C) Igalia, S.L. 2015
62ff1f2e3SAlberto Garcia  *
72ff1f2e3SAlberto Garcia  * Authors:
82ff1f2e3SAlberto Garcia  *   Benoît Canet <benoit.canet@nodalink.com>
92ff1f2e3SAlberto Garcia  *   Alberto Garcia <berto@igalia.com>
102ff1f2e3SAlberto Garcia  *
112ff1f2e3SAlberto Garcia  * This program is free software; you can redistribute it and/or
122ff1f2e3SAlberto Garcia  * modify it under the terms of the GNU General Public License as
132ff1f2e3SAlberto Garcia  * published by the Free Software Foundation; either version 2 or
142ff1f2e3SAlberto Garcia  * (at your option) version 3 of the License.
152ff1f2e3SAlberto Garcia  *
162ff1f2e3SAlberto Garcia  * This program is distributed in the hope that it will be useful,
172ff1f2e3SAlberto Garcia  * but WITHOUT ANY WARRANTY; without even the implied warranty of
182ff1f2e3SAlberto Garcia  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
192ff1f2e3SAlberto Garcia  * GNU General Public License for more details.
202ff1f2e3SAlberto Garcia  *
212ff1f2e3SAlberto Garcia  * You should have received a copy of the GNU General Public License
222ff1f2e3SAlberto Garcia  * along with this program; if not, see <http://www.gnu.org/licenses/>.
232ff1f2e3SAlberto Garcia  */
242ff1f2e3SAlberto Garcia 
252ff1f2e3SAlberto Garcia #ifndef THROTTLE_GROUPS_H
262ff1f2e3SAlberto Garcia #define THROTTLE_GROUPS_H
272ff1f2e3SAlberto Garcia 
282ff1f2e3SAlberto Garcia #include "qemu/throttle.h"
292ff1f2e3SAlberto Garcia #include "block/block_int.h"
302ff1f2e3SAlberto Garcia 
31*022cdc9fSManos Pitsidianakis /* The ThrottleGroupMember structure indicates membership in a ThrottleGroup
32*022cdc9fSManos Pitsidianakis  * and holds related data.
33*022cdc9fSManos Pitsidianakis  */
34*022cdc9fSManos Pitsidianakis 
35*022cdc9fSManos Pitsidianakis typedef struct ThrottleGroupMember {
36*022cdc9fSManos Pitsidianakis     /* throttled_reqs_lock protects the CoQueues for throttled requests.  */
37*022cdc9fSManos Pitsidianakis     CoMutex      throttled_reqs_lock;
38*022cdc9fSManos Pitsidianakis     CoQueue      throttled_reqs[2];
39*022cdc9fSManos Pitsidianakis 
40*022cdc9fSManos Pitsidianakis     /* Nonzero if the I/O limits are currently being ignored; generally
41*022cdc9fSManos Pitsidianakis      * it is zero.  Accessed with atomic operations.
42*022cdc9fSManos Pitsidianakis      */
43*022cdc9fSManos Pitsidianakis     unsigned int io_limits_disabled;
44*022cdc9fSManos Pitsidianakis 
45*022cdc9fSManos Pitsidianakis     /* The following fields are protected by the ThrottleGroup lock.
46*022cdc9fSManos Pitsidianakis      * See the ThrottleGroup documentation for details.
47*022cdc9fSManos Pitsidianakis      * throttle_state tells us if I/O limits are configured. */
48*022cdc9fSManos Pitsidianakis     ThrottleState *throttle_state;
49*022cdc9fSManos Pitsidianakis     ThrottleTimers throttle_timers;
50*022cdc9fSManos Pitsidianakis     unsigned       pending_reqs[2];
51*022cdc9fSManos Pitsidianakis     QLIST_ENTRY(ThrottleGroupMember) round_robin;
52*022cdc9fSManos Pitsidianakis 
53*022cdc9fSManos Pitsidianakis } ThrottleGroupMember;
54*022cdc9fSManos Pitsidianakis 
55*022cdc9fSManos Pitsidianakis const char *throttle_group_get_name(ThrottleGroupMember *tgm);
562ff1f2e3SAlberto Garcia 
57973f2ddfSMax Reitz ThrottleState *throttle_group_incref(const char *name);
58973f2ddfSMax Reitz void throttle_group_unref(ThrottleState *ts);
59973f2ddfSMax Reitz 
60*022cdc9fSManos Pitsidianakis void throttle_group_config(ThrottleGroupMember *tgm, ThrottleConfig *cfg);
61*022cdc9fSManos Pitsidianakis void throttle_group_get_config(ThrottleGroupMember *tgm, ThrottleConfig *cfg);
622ff1f2e3SAlberto Garcia 
63*022cdc9fSManos Pitsidianakis void throttle_group_register_tgm(ThrottleGroupMember *tgm,
64*022cdc9fSManos Pitsidianakis                                 const char *groupname);
65*022cdc9fSManos Pitsidianakis void throttle_group_unregister_tgm(ThrottleGroupMember *tgm);
66*022cdc9fSManos Pitsidianakis void throttle_group_restart_tgm(ThrottleGroupMember *tgm);
672ff1f2e3SAlberto Garcia 
68*022cdc9fSManos Pitsidianakis void coroutine_fn throttle_group_co_io_limits_intercept(ThrottleGroupMember *tgm,
6976f4afb4SAlberto Garcia                                                         unsigned int bytes,
7076f4afb4SAlberto Garcia                                                         bool is_write);
7176f4afb4SAlberto Garcia 
722ff1f2e3SAlberto Garcia #endif
73