[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 2/2] migration: savevm_state_handler_insert: constant-time
From: |
Dr. David Alan Gilbert |
Subject: |
Re: [PATCH v2 2/2] migration: savevm_state_handler_insert: constant-time element insertion |
Date: |
Fri, 18 Oct 2019 09:16:25 +0100 |
User-agent: |
Mutt/1.12.1 (2019-06-15) |
* Scott Cheloha (address@hidden) wrote:
> savevm_state's SaveStateEntry TAILQ is a priority queue. Priority
> sorting is maintained by searching from head to tail for a suitable
> insertion spot. Insertion is thus an O(n) operation.
>
> If we instead keep track of the head of each priority's subqueue
> within that larger queue we can reduce this operation to O(1) time.
>
> savevm_state_handler_remove() becomes slightly more complex to
> accomodate these gains: we need to replace the head of a priority's
> subqueue when removing it.
>
> With O(1) insertion, booting VMs with many SaveStateEntry objects is
> more plausible. For example, a ppc64 VM with maxmem=8T has 40000 such
> objects to insert.
Separate from reviewing this patch, I'd like to understand why you've
got 40000 objects. This feels very very wrong and is likely to cause
problems to random other bits of qemu as well.
Dave
> Signed-off-by: Scott Cheloha <address@hidden>
> ---
> migration/savevm.c | 26 +++++++++++++++++++++++---
> 1 file changed, 23 insertions(+), 3 deletions(-)
>
> diff --git a/migration/savevm.c b/migration/savevm.c
> index b2e3b7222a..f7a2d36bba 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -250,6 +250,7 @@ typedef struct SaveStateEntry {
>
> typedef struct SaveState {
> QTAILQ_HEAD(, SaveStateEntry) handlers;
> + SaveStateEntry *handler_pri_head[MIG_PRI_MAX + 1];
> int global_section_id;
> uint32_t len;
> const char *name;
> @@ -261,6 +262,7 @@ typedef struct SaveState {
>
> static SaveState savevm_state = {
> .handlers = QTAILQ_HEAD_INITIALIZER(savevm_state.handlers),
> + .handler_pri_head = { [MIG_PRI_DEFAULT ... MIG_PRI_MAX] = NULL },
> .global_section_id = 0,
> };
>
> @@ -709,24 +711,42 @@ static void savevm_state_handler_insert(SaveStateEntry
> *nse)
> {
> MigrationPriority priority = save_state_priority(nse);
> SaveStateEntry *se;
> + int i;
>
> assert(priority <= MIG_PRI_MAX);
>
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> - if (save_state_priority(se) < priority) {
> + for (i = priority - 1; i >= 0; i--) {
> + se = savevm_state.handler_pri_head[i];
> + if (se != NULL) {
> + assert(save_state_priority(se) < priority);
> break;
> }
> }
>
> - if (se) {
> + if (i >= 0) {
> QTAILQ_INSERT_BEFORE(se, nse, entry);
> } else {
> QTAILQ_INSERT_TAIL(&savevm_state.handlers, nse, entry);
> }
> +
> + if (savevm_state.handler_pri_head[priority] == NULL) {
> + savevm_state.handler_pri_head[priority] = nse;
> + }
> }
>
> static void savevm_state_handler_remove(SaveStateEntry *se)
> {
> + SaveStateEntry *next;
> + MigrationPriority priority = save_state_priority(se);
> +
> + if (se == savevm_state.handler_pri_head[priority]) {
> + next = QTAILQ_NEXT(se, entry);
> + if (next != NULL && save_state_priority(next) == priority) {
> + savevm_state.handler_pri_head[priority] = next;
> + } else {
> + savevm_state.handler_pri_head[priority] = NULL;
> + }
> + }
> QTAILQ_REMOVE(&savevm_state.handlers, se, entry);
> }
>
> --
> 2.23.0
>
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK
- [PATCH v2 0/2] migration: faster savevm_state_handler_insert(), Scott Cheloha, 2019/10/17
- [PATCH v2 1/2] migration: add savevm_state_handler_remove(), Scott Cheloha, 2019/10/17
- [PATCH v2 2/2] migration: savevm_state_handler_insert: constant-time element insertion, Scott Cheloha, 2019/10/17
- Re: [PATCH v2 2/2] migration: savevm_state_handler_insert: constant-time element insertion,
Dr. David Alan Gilbert <=
- Re: [PATCH v2 2/2] migration: savevm_state_handler_insert: constant-time element insertion, Laurent Vivier, 2019/10/18
- Re: [PATCH v2 2/2] migration: savevm_state_handler_insert: constant-time element insertion, Dr. David Alan Gilbert, 2019/10/18
- Re: [PATCH v2 2/2] migration: savevm_state_handler_insert: constant-time element insertion, Michael Roth, 2019/10/18
- Re: [PATCH v2 2/2] migration: savevm_state_handler_insert: constant-time element insertion, Dr. David Alan Gilbert, 2019/10/18
- Re: [PATCH v2 2/2] migration: savevm_state_handler_insert: constant-time element insertion, David Gibson, 2019/10/21
- Re: [PATCH v2 2/2] migration: savevm_state_handler_insert: constant-time element insertion, David Gibson, 2019/10/19
- Re: [PATCH v2 2/2] migration: savevm_state_handler_insert: constant-time element insertion, Dr. David Alan Gilbert, 2019/10/21