Skip to content

Commit

Permalink
ram: Split host_from_stream_offset() into two helper functions
Browse files Browse the repository at this point in the history
Split host_from_stream_offset() into two parts:
One is to get ram block, which the block idstr may be get from migration
stream, the other is to get hva (host) address from block and the offset.
Besides, we will do the check working in a new helper offset_in_ramblock().

Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Amit Shah <amit.shah@redhat.com>
Message-Id: <1452829066-9764-2-git-send-email-zhang.zhanghailiang@huawei.com>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
  • Loading branch information
colo-ft authored and Amit Shah committed Feb 5, 2016
1 parent d38ea87 commit 4c4bad4
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 17 deletions.
8 changes: 6 additions & 2 deletions include/exec/ram_addr.h
Expand Up @@ -38,10 +38,14 @@ struct RAMBlock {
int fd;
};

static inline bool offset_in_ramblock(RAMBlock *b, ram_addr_t offset)
{
return (b && b->host && offset < b->used_length) ? true : false;
}

static inline void *ramblock_ptr(RAMBlock *block, ram_addr_t offset)
{
assert(offset < block->used_length);
assert(block->host);
assert(offset_in_ramblock(block, offset));
return (char *)block->host + offset;
}

Expand Down
40 changes: 25 additions & 15 deletions migration/ram.c
Expand Up @@ -2124,41 +2124,47 @@ static int load_xbzrle(QEMUFile *f, ram_addr_t addr, void *host)
* Returns a pointer from within the RCU-protected ram_list.
*/
/*
* Read a RAMBlock ID from the stream f, find the host address of the
* start of that block and add on 'offset'
* Read a RAMBlock ID from the stream f.
*
* f: Stream to read from
* offset: Offset within the block
* flags: Page flags (mostly to see if it's a continuation of previous block)
*/
static inline void *host_from_stream_offset(QEMUFile *f,
ram_addr_t offset,
int flags)
static inline RAMBlock *ram_block_from_stream(QEMUFile *f,
int flags)
{
static RAMBlock *block = NULL;
char id[256];
uint8_t len;

if (flags & RAM_SAVE_FLAG_CONTINUE) {
if (!block || block->max_length <= offset) {
if (!block) {
error_report("Ack, bad migration stream!");
return NULL;
}

return block->host + offset;
return block;
}

len = qemu_get_byte(f);
qemu_get_buffer(f, (uint8_t *)id, len);
id[len] = 0;

block = qemu_ram_block_by_name(id);
if (block && block->max_length > offset) {
return block->host + offset;
if (!block) {
error_report("Can't find block %s", id);
return NULL;
}

error_report("Can't find block %s", id);
return NULL;
return block;
}

static inline void *host_from_ram_block_offset(RAMBlock *block,
ram_addr_t offset)
{
if (!offset_in_ramblock(block, offset)) {
return NULL;
}

return block->host + offset;
}

/*
Expand Down Expand Up @@ -2302,7 +2308,9 @@ static int ram_load_postcopy(QEMUFile *f)
trace_ram_load_postcopy_loop((uint64_t)addr, flags);
place_needed = false;
if (flags & (RAM_SAVE_FLAG_COMPRESS | RAM_SAVE_FLAG_PAGE)) {
host = host_from_stream_offset(f, addr, flags);
RAMBlock *block = ram_block_from_stream(f, flags);

host = host_from_ram_block_offset(block, addr);
if (!host) {
error_report("Illegal RAM offset " RAM_ADDR_FMT, addr);
ret = -EINVAL;
Expand Down Expand Up @@ -2433,7 +2441,9 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id)

if (flags & (RAM_SAVE_FLAG_COMPRESS | RAM_SAVE_FLAG_PAGE |
RAM_SAVE_FLAG_COMPRESS_PAGE | RAM_SAVE_FLAG_XBZRLE)) {
host = host_from_stream_offset(f, addr, flags);
RAMBlock *block = ram_block_from_stream(f, flags);

host = host_from_ram_block_offset(block, addr);
if (!host) {
error_report("Illegal RAM offset " RAM_ADDR_FMT, addr);
ret = -EINVAL;
Expand Down

0 comments on commit 4c4bad4

Please sign in to comment.