diff options
author | Wei Yang <richardw.yang@linux.intel.com> | 2019-07-24 09:07:21 +0800 |
---|---|---|
committer | Dr. David Alan Gilbert <dgilbert@redhat.com> | 2019-08-14 17:33:14 +0100 |
commit | 810cf2bbd4c5c1417bda8bec49caf0ababc22860 (patch) | |
tree | 5e1fea316fe52acd81cf3c43ab1f95da17813b81 /migration/ram.c | |
parent | 10da4a368992a5950abd07673ba8311fbbe667f5 (diff) |
migration/postcopy: make PostcopyDiscardState a static variable
In postcopy-ram.c, we provide three functions to discard certain
RAMBlock range:
* postcopy_discard_send_init()
* postcopy_discard_send_range()
* postcopy_discard_send_finish()
Currently, we allocate/deallocate PostcopyDiscardState for each RAMBlock
on sending discard information to destination. This is not necessary and
the same data area could be reused for each RAMBlock.
This patch defines PostcopyDiscardState a static variable. By doing so:
1) avoid memory allocation and deallocation to the system
2) avoid potential failure of memory allocation
3) hide some details for their users
Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
Message-Id: <20190724010721.2146-1-richardw.yang@linux.intel.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Diffstat (limited to 'migration/ram.c')
-rw-r--r-- | migration/ram.c | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/migration/ram.c b/migration/ram.c index a44e9c0abc..f428639af5 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -2850,12 +2850,9 @@ void ram_postcopy_migrated_memory_release(MigrationState *ms) * with the dirtymap; so a '1' means it's either dirty or unsent. * * @ms: current migration state - * @pds: state for postcopy * @block: RAMBlock to discard */ -static int postcopy_send_discard_bm_ram(MigrationState *ms, - PostcopyDiscardState *pds, - RAMBlock *block) +static int postcopy_send_discard_bm_ram(MigrationState *ms, RAMBlock *block) { unsigned long end = block->used_length >> TARGET_PAGE_BITS; unsigned long current; @@ -2876,7 +2873,7 @@ static int postcopy_send_discard_bm_ram(MigrationState *ms, } else { discard_length = zero - one; } - postcopy_discard_send_range(ms, pds, one, discard_length); + postcopy_discard_send_range(ms, one, discard_length); current = one + discard_length; } @@ -2902,16 +2899,15 @@ static int postcopy_each_ram_send_discard(MigrationState *ms) int ret; RAMBLOCK_FOREACH_NOT_IGNORED(block) { - PostcopyDiscardState *pds = - postcopy_discard_send_init(ms, block->idstr); + postcopy_discard_send_init(ms, block->idstr); /* * Postcopy sends chunks of bitmap over the wire, but it * just needs indexes at this point, avoids it having * target page specific code. */ - ret = postcopy_send_discard_bm_ram(ms, pds, block); - postcopy_discard_send_finish(ms, pds); + ret = postcopy_send_discard_bm_ram(ms, block); + postcopy_discard_send_finish(ms); if (ret) { return ret; } @@ -2934,11 +2930,9 @@ static int postcopy_each_ram_send_discard(MigrationState *ms) * @unsent_pass: if true we need to canonicalize partially unsent host pages * otherwise we need to canonicalize partially dirty host pages * @block: block that contains the page we want to canonicalize - * @pds: state for postcopy */ static void postcopy_chunk_hostpages_pass(MigrationState *ms, bool unsent_pass, - RAMBlock *block, - PostcopyDiscardState *pds) + RAMBlock *block) { RAMState *rs = ram_state; unsigned long *bitmap = block->bmap; @@ -3018,8 +3012,7 @@ static void postcopy_chunk_hostpages_pass(MigrationState *ms, bool unsent_pass, * (any partially sent pages were already discarded * by the previous unsent_pass) */ - postcopy_discard_send_range(ms, pds, fixup_start_addr, - host_ratio); + postcopy_discard_send_range(ms, fixup_start_addr, host_ratio); } /* Clean up the bitmap */ @@ -3062,18 +3055,17 @@ static void postcopy_chunk_hostpages_pass(MigrationState *ms, bool unsent_pass, */ static int postcopy_chunk_hostpages(MigrationState *ms, RAMBlock *block) { - PostcopyDiscardState *pds = - postcopy_discard_send_init(ms, block->idstr); + postcopy_discard_send_init(ms, block->idstr); /* First pass: Discard all partially sent host pages */ - postcopy_chunk_hostpages_pass(ms, true, block, pds); + postcopy_chunk_hostpages_pass(ms, true, block); /* * Second pass: Ensure that all partially dirty host pages are made * fully dirty. */ - postcopy_chunk_hostpages_pass(ms, false, block, pds); + postcopy_chunk_hostpages_pass(ms, false, block); - postcopy_discard_send_finish(ms, pds); + postcopy_discard_send_finish(ms); return 0; } |