mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
Block layer patches
- Graph locking part 6 (bs->file/backing) - ahci: trigger either error IRQ or regular IRQ, not both -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEE3D3rFZqa+V09dFb+fwmycsiPL9YFAmVLvccRHGt3b2xmQHJl ZGhhdC5jb20ACgkQfwmycsiPL9ZkFg//awQoPiGnYzHpqcx2tGCM2AqBV+mFkbZr BKI5vp8FYfJtgMuHjC8jabL24NRMPpT+HbCzoxwjJU+nnnr85qr7R5iGwG6kfgX6 HJlAXYXdY6e7l+FV44PBJ52vOoGCsh1GHg8HlKsHMaxSdXi9C1axHJ6rCAjnWXE0 FQ4znCBVs/9HiKsvu4Wdm5muX2ShftFRM/toAwA+fLEOealX8WEXoRFJXI40bYbR OR7aJXWMDQrljlqdKk2FXvK337/tpofXmXf3NIE1R2pmY4x5Fg8bfChZn4UaaCdN n+0AhmE4ScI0rXuaXXYOvTO9vdTzXeBROG6tX03t9rrQfB6wPcGVeXRo/uusslAW sDH8NLz7uHFOooV02Fs8CKDdVrNNw5qjziclSGa0Po7vqOV1TKI8OTiNpsDLmdI5 +DQvC6N+IU1pSOXImATSHkheGWggsegrsgN6PdrlzHEXJwWoAaRD0T06MRn74/pL gCegK2ez4RJYsci7C5b0gaqY/QBsMj8EUfEGVHvVyuVSoPRwiq4ehPqSQ+siA3xP KxYR0e4+QIfRmxqCzaJhiQ3DDGdt8UcO3yF0XcKXEqWwgFAGQKNeUG314jginvmA iaJzC0dHbiGcagAk7Ey8iyzfxQDWM6ixzJtGv7VLILepzCuu8vaJXy5qeEtTM/ZI EXoDGceNSvw= =ikBW -----END PGP SIGNATURE----- Merge tag 'for-upstream' of https://repo.or.cz/qemu/kevin into staging Block layer patches - Graph locking part 6 (bs->file/backing) - ahci: trigger either error IRQ or regular IRQ, not both # -----BEGIN PGP SIGNATURE----- # # iQJFBAABCAAvFiEE3D3rFZqa+V09dFb+fwmycsiPL9YFAmVLvccRHGt3b2xmQHJl # ZGhhdC5jb20ACgkQfwmycsiPL9ZkFg//awQoPiGnYzHpqcx2tGCM2AqBV+mFkbZr # BKI5vp8FYfJtgMuHjC8jabL24NRMPpT+HbCzoxwjJU+nnnr85qr7R5iGwG6kfgX6 # HJlAXYXdY6e7l+FV44PBJ52vOoGCsh1GHg8HlKsHMaxSdXi9C1axHJ6rCAjnWXE0 # FQ4znCBVs/9HiKsvu4Wdm5muX2ShftFRM/toAwA+fLEOealX8WEXoRFJXI40bYbR # OR7aJXWMDQrljlqdKk2FXvK337/tpofXmXf3NIE1R2pmY4x5Fg8bfChZn4UaaCdN # n+0AhmE4ScI0rXuaXXYOvTO9vdTzXeBROG6tX03t9rrQfB6wPcGVeXRo/uusslAW # sDH8NLz7uHFOooV02Fs8CKDdVrNNw5qjziclSGa0Po7vqOV1TKI8OTiNpsDLmdI5 # +DQvC6N+IU1pSOXImATSHkheGWggsegrsgN6PdrlzHEXJwWoAaRD0T06MRn74/pL # gCegK2ez4RJYsci7C5b0gaqY/QBsMj8EUfEGVHvVyuVSoPRwiq4ehPqSQ+siA3xP # KxYR0e4+QIfRmxqCzaJhiQ3DDGdt8UcO3yF0XcKXEqWwgFAGQKNeUG314jginvmA # iaJzC0dHbiGcagAk7Ey8iyzfxQDWM6ixzJtGv7VLILepzCuu8vaJXy5qeEtTM/ZI # EXoDGceNSvw= # =ikBW # -----END PGP SIGNATURE----- # gpg: Signature made Thu 09 Nov 2023 00:56:39 HKT # gpg: using RSA key DC3DEB159A9AF95D3D7456FE7F09B272C88F2FD6 # gpg: issuer "kwolf@redhat.com" # gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>" [full] # Primary key fingerprint: DC3D EB15 9A9A F95D 3D74 56FE 7F09 B272 C88F 2FD6 * tag 'for-upstream' of https://repo.or.cz/qemu/kevin: (25 commits) hw/ide/ahci: trigger either error IRQ or regular IRQ, not both block: Protect bs->file with graph_lock block: Take graph lock for most of .bdrv_open vhdx: Take locks for accessing bs->file qcow2: Take locks for accessing bs->file block: Add missing GRAPH_RDLOCK annotations block: Introduce bdrv_co_change_backing_file() blkverify: Add locking for request_fn block: Protect bs->backing with graph_lock block: Mark bdrv_replace_node() GRAPH_WRLOCK block: Mark bdrv_replace_node_common() GRAPH_WRLOCK block: Inline bdrv_set_backing_noperm() block: Mark bdrv_set_backing_hd_drained() GRAPH_WRLOCK block: Mark bdrv_cow_child() and callers GRAPH_RDLOCK block: Mark bdrv_filter_child() and callers GRAPH_RDLOCK block: Mark bdrv_chain_contains() and callers GRAPH_RDLOCK block: Mark bdrv_(un)freeze_backing_chain() and callers GRAPH_RDLOCK block: Mark bdrv_skip_filters() and callers GRAPH_RDLOCK block: Mark bdrv_skip_implicit_filters() and callers GRAPH_RDLOCK block: Mark bdrv_filter_or_cow_bs() and callers GRAPH_RDLOCK ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
ad6ef0a42e
56 changed files with 917 additions and 518 deletions
|
@ -96,9 +96,9 @@ static int coroutine_fn bdrv_test_co_preadv(BlockDriverState *bs,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int bdrv_test_change_backing_file(BlockDriverState *bs,
|
||||
const char *backing_file,
|
||||
const char *backing_fmt)
|
||||
static int bdrv_test_co_change_backing_file(BlockDriverState *bs,
|
||||
const char *backing_file,
|
||||
const char *backing_fmt)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -116,7 +116,7 @@ static BlockDriver bdrv_test = {
|
|||
|
||||
.bdrv_child_perm = bdrv_default_perms,
|
||||
|
||||
.bdrv_change_backing_file = bdrv_test_change_backing_file,
|
||||
.bdrv_co_change_backing_file = bdrv_test_co_change_backing_file,
|
||||
};
|
||||
|
||||
static void aio_ret_cb(void *opaque, int ret)
|
||||
|
@ -218,8 +218,14 @@ static void do_drain_end_unlocked(enum drain_type drain_type, BlockDriverState *
|
|||
}
|
||||
}
|
||||
|
||||
static void test_drv_cb_common(BlockBackend *blk, enum drain_type drain_type,
|
||||
bool recursive)
|
||||
/*
|
||||
* Locking the block graph would be a bit cumbersome here because this function
|
||||
* is called both in coroutine and non-coroutine context. We know this is a test
|
||||
* and nothing else is running, so don't bother with TSA.
|
||||
*/
|
||||
static void coroutine_mixed_fn TSA_NO_TSA
|
||||
test_drv_cb_common(BlockBackend *blk, enum drain_type drain_type,
|
||||
bool recursive)
|
||||
{
|
||||
BlockDriverState *bs = blk_bs(blk);
|
||||
BlockDriverState *backing = bs->backing->bs;
|
||||
|
@ -307,8 +313,14 @@ static void test_drv_cb_co_drain(void)
|
|||
blk_unref(blk);
|
||||
}
|
||||
|
||||
static void test_quiesce_common(BlockBackend *blk, enum drain_type drain_type,
|
||||
bool recursive)
|
||||
/*
|
||||
* Locking the block graph would be a bit cumbersome here because this function
|
||||
* is called both in coroutine and non-coroutine context. We know this is a test
|
||||
* and nothing else is running, so don't bother with TSA.
|
||||
*/
|
||||
static void coroutine_mixed_fn TSA_NO_TSA
|
||||
test_quiesce_common(BlockBackend *blk, enum drain_type drain_type,
|
||||
bool recursive)
|
||||
{
|
||||
BlockDriverState *bs = blk_bs(blk);
|
||||
BlockDriverState *backing = bs->backing->bs;
|
||||
|
@ -794,7 +806,10 @@ static void test_blockjob_common_drain_node(enum drain_type drain_type,
|
|||
0, 0, NULL, NULL, &error_abort);
|
||||
tjob->bs = src;
|
||||
job = &tjob->common;
|
||||
|
||||
bdrv_graph_wrlock(target);
|
||||
block_job_add_bdrv(job, "target", target, 0, BLK_PERM_ALL, &error_abort);
|
||||
bdrv_graph_wrunlock();
|
||||
|
||||
switch (result) {
|
||||
case TEST_JOB_SUCCESS:
|
||||
|
@ -1865,6 +1880,8 @@ static void bdrv_replace_test_drain_end(BlockDriverState *bs)
|
|||
{
|
||||
BDRVReplaceTestState *s = bs->opaque;
|
||||
|
||||
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||
|
||||
if (!s->setup_completed) {
|
||||
return;
|
||||
}
|
||||
|
@ -1997,7 +2014,13 @@ static void do_test_replace_child_mid_drain(int old_drain_count,
|
|||
parent_s->was_undrained = false;
|
||||
|
||||
g_assert(parent_bs->quiesce_counter == old_drain_count);
|
||||
bdrv_drained_begin(old_child_bs);
|
||||
bdrv_drained_begin(new_child_bs);
|
||||
bdrv_graph_wrlock(NULL);
|
||||
bdrv_replace_node(old_child_bs, new_child_bs, &error_abort);
|
||||
bdrv_graph_wrunlock();
|
||||
bdrv_drained_end(new_child_bs);
|
||||
bdrv_drained_end(old_child_bs);
|
||||
g_assert(parent_bs->quiesce_counter == new_drain_count);
|
||||
|
||||
if (!old_drain_count && !new_drain_count) {
|
||||
|
|
|
@ -206,15 +206,18 @@ static void test_should_update_child(void)
|
|||
|
||||
bdrv_set_backing_hd(target, bs, &error_abort);
|
||||
|
||||
g_assert(target->backing->bs == bs);
|
||||
bdrv_graph_wrlock(NULL);
|
||||
g_assert(target->backing->bs == bs);
|
||||
bdrv_attach_child(filter, target, "target", &child_of_bds,
|
||||
BDRV_CHILD_DATA, &error_abort);
|
||||
bdrv_graph_wrunlock();
|
||||
aio_context_acquire(qemu_get_aio_context());
|
||||
bdrv_append(filter, bs, &error_abort);
|
||||
aio_context_release(qemu_get_aio_context());
|
||||
|
||||
bdrv_graph_rdlock_main_loop();
|
||||
g_assert(target->backing->bs == bs);
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
|
||||
bdrv_unref(filter);
|
||||
bdrv_unref(bs);
|
||||
|
@ -234,11 +237,16 @@ static void test_parallel_exclusive_write(void)
|
|||
BlockDriverState *fl1 = pass_through_node("fl1");
|
||||
BlockDriverState *fl2 = pass_through_node("fl2");
|
||||
|
||||
bdrv_drained_begin(fl1);
|
||||
bdrv_drained_begin(fl2);
|
||||
|
||||
/*
|
||||
* bdrv_attach_child() eats child bs reference, so we need two @base
|
||||
* references for two filters:
|
||||
* references for two filters. We also need an additional @fl1 reference so
|
||||
* that it still exists when we want to undrain it.
|
||||
*/
|
||||
bdrv_ref(base);
|
||||
bdrv_ref(fl1);
|
||||
|
||||
bdrv_graph_wrlock(NULL);
|
||||
bdrv_attach_child(top, fl1, "backing", &child_of_bds,
|
||||
|
@ -250,10 +258,14 @@ static void test_parallel_exclusive_write(void)
|
|||
bdrv_attach_child(fl2, base, "backing", &child_of_bds,
|
||||
BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY,
|
||||
&error_abort);
|
||||
bdrv_graph_wrunlock();
|
||||
|
||||
bdrv_replace_node(fl1, fl2, &error_abort);
|
||||
bdrv_graph_wrunlock();
|
||||
|
||||
bdrv_drained_end(fl2);
|
||||
bdrv_drained_end(fl1);
|
||||
|
||||
bdrv_unref(fl1);
|
||||
bdrv_unref(fl2);
|
||||
bdrv_unref(top);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue