Received: by 2002:a25:b794:0:0:0:0:0 with SMTP id n20csp1178756ybh; Sat, 3 Aug 2019 19:54:55 -0700 (PDT) X-Google-Smtp-Source: APXvYqxH3gUmd/0dyLhQpHXP5r6MptAjkfVaa4sZSF4c5Eb9fWwjRl2rz/y/SOsvyQJptkVB7jpz X-Received: by 2002:a17:902:76c7:: with SMTP id j7mr134440343plt.247.1564887295825; Sat, 03 Aug 2019 19:54:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564887295; cv=none; d=google.com; s=arc-20160816; b=gdZ2pvQmi6tLBSMO6Tw4lzP5PzZSnPsrRc+wmhlo/nWJAqvzishEfrYcR/DfkhqH41 S8w9gH0pOQ220KK5FtUVrhNf8vGI4WSqkmkhV2dUYeOwdyDPyfQm/jOIYcsXvuVhN8R9 0T8osDQg6p+o2pbg5MipHfYfKa337t6Ur6xcfLEFiaMsoqttqV40gh5v4QXNLufSIge/ 52OeVq/2P6RxwWZVEPQFpFBGn8Z7a5qUp+lVSGNmWDvIZdPHGpwwUeX7ydtxcgGSqIKX Ni/pmUpAMwfKMCQ3QWTXqVepJhCK1FhmH/tNSz6QHWwtwJCDmSRf+xRlaI7bZ2mxXQyI 3zMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:organization:autocrypt:openpgp:from:references:cc:to :subject; bh=lf3M3Kc30vXzOr7tbQK+QSBeU0YL/ipBMHg49PB8Zes=; b=hpvov9u4gHSNywRABgqlQe/qUTxDwBsiqP8t+mg6oR+ZQI+HAlxBbqRWp0L9ZUSYer 2m5SdsBaKMVjLYrSENU2wIFpaTpCJU6AK+uQnUInyY0wIiVbm5lBJpYpmsC+vfBb4CVa v/q9CKVKabKknk4tlve6ws7mn4Vd894kMA/o18DEz5kZwbW613CV0avYHO9FdkrFkgTc 1pqVulU22O6YCnACZ5hlBAU9DYxcbqAtFkJRc9Z+gI6cpnsCmRfgGJZ84WwrvlNraB/v pyq6GL2XST6Jzwi91DsBSlY3yDlWRSGgfrMZNV0q40+B58SvMO96Va1gGASY492oWNUC 0XrQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j74si9794433pje.12.2019.08.03.19.54.40; Sat, 03 Aug 2019 19:54:55 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2437002AbfHBUkZ convert rfc822-to-8bit (ORCPT + 99 others); Fri, 2 Aug 2019 16:40:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52460 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728669AbfHBUkY (ORCPT ); Fri, 2 Aug 2019 16:40:24 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E9C2F3090FD0; Fri, 2 Aug 2019 20:40:23 +0000 (UTC) Received: from [10.40.204.149] (ovpn-204-149.brq.redhat.com [10.40.204.149]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3B1195C207; Fri, 2 Aug 2019 20:40:03 +0000 (UTC) Subject: Re: [PATCH v3 QEMU 2/2] virtio-balloon: Provide a interface for unused page reporting To: Alexander Duyck , kvm@vger.kernel.org, david@redhat.com, mst@redhat.com, dave.hansen@intel.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, akpm@linux-foundation.org Cc: yang.zhang.wz@gmail.com, pagupta@redhat.com, riel@surriel.com, konrad.wilk@oracle.com, willy@infradead.org, lcapitulino@redhat.com, wei.w.wang@intel.com, aarcange@redhat.com, pbonzini@redhat.com, dan.j.williams@intel.com, alexander.h.duyck@linux.intel.com References: <20190801222158.22190.96964.stgit@localhost.localdomain> <20190801224320.24744.16673.stgit@localhost.localdomain> From: Nitesh Narayan Lal Openpgp: preference=signencrypt Autocrypt: addr=nitesh@redhat.com; prefer-encrypt=mutual; keydata= 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 VujM7c/b4pps Organization: Red Hat Inc, Message-ID: <63bbf480-7d0c-dd5c-08bf-1951039fcd54@redhat.com> Date: Fri, 2 Aug 2019 16:40:00 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: <20190801224320.24744.16673.stgit@localhost.localdomain> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8BIT Content-Language: en-US X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Fri, 02 Aug 2019 20:40:24 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 8/1/19 6:43 PM, Alexander Duyck wrote: > From: Alexander Duyck > > Add support for what I am referring to as "unused page reporting". > 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 > --- > hw/virtio/virtio-balloon.c | 46 ++++++++++++++++++++++- > include/hw/virtio/virtio-balloon.h | 2 + > include/standard-headers/linux/virtio_balloon.h | 1 + > 3 files changed, 46 insertions(+), 3 deletions(-) > > diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c > index 003b3ebcfdfb..7a30df63bc77 100644 > --- a/hw/virtio/virtio-balloon.c > +++ b/hw/virtio/virtio-balloon.c > @@ -320,6 +320,40 @@ static void balloon_stats_set_poll_interval(Object *obj, Visitor *v, > balloon_stats_change_timer(s, 0); > } > > +static void virtio_balloon_handle_report(VirtIODevice *vdev, VirtQueue *vq) > +{ > + VirtIOBalloon *dev = VIRTIO_BALLOON(vdev); > + 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() || dev->poison_val) > + 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); > + } > + > + virtqueue_push(vq, elem, 0); > + virtio_notify(vdev, vq); > + g_free(elem); > + } > +} > + > static void virtio_balloon_handle_output(VirtIODevice *vdev, VirtQueue *vq) > { > VirtIOBalloon *s = VIRTIO_BALLOON(vdev); > @@ -627,7 +661,8 @@ static size_t virtio_balloon_config_size(VirtIOBalloon *s) > return sizeof(struct virtio_balloon_config); > } > if (virtio_has_feature(features, VIRTIO_BALLOON_F_PAGE_POISON) || > - virtio_has_feature(features, VIRTIO_BALLOON_F_FREE_PAGE_HINT)) { > + virtio_has_feature(features, VIRTIO_BALLOON_F_FREE_PAGE_HINT) || > + virtio_has_feature(features, VIRTIO_BALLOON_F_REPORTING)) { > return sizeof(struct virtio_balloon_config); > } > return offsetof(struct virtio_balloon_config, free_page_report_cmd_id); > @@ -715,7 +750,8 @@ static uint64_t virtio_balloon_get_features(VirtIODevice *vdev, uint64_t f, > VirtIOBalloon *dev = VIRTIO_BALLOON(vdev); > f |= dev->host_features; > virtio_add_feature(&f, VIRTIO_BALLOON_F_STATS_VQ); > - if (virtio_has_feature(f, VIRTIO_BALLOON_F_FREE_PAGE_HINT)) { > + if (virtio_has_feature(f, VIRTIO_BALLOON_F_FREE_PAGE_HINT) || > + virtio_has_feature(f, VIRTIO_BALLOON_F_REPORTING)) { > virtio_add_feature(&f, VIRTIO_BALLOON_F_PAGE_POISON); > } > > @@ -805,6 +841,10 @@ static void virtio_balloon_device_realize(DeviceState *dev, Error **errp) > s->dvq = virtio_add_queue(vdev, 128, virtio_balloon_handle_output); > s->svq = virtio_add_queue(vdev, 128, virtio_balloon_receive_stats); > > + if (virtio_has_feature(s->host_features, VIRTIO_BALLOON_F_REPORTING)) { > + s->rvq = virtio_add_queue(vdev, 32, virtio_balloon_handle_report); > + } > + This does makes sense. I haven't seen the kernel patch yet, but I am guessing you will use this max_vq size to define the capacity. > if (virtio_has_feature(s->host_features, > VIRTIO_BALLOON_F_FREE_PAGE_HINT)) { > s->free_page_vq = virtio_add_queue(vdev, VIRTQUEUE_MAX_SIZE, > @@ -931,6 +971,8 @@ static Property virtio_balloon_properties[] = { > */ > DEFINE_PROP_BOOL("qemu-4-0-config-size", VirtIOBalloon, > qemu_4_0_config_size, false), > + DEFINE_PROP_BIT("unused-page-reporting", VirtIOBalloon, host_features, > + VIRTIO_BALLOON_F_REPORTING, true), > DEFINE_PROP_LINK("iothread", VirtIOBalloon, iothread, TYPE_IOTHREAD, > IOThread *), > DEFINE_PROP_END_OF_LIST(), > diff --git a/include/hw/virtio/virtio-balloon.h b/include/hw/virtio/virtio-balloon.h > index 7fe78e5c14d7..db5bf7127112 100644 > --- a/include/hw/virtio/virtio-balloon.h > +++ b/include/hw/virtio/virtio-balloon.h > @@ -42,7 +42,7 @@ enum virtio_balloon_free_page_report_status { > > typedef struct VirtIOBalloon { > VirtIODevice parent_obj; > - VirtQueue *ivq, *dvq, *svq, *free_page_vq; > + VirtQueue *ivq, *dvq, *svq, *free_page_vq, *rvq; > uint32_t free_page_report_status; > uint32_t num_pages; > uint32_t actual; > diff --git a/include/standard-headers/linux/virtio_balloon.h b/include/standard-headers/linux/virtio_balloon.h > index 9375ca2a70de..1c5f6d6f2de6 100644 > --- a/include/standard-headers/linux/virtio_balloon.h > +++ b/include/standard-headers/linux/virtio_balloon.h > @@ -36,6 +36,7 @@ > #define VIRTIO_BALLOON_F_DEFLATE_ON_OOM 2 /* Deflate balloon on OOM */ > #define VIRTIO_BALLOON_F_FREE_PAGE_HINT 3 /* VQ to report free pages */ > #define VIRTIO_BALLOON_F_PAGE_POISON 4 /* Guest is using page poisoning */ > +#define VIRTIO_BALLOON_F_REPORTING 5 /* Page reporting virtqueue */ Do we really need this change? or is this something which is picked from the Linux kernel? If we do need it, then Cornelia suggested to split off any update to this header into a separate patch, so that it can be replaced by a proper headers update when it is merged. > > /* Size of a PFN in the balloon interface. */ > #define VIRTIO_BALLOON_PFN_SHIFT 12 > -- Thanks Nitesh