Re: [RFC] Moving dirty bitmaps to userspace - Double buffering approach

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Mar 08, 2010 at 05:22:43PM +0900, Takuya Yoshikawa wrote:
> Hi, I would like to hear your comments about the following plan:
> 
>   Moving dirty bitmaps to userspace
>     - Double buffering approach
> 
> especially I would be glad if I can hear some advice about how
> to keep the compatibility.
> 
> Thanks in advance,
>   Takuya
> 
> 
> ---
> Overview:
> 
> Last time, I submitted a patch
>   "make get dirty log ioctl return the first dirty page's position"
>    http://www.spinics.net/lists/kvm/msg29724.html
> and got some new better ideas from Avi.
> 
> As a result, I agreed to try to eliminate the bitmap allocation
> done in the x86 KVM every time when we execute get dirty log by
> using "double buffering" approach.
> 
> 
> Here is my plan:
> 
> - move the dirty bitmap allocation to userspace
> 
> We allocate bitmaps in the userspace and register them by ioctl.
> Once a bitmap is registered, we do not touch it from userspace
> and let the kernel modify it directly until we switch to the next
> bitmap. We use "double buffering" at this switch point: userspace
> give the kernel a new bitmap by ioctl and the kernel switch the
> bitmap atomically to new one.
>
> After succeeded in this switch, we can read the old bitmap freely
> in the userspace and free it if we want: needless to say we can
> also reuse it at the next switch.
> 
> 
> - implementation details
> 
> Although it may be possible to touch the bitmap from the kernel
> side without doing kmap, I think kmapping the bitmap is better.
> So we may use the following functions paying enough attention to
> the preemption control.
>   - get_user_pages()
>   - kmap_atomic()
> 
> 
> - compatibility issues
> 
> What I am facing now are the compatibility issues. We have to
> support both the userspace and kernel side bitmap allocations
> to let the current qemu and KVM work properly.
> 
> 1. From the kernel side, we have to care bitmap allocations done in both
> the kvm_vm_ioctl_set_memory_region() and kvm_vm_ioctl_get_dirty_log().
> 
> 2. From the userspace side, we have to check the new api's availability
> and determine which way we use, e.g. by using check extension ioctl.
> 
> The most problematic is 1, kernel side. We have to be able to know
> by which way current bitmap allocation is being done using flags or
> something. In the case of set memory region, we have to judge whether
> we allocate a bitmap, and if not we have to register a bitmap later
> by another api: set memory region is not restricted to the dirty log
> issues and need more care than get dirty log.
> 
> Are there any good ways to solve this kind of problems?

You can introduce a new get_dirty_log ioctl that passes the address
of the next bitmap in userspace, and use it (after pinning with
get_user_pages), instead of vmalloc'ing.


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux