82
QemuMutex queued_requests_lock; /* protects queued_requests */
83
CoQueue queued_requests;
84
bool disable_request_queuing; /* atomic */
85
+ int start_request_count; /* atomic */
86
87
VMChangeStateEntry *vmsh;
88
bool force_allow_inactivate;
1307
}
1308
1309
/* To be called between exactly one pair of blk_inc/dec_in_flight() */
1309
-static void coroutine_fn blk_wait_while_drained(BlockBackend *blk)
1310
+static void coroutine_fn blk_wait_while_drained(BlockBackend *blk,
1311
+ BdrvRequestFlags flags)
1312
{
1313
assert(blk->in_flight > 0);
1314
1315
+ if (flags & BDRV_REQ_NO_QUEUE) {
1316
+ assert(qatomic_read(&blk->start_request_count));
1317
+ return;
1318
+ }
1319
+
1320
if (qatomic_read(&blk->quiesce_counter) &&
1321
!qatomic_read(&blk->disable_request_queuing)) {
1322
/*
1342
BlockDriverState *bs;
1343
IO_CODE();
1344
1338
- blk_wait_while_drained(blk);
1345
+ blk_wait_while_drained(blk, flags);
1346
GRAPH_RDLOCK_GUARD();
1347
1348
/* Call blk_bs() only after waiting, the graph may have changed */
1417
BlockDriverState *bs;
1418
IO_CODE();
1419
1413
- blk_wait_while_drained(blk);
1420
+ blk_wait_while_drained(blk, flags);
1421
GRAPH_RDLOCK_GUARD();
1422
1423
/* Call blk_bs() only after waiting, the graph may have changed */
1530
aio_wait_kick();
1531
}
1532
1533
+void coroutine_fn blk_co_start_request(BlockBackend *blk)
1534
+{
1535
+ blk_inc_in_flight(blk);
1536
+ blk_wait_while_drained(blk, 0);
1537
+ qatomic_inc(&blk->start_request_count);
1538
+}
1539
+
1540
+void blk_end_request(BlockBackend *blk)
1541
+{
1542
+ qatomic_dec(&blk->start_request_count);
1543
+ blk_dec_in_flight(blk);
1544
+}
1545
+
1546
static void error_callback_bh(void *opaque)
1547
{
1548
struct BlockBackendAIOCB *acb = opaque;
1761
{
1762
IO_CODE();
1763
1744
- blk_wait_while_drained(blk);
1764
+ blk_wait_while_drained(blk, 0);
1765
GRAPH_RDLOCK_GUARD();
1766
1767
if (!blk_co_is_available(blk)) {
1808
int ret;
1809
IO_CODE();
1810
1791
- blk_wait_while_drained(blk);
1811
+ blk_wait_while_drained(blk, 0);
1812
GRAPH_RDLOCK_GUARD();
1813
1814
ret = blk_check_byte_request(blk, offset, bytes);
1854
static int coroutine_fn blk_co_do_flush(BlockBackend *blk)
1855
{
1856
IO_CODE();
1837
- blk_wait_while_drained(blk);
1857
+ blk_wait_while_drained(blk, 0);
1858
GRAPH_RDLOCK_GUARD();
1859
1860
if (!blk_co_is_available(blk)) {
2029
IO_CODE();
2030
2031
blk_inc_in_flight(blk); /* increase before waiting */
2012
- blk_wait_while_drained(blk);
2032
+ blk_wait_while_drained(blk, 0);
2033
GRAPH_RDLOCK_GUARD();
2034
if (!blk_is_available(blk)) {
2035
blk_dec_in_flight(blk);
2054
IO_CODE();
2055
2056
blk_inc_in_flight(blk);
2037
- blk_wait_while_drained(blk);
2057
+ blk_wait_while_drained(blk, 0);
2058
GRAPH_RDLOCK_GUARD();
2059
2060
ret = blk_check_byte_request(blk, offset, len);
2078
IO_CODE();
2079
2080
blk_inc_in_flight(blk);
2061
- blk_wait_while_drained(blk);
2081
+ blk_wait_while_drained(blk, flags);
2082
GRAPH_RDLOCK_GUARD();
2083
if (!blk_is_available(blk)) {
2084
blk_dec_in_flight(blk);