On 28/03/2016 08:59, Michael S. Tsirkin wrote: >> > + qemu_mutex_lock_balloon_bitmap(); >> > for (;;) { >> > size_t offset = 0; >> > uint32_t pfn; >> > elem = virtqueue_pop(vq, sizeof(VirtQueueElement)); >> > if (!elem) { >> > + qemu_mutex_unlock_balloon_bitmap(); >> > return; >> > } >> > >> > @@ -242,6 +245,7 @@ static void virtio_balloon_handle_output(VirtIODevice >> > *vdev, VirtQueue *vq) >> > addr = section.offset_within_region; >> > balloon_page(memory_region_get_ram_ptr(section.mr) + addr, >> > !!(vq == s->dvq)); >> > + qemu_balloon_bitmap_update(addr, !!(vq == s->dvq)); >> > memory_region_unref(section.mr); >> > } >> > > So the assumption here is that offset_within_region equals > ram ptr if region is get_system_memory. > > And I'm not sure that's always right. > > Paolo?
Indeed. It is correct for the main system RAM, but hot-plugged RAM would also have a zero-based section.offset_within_region. You need to add memory_region_get_ram_addr(section.mr), just like the call to balloon_page adds memory_region_get_ram_ptr(section.mr). Paolo