On Mon, Oct 31, 2016 at 03:37:24PM +0100, Paolo Bonzini wrote: [...] > @@ -1309,21 +1317,27 @@ static void *file_ram_alloc(RAMBlock *block, > > file_size = get_file_size(fd); > > - if (memory < block->page_size) { > + if (!mem_size && file_size > 0) { > + mem_size = file_size; > + memory_region_set_size(block->mr, mem_size); > + } > + > + if (mem_size < block->page_size) { > error_setg(errp, "memory size 0x" RAM_ADDR_FMT " must be equal to " > "or larger than page size 0x%zx", > - memory, block->page_size); > + mem_size, block->page_size); > goto error; > } > > - if (file_size > 0 && file_size < memory) { > + if (file_size > 0 && file_size < mem_size) { > error_setg(errp, "backing store %s size %"PRId64 > " does not match 'size' option %"PRIu64, > - path, file_size, memory); > + path, file_size, mem_size); > goto error; > } > > - memory = ROUND_UP(memory, block->page_size); > + mem_size = ROUND_UP(mem_size, block->page_size); > + *memory = mem_size;
I suggested not touching *memory unless it was zero, and setting it to the memory region size, not the rounded-up size. Haozhong said this was going to be changed. This will have the side-effect of setting block->used_length and block->max_length to the rounded up size in qemu_ram_alloc_from_file() (instead of the original memory region size). I don't know what could be the consequences of that. This patch also skip HOST_PAGE_ALIGN-ing mem_size after getting the file size, which would be different from the behavior when size is specified explicitly. (And I also don't know the consequences of that) Considering that this pull request failed to build, I suggest waiting for a new version from Haozhong. -- Eduardo