On 08/13/13 00:43, Michael S. Tsirkin wrote: > Migration code assumes that each RAM block is a multiple of target page > size.
Isn't that a valid assumption, considering the TARGET_PAGE_ALIGN() macro call in qemu_ram_alloc_from_ptr() [exec.c]? > We can fix this in a variety of ways, the simplest way is > exporting the required page size so callers can make regions > large enough. > > Signed-off-by: Michael S. Tsirkin <m...@redhat.com> > --- > arch_init.c | 6 ++++++ > include/exec/memory.h | 1 + > 2 files changed, 7 insertions(+) > > diff --git a/arch_init.c b/arch_init.c > index 68a7ab7..c62778f 100644 > --- a/arch_init.c > +++ b/arch_init.c > @@ -150,6 +150,12 @@ int qemu_read_default_config_files(bool userconfig) > return 0; > } > > +/* Smallest page size for migrated RAM. */ > +uint64_t qemu_migration_page_size(void) > +{ > + return TARGET_PAGE_SIZE; > +} > + > static inline bool is_zero_page(uint8_t *p) > { > return buffer_find_nonzero_offset(p, TARGET_PAGE_SIZE) == > diff --git a/include/exec/memory.h b/include/exec/memory.h > index ebe0d24..6ffffa2 100644 > --- a/include/exec/memory.h > +++ b/include/exec/memory.h > @@ -1055,6 +1055,7 @@ void *address_space_map(AddressSpace *as, hwaddr addr, > void address_space_unmap(AddressSpace *as, void *buffer, hwaddr len, > int is_write, hwaddr access_len); > > +extern uint64_t qemu_migration_page_size(void); > > #endif External linkage functions that are defined in "arch_init.c", and relate to migration -- for example, skipped_mig_bytes_transferred() -- are declared in "include/migration/migration.h". They seem to use TARGET_PAGE_SIZE too. What justifies declaring this new function in "include/exec/memory.h"? Thanks, Laszlo