lkml.org 
[lkml]   [2019]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH v2 QEMU] virtio-balloon: Provide a interface for "bubble hinting"
    From
    Date

    On 7/24/19 4:18 PM, Alexander Duyck wrote:
    > On Wed, 2019-07-24 at 15:02 -0400, Michael S. Tsirkin wrote:
    >> On Wed, Jul 24, 2019 at 10:12:10AM -0700, Alexander Duyck wrote:
    >>> From: Alexander Duyck <alexander.h.duyck@linux.intel.com>
    >>>
    >>> Add support for what I am referring to as "bubble hinting". Basically the
    >>> idea is to function very similar to how the balloon works in that we
    >>> basically end up madvising the page as not being used. However we don't
    >>> really need to bother with any deflate type logic since the page will be
    >>> faulted back into the guest when it is read or written to.
    >>>
    >>> This is meant to be a simplification of the existing balloon interface
    >>> to use for providing hints to what memory needs to be freed. I am assuming
    >>> this is safe to do as the deflate logic does not actually appear to do very
    >>> much other than tracking what subpages have been released and which ones
    >>> haven't.
    >>>
    >>> Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com>
    >>> ---
    >>> hw/virtio/virtio-balloon.c | 40 +++++++++++++++++++++++
    >>> include/hw/virtio/virtio-balloon.h | 2 +
    >>> include/standard-headers/linux/virtio_balloon.h | 1 +
    >>> 3 files changed, 42 insertions(+), 1 deletion(-)
    >>>
    >>> diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
    >>> index 2112874055fb..70c0004c0f88 100644
    >>> --- a/hw/virtio/virtio-balloon.c
    >>> +++ b/hw/virtio/virtio-balloon.c
    >>> @@ -328,6 +328,39 @@ static void balloon_stats_set_poll_interval(Object *obj, Visitor *v,
    >>> balloon_stats_change_timer(s, 0);
    >>> }
    >>>
    >>> +static void virtio_bubble_handle_output(VirtIODevice *vdev, VirtQueue *vq)
    >>> +{
    >>> + VirtQueueElement *elem;
    >>> +
    >>> + while ((elem = virtqueue_pop(vq, sizeof(VirtQueueElement)))) {
    >>> + unsigned int i;
    >>> +
    >>> + for (i = 0; i < elem->in_num; i++) {
    >>> + void *addr = elem->in_sg[i].iov_base;
    >>> + size_t size = elem->in_sg[i].iov_len;
    >>> + ram_addr_t ram_offset;
    >>> + size_t rb_page_size;
    >>> + RAMBlock *rb;
    >>> +
    >>> + if (qemu_balloon_is_inhibited())
    >>> + continue;
    >>> +
    >>> + rb = qemu_ram_block_from_host(addr, false, &ram_offset);
    >>> + rb_page_size = qemu_ram_pagesize(rb);
    >>> +
    >>> + /* For now we will simply ignore unaligned memory regions */
    >>> + if ((ram_offset | size) & (rb_page_size - 1))
    >>> + continue;
    >>> +
    >>> + ram_block_discard_range(rb, ram_offset, size);
    >> I suspect this needs to do like the migration type of
    >> hinting and get disabled if page poisoning is in effect.
    >> Right?
    > Shouldn't something like that end up getting handled via
    > qemu_balloon_is_inhibited, or did I miss something there? I assumed cases
    > like that would end up setting qemu_balloon_is_inhibited to true, if that
    > isn't the case then I could add some additional conditions. I would do it
    > in about the same spot as the qemu_balloon_is_inhibited check.


    Just wondering if you have tried running these patches in an environment with
    directly assigned devices? Ideally, I would expect qemu_balloon_is_inhibited()
    to take care of it.


    >
    >
    --
    Thanks
    Nitesh

    \
     
     \ /
      Last update: 2019-07-25 13:58    [W:5.649 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site