Alexey Perevalov <a.pereva...@samsung.com> wrote: > This patch adds ability to track down already received > pages, it's necessary for calculation vCPU block time in > postcopy migration feature, maybe for restore after > postcopy migration failure. > Also it's necessary to solve shared memory issue in > postcopy livemigration. Information about received pages > will be transferred to the software virtual bridge > (e.g. OVS-VSWITCHD), to avoid fallocate (unmap) for > already received pages. fallocate syscall is required for > remmaped shared memory, due to remmaping itself blocks > ioctl(UFFDIO_COPY, ioctl in this case will end with EEXIT > error (struct page is exists after remmap). > > Bitmap is placed into RAMBlock as another postcopy/precopy > related bitmaps. > > Signed-off-by: Alexey Perevalov <a.pereva...@samsung.com>
Hi A few commets. Happy with all the changes that you did. > @@ -60,6 +62,7 @@ static inline void *ramblock_ptr(RAMBlock *block, > ram_addr_t offset) > return (char *)block->host + offset; > } > > +unsigned long int ramblock_recv_bitmap_offset(void *host_addr, RAMBlock *rb); > long qemu_getrampagesize(void); > unsigned long last_ram_page(void); > RAMBlock *qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr, I think we shouldn't export it at all. But if we do, we should export it with the other functions. > +unsigned long int ramblock_recv_bitmap_offset(void *host_addr, RAMBlock *rb) I think this function can be made static, as nothing else should use it, no? > +{ > + uint64_t host_addr_offset = (uint64_t)(uintptr_t)(host_addr > + - (void *)rb->host); Intdentation is weird: uint64_t host_addr_offset = (uint64_t)(uintptr_t)(host_addr - (void *)rb->host); > + return host_addr_offset >> TARGET_PAGE_BITS; > +} > + > +int ramblock_recv_bitmap_test(void *host_addr, RAMBlock *rb) > +{ > + return test_bit(ramblock_recv_bitmap_offset(host_addr, rb), > + rb->receivedmap); > +} > + > +void ramblock_recv_bitmap_set(void *host_addr, RAMBlock *rb) > +{ > + set_bit_atomic(ramblock_recv_bitmap_offset(host_addr, rb), > rb->receivedmap); Line is too long? > +static void ramblock_recv_bitmap_clear_range(uint64_t start, size_t length, > + RAMBlock *rb) > +{ > + int i, range_count; > + range_count = length >> TARGET_PAGE_BITS; > + for (i = 0; i < range_count; i++) { > + ramblock_recv_bitmap_clear((void *)((uint64_t)(intptr_t)rb->host + > + start), rb); > + start += TARGET_PAGE_SIZE; bitmap_clear(dst, pos, nbits) Clear specified bit area Looks like the right operation here, no? > + > +void ramblock_recv_map_init(void); > +int ramblock_recv_bitmap_test(void *host_addr, RAMBlock *rb); > +void ramblock_recv_bitmap_set(void *host_addr, RAMBlock *rb); > +void ramblock_recv_bitmap_clear(void *host_addr, RAMBlock *rb); > + > #endif Later, Juan.