[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH RFC 10/15] migration: Move static var in ram_block_from_strea
From: |
Dr. David Alan Gilbert |
Subject: |
Re: [PATCH RFC 10/15] migration: Move static var in ram_block_from_stream() into global |
Date: |
Thu, 3 Feb 2022 17:48:31 +0000 |
User-agent: |
Mutt/2.1.5 (2021-12-30) |
* Peter Xu (peterx@redhat.com) wrote:
> Static variable is very unfriendly to threading of ram_block_from_stream().
> Move it into MigrationIncomingState.
>
> Make the incoming state pointer to be passed over to ram_block_from_stream()
> on
> both caller sites.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
OK, but I'm not sure if I noticed where you changed this to be per
channel later?
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Dave
> ---
> migration/migration.h | 3 ++-
> migration/ram.c | 13 +++++++++----
> 2 files changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/migration/migration.h b/migration/migration.h
> index 35e7f7babe..34b79cb961 100644
> --- a/migration/migration.h
> +++ b/migration/migration.h
> @@ -66,7 +66,8 @@ typedef struct {
> /* State for the incoming migration */
> struct MigrationIncomingState {
> QEMUFile *from_src_file;
> -
> + /* Previously received RAM's RAMBlock pointer */
> + RAMBlock *last_recv_block;
> /* A hook to allow cleanup at the end of incoming migration */
> void *transport_data;
> void (*transport_cleanup)(void *data);
> diff --git a/migration/ram.c b/migration/ram.c
> index 3f823ffffc..3a7d943f9c 100644
> --- a/migration/ram.c
> +++ b/migration/ram.c
> @@ -3183,12 +3183,14 @@ static int load_xbzrle(QEMUFile *f, ram_addr_t addr,
> void *host)
> *
> * Returns a pointer from within the RCU-protected ram_list.
> *
> + * @mis: the migration incoming state pointer
> * @f: QEMUFile where to read the data from
> * @flags: Page flags (mostly to see if it's a continuation of previous
> block)
> */
> -static inline RAMBlock *ram_block_from_stream(QEMUFile *f, int flags)
> +static inline RAMBlock *ram_block_from_stream(MigrationIncomingState *mis,
> + QEMUFile *f, int flags)
> {
> - static RAMBlock *block;
> + RAMBlock *block = mis->last_recv_block;
> char id[256];
> uint8_t len;
>
> @@ -3215,6 +3217,8 @@ static inline RAMBlock *ram_block_from_stream(QEMUFile
> *f, int flags)
> return NULL;
> }
>
> + mis->last_recv_block = block;
> +
> return block;
> }
>
> @@ -3667,7 +3671,7 @@ static int ram_load_postcopy(QEMUFile *f)
> trace_ram_load_postcopy_loop((uint64_t)addr, flags);
> if (flags & (RAM_SAVE_FLAG_ZERO | RAM_SAVE_FLAG_PAGE |
> RAM_SAVE_FLAG_COMPRESS_PAGE)) {
> - block = ram_block_from_stream(f, flags);
> + block = ram_block_from_stream(mis, f, flags);
> if (!block) {
> ret = -EINVAL;
> break;
> @@ -3881,6 +3885,7 @@ void colo_flush_ram_cache(void)
> */
> static int ram_load_precopy(QEMUFile *f)
> {
> + MigrationIncomingState *mis = migration_incoming_get_current();
> int flags = 0, ret = 0, invalid_flags = 0, len = 0, i = 0;
> /* ADVISE is earlier, it shows the source has the postcopy capability on
> */
> bool postcopy_advised = postcopy_is_advised();
> @@ -3919,7 +3924,7 @@ static int ram_load_precopy(QEMUFile *f)
>
> if (flags & (RAM_SAVE_FLAG_ZERO | RAM_SAVE_FLAG_PAGE |
> RAM_SAVE_FLAG_COMPRESS_PAGE | RAM_SAVE_FLAG_XBZRLE)) {
> - RAMBlock *block = ram_block_from_stream(f, flags);
> + RAMBlock *block = ram_block_from_stream(mis, f, flags);
>
> host = host_from_ram_block_offset(block, addr);
> /*
> --
> 2.32.0
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
- Re: [PATCH RFC 10/15] migration: Move static var in ram_block_from_stream() into global,
Dr. David Alan Gilbert <=