提交 a0d64a61 编写于 作者: A Alberto Garcia 提交者: Kevin Wolf

throttle: Use bs->throttle_state instead of bs->io_limits_enabled

There are two ways to check for I/O limits in a BlockDriverState:

- bs->throttle_state: if this pointer is not NULL, it means that this
  BDS is member of a throttling group, its ThrottleTimers structure
  has been initialized and its I/O limits are ready to be applied.

- bs->io_limits_enabled: if true it means that the throttle_state
  pointer is valid _and_ the limits are currently enabled.

The latter is used in several places to check whether a BDS has I/O
limits configured, but what it really checks is whether requests
are being throttled or not. For example, io_limits_enabled can be
temporarily set to false in cases like bdrv_read_unthrottled() without
otherwise touching the throtting configuration of that BDS.

This patch replaces bs->io_limits_enabled with bs->throttle_state in
all cases where what we really want to check is the existence of I/O
limits, not whether they are currently enabled or not.
Signed-off-by: NAlberto Garcia <berto@igalia.com>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 5ac72418
...@@ -1907,7 +1907,7 @@ void bdrv_close(BlockDriverState *bs) ...@@ -1907,7 +1907,7 @@ void bdrv_close(BlockDriverState *bs)
} }
/* Disable I/O limits and drain all pending throttled requests */ /* Disable I/O limits and drain all pending throttled requests */
if (bs->io_limits_enabled) { if (bs->throttle_state) {
bdrv_io_limits_disable(bs); bdrv_io_limits_disable(bs);
} }
...@@ -3712,7 +3712,7 @@ void bdrv_detach_aio_context(BlockDriverState *bs) ...@@ -3712,7 +3712,7 @@ void bdrv_detach_aio_context(BlockDriverState *bs)
baf->detach_aio_context(baf->opaque); baf->detach_aio_context(baf->opaque);
} }
if (bs->io_limits_enabled) { if (bs->throttle_state) {
throttle_timers_detach_aio_context(&bs->throttle_timers); throttle_timers_detach_aio_context(&bs->throttle_timers);
} }
if (bs->drv->bdrv_detach_aio_context) { if (bs->drv->bdrv_detach_aio_context) {
...@@ -3748,7 +3748,7 @@ void bdrv_attach_aio_context(BlockDriverState *bs, ...@@ -3748,7 +3748,7 @@ void bdrv_attach_aio_context(BlockDriverState *bs,
if (bs->drv->bdrv_attach_aio_context) { if (bs->drv->bdrv_attach_aio_context) {
bs->drv->bdrv_attach_aio_context(bs, new_context); bs->drv->bdrv_attach_aio_context(bs, new_context);
} }
if (bs->io_limits_enabled) { if (bs->throttle_state) {
throttle_timers_attach_aio_context(&bs->throttle_timers, new_context); throttle_timers_attach_aio_context(&bs->throttle_timers, new_context);
} }
......
...@@ -64,7 +64,7 @@ BlockDeviceInfo *bdrv_block_device_info(BlockDriverState *bs, Error **errp) ...@@ -64,7 +64,7 @@ BlockDeviceInfo *bdrv_block_device_info(BlockDriverState *bs, Error **errp)
info->backing_file_depth = bdrv_get_backing_file_depth(bs); info->backing_file_depth = bdrv_get_backing_file_depth(bs);
info->detect_zeroes = bs->detect_zeroes; info->detect_zeroes = bs->detect_zeroes;
if (bs->io_limits_enabled) { if (bs->throttle_state) {
ThrottleConfig cfg; ThrottleConfig cfg;
throttle_group_get_config(bs, &cfg); throttle_group_get_config(bs, &cfg);
......
...@@ -2361,14 +2361,14 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd, ...@@ -2361,14 +2361,14 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
if (throttle_enabled(&cfg)) { if (throttle_enabled(&cfg)) {
/* Enable I/O limits if they're not enabled yet, otherwise /* Enable I/O limits if they're not enabled yet, otherwise
* just update the throttling group. */ * just update the throttling group. */
if (!bs->io_limits_enabled) { if (!bs->throttle_state) {
bdrv_io_limits_enable(bs, has_group ? group : device); bdrv_io_limits_enable(bs, has_group ? group : device);
} else if (has_group) { } else if (has_group) {
bdrv_io_limits_update_group(bs, group); bdrv_io_limits_update_group(bs, group);
} }
/* Set the new throttling configuration */ /* Set the new throttling configuration */
bdrv_set_io_limits(bs, &cfg); bdrv_set_io_limits(bs, &cfg);
} else if (bs->io_limits_enabled) { } else if (bs->throttle_state) {
/* If all throttling settings are set to 0, disable I/O limits */ /* If all throttling settings are set to 0, disable I/O limits */
bdrv_io_limits_disable(bs); bdrv_io_limits_disable(bs);
} }
......
...@@ -390,7 +390,10 @@ struct BlockDriverState { ...@@ -390,7 +390,10 @@ struct BlockDriverState {
/* number of in-flight serialising requests */ /* number of in-flight serialising requests */
unsigned int serialising_in_flight; unsigned int serialising_in_flight;
/* I/O throttling */ /* I/O throttling.
* throttle_state tells us if this BDS has I/O limits configured.
* io_limits_enabled tells us if they are currently being
* enforced, but it can be temporarily set to false */
CoQueue throttled_reqs[2]; CoQueue throttled_reqs[2];
bool io_limits_enabled; bool io_limits_enabled;
/* The following fields are protected by the ThrottleGroup lock. /* The following fields are protected by the ThrottleGroup lock.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册