[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 25/58] bdrv_change_aio_context: use hash table instead of list of
From: |
Kevin Wolf |
Subject: |
[PULL 25/58] bdrv_change_aio_context: use hash table instead of list of visited nodes |
Date: |
Thu, 27 Oct 2022 20:31:13 +0200 |
From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Minor performance improvement, but given that we have hash tables
available, avoid iterating in the visited nodes list every time just
to check if a node has been already visited.
The data structure is not actually a proper hash map, but an hash set,
as we are just adding nodes and not key,value pairs.
Suggested-by: Hanna Reitz <hreitz@redhat.com>
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20221025084952.2139888-4-eesposit@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
include/block/block-global-state.h | 2 +-
include/block/block_int-common.h | 3 ++-
block.c | 28 ++++++++++++++++------------
3 files changed, 19 insertions(+), 14 deletions(-)
diff --git a/include/block/block-global-state.h
b/include/block/block-global-state.h
index 7b0095b419..e7372ec541 100644
--- a/include/block/block-global-state.h
+++ b/include/block/block-global-state.h
@@ -233,7 +233,7 @@ bool bdrv_can_set_aio_context(BlockDriverState *bs,
AioContext *ctx,
AioContext *bdrv_child_get_parent_aio_context(BdrvChild *c);
bool bdrv_child_change_aio_context(BdrvChild *c, AioContext *ctx,
- GSList **visited, Transaction *tran,
+ GHashTable *visited, Transaction *tran,
Error **errp);
int bdrv_child_try_change_aio_context(BlockDriverState *bs, AioContext *ctx,
BdrvChild *ignore_child, Error **errp);
diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
index 9067a99249..7ccbbdae05 100644
--- a/include/block/block_int-common.h
+++ b/include/block/block_int-common.h
@@ -911,7 +911,8 @@ struct BdrvChildClass {
void (*set_aio_ctx)(BdrvChild *child, AioContext *ctx, GSList **ignore);
bool (*change_aio_ctx)(BdrvChild *child, AioContext *ctx,
- GSList **visited, Transaction *tran, Error **errp);
+ GHashTable *visited, Transaction *tran,
+ Error **errp);
AioContext *(*get_parent_aio_context)(BdrvChild *child);
diff --git a/block.c b/block.c
index 38e5d831ca..59319d9b0f 100644
--- a/block.c
+++ b/block.c
@@ -105,7 +105,7 @@ static void bdrv_reopen_abort(BDRVReopenState
*reopen_state);
static bool bdrv_backing_overridden(BlockDriverState *bs);
static bool bdrv_change_aio_context(BlockDriverState *bs, AioContext *ctx,
- GSList **visited, Transaction *tran,
+ GHashTable *visited, Transaction *tran,
Error **errp);
/* If non-zero, use only whitelisted block drivers */
@@ -7315,14 +7315,15 @@ typedef struct BdrvStateSetAioContext {
} BdrvStateSetAioContext;
static bool bdrv_parent_change_aio_context(BdrvChild *c, AioContext *ctx,
- GSList **visited, Transaction *tran,
+ GHashTable *visited,
+ Transaction *tran,
Error **errp)
{
GLOBAL_STATE_CODE();
- if (g_slist_find(*visited, c)) {
+ if (g_hash_table_contains(visited, c)) {
return true;
}
- *visited = g_slist_prepend(*visited, c);
+ g_hash_table_add(visited, c);
/*
* A BdrvChildClass that doesn't handle AioContext changes cannot
@@ -7353,14 +7354,14 @@ bool bdrv_child_can_set_aio_context(BdrvChild *c,
AioContext *ctx,
}
bool bdrv_child_change_aio_context(BdrvChild *c, AioContext *ctx,
- GSList **visited, Transaction *tran,
+ GHashTable *visited, Transaction *tran,
Error **errp)
{
GLOBAL_STATE_CODE();
- if (g_slist_find(*visited, c)) {
+ if (g_hash_table_contains(visited, c)) {
return true;
}
- *visited = g_slist_prepend(*visited, c);
+ g_hash_table_add(visited, c);
return bdrv_change_aio_context(c->bs, ctx, visited, tran, errp);
}
@@ -7445,7 +7446,7 @@ static TransactionActionDrv set_aio_context = {
* responsible for freeing the list afterwards.
*/
static bool bdrv_change_aio_context(BlockDriverState *bs, AioContext *ctx,
- GSList **visited, Transaction *tran,
+ GHashTable *visited, Transaction *tran,
Error **errp)
{
BdrvChild *c;
@@ -7524,7 +7525,7 @@ int bdrv_child_try_change_aio_context(BlockDriverState
*bs, AioContext *ctx,
BdrvChild *ignore_child, Error **errp)
{
Transaction *tran;
- GSList *visited;
+ GHashTable *visited;
int ret;
AioContext *old_context = bdrv_get_aio_context(bs);
GLOBAL_STATE_CODE();
@@ -7536,9 +7537,12 @@ int bdrv_child_try_change_aio_context(BlockDriverState
*bs, AioContext *ctx,
* is successful (the transaction itself).
*/
tran = tran_new();
- visited = ignore_child ? g_slist_prepend(NULL, ignore_child) : NULL;
- ret = bdrv_change_aio_context(bs, ctx, &visited, tran, errp);
- g_slist_free(visited);
+ visited = g_hash_table_new(NULL, NULL);
+ if (ignore_child) {
+ g_hash_table_add(visited, ignore_child);
+ }
+ ret = bdrv_change_aio_context(bs, ctx, visited, tran, errp);
+ g_hash_table_destroy(visited);
/*
* Linear phase: go through all callbacks collected in the transaction.
--
2.37.3
- [PULL 17/58] Revert "block: Let replace_child_tran keep indirect pointer", (continued)
- [PULL 17/58] Revert "block: Let replace_child_tran keep indirect pointer", Kevin Wolf, 2022/10/27
- [PULL 18/58] Revert "block: Restructure remove_file_or_backing_child()", Kevin Wolf, 2022/10/27
- [PULL 19/58] Revert "block: Pass BdrvChild ** to replace_child_noperm", Kevin Wolf, 2022/10/27
- [PULL 16/58] Revert "block: Let replace_child_noperm free children", Kevin Wolf, 2022/10/27
- [PULL 09/58] block: introduce bdrv_open_file_child() helper, Kevin Wolf, 2022/10/27
- [PULL 21/58] block/snapshot: drop indirection around bdrv_snapshot_fallback_ptr, Kevin Wolf, 2022/10/27
- [PULL 22/58] block: refactor bdrv_remove_file_or_backing_child to bdrv_remove_child, Kevin Wolf, 2022/10/27
- [PULL 13/58] test-bdrv-graph-mod: fix filters to be filters, Kevin Wolf, 2022/10/27
- [PULL 39/58] coroutine-lock: add missing coroutine_fn annotation to prototypes, Kevin Wolf, 2022/10/27
- [PULL 35/58] block: remove incorrect coroutine_fn annotation, Kevin Wolf, 2022/10/27
- [PULL 25/58] bdrv_change_aio_context: use hash table instead of list of visited nodes,
Kevin Wolf <=
- [PULL 24/58] block: use transactions as a replacement of ->{can_}set_aio_context(), Kevin Wolf, 2022/10/27
- [PULL 28/58] block-backend: implement .change_aio_ctx in child_root, Kevin Wolf, 2022/10/27
- [PULL 31/58] block: rename bdrv_child_try_change_aio_context in bdrv_try_change_aio_context, Kevin Wolf, 2022/10/27
- [PULL 30/58] block: remove all unused ->can_set_aio_ctx and ->set_aio_ctx callbacks, Kevin Wolf, 2022/10/27
- [PULL 34/58] backup: remove incorrect coroutine_fn annotation, Kevin Wolf, 2022/10/27
- [PULL 54/58] vdi: switch to *_co_* functions, Kevin Wolf, 2022/10/27
- [PULL 20/58] block: Manipulate bs->file / bs->backing pointers in .attach/.detach, Kevin Wolf, 2022/10/27
- [PULL 32/58] block: remove bdrv_try_set_aio_context and replace it with bdrv_try_change_aio_context, Kevin Wolf, 2022/10/27
- [PULL 56/58] vmdk: switch to *_co_* functions, Kevin Wolf, 2022/10/27
- [PULL 33/58] block/nfs: Fix 32-bit Windows build, Kevin Wolf, 2022/10/27