Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp5387919ybv; Tue, 11 Feb 2020 14:53:40 -0800 (PST) X-Google-Smtp-Source: APXvYqyY+r1voIrbqZ8Bqal6orzMBtibaOUCwRvXoX6PSBdmxPeKxX1svMXi0I+MFKRHgsYklNWd X-Received: by 2002:aca:388:: with SMTP id 130mr4206445oid.89.1581461620620; Tue, 11 Feb 2020 14:53:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1581461620; cv=none; d=google.com; s=arc-20160816; b=J9DRnAh7fwakbwiYJvdAzM+YYHs0Eays48ISEHieSrWIY5ELfK6AJgfYu7rv3wFsrd SvCZ5c8pV31m1PacTC+zNIdAmct8WIYK+F8fzwgHZ26o9hc6vPYD7Lx4PZVdztxRrIaV iQpOLOf/cqAWAyC/WnCCM22CyxONVUDHpBcOuADwh1sbpZwwcVO536a+byIejNm35Bi7 dh6nflFTUCMel8dDPVgbVsl6iB6rk7y2aG+SgcZjnXjtcYaONrd34bcfmmpymRYqXZWl zO2DBtdPJ8yC5HWLSEJp6ZsE2X5X5zE/DF/+xy47OQ2ewpjcVVd5WgGAt0LCNIEtcJdU yeJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject:dkim-signature; bh=gbRBokZUeADxG1Js0n3CcSXLvNNKI4dY2r2GfqE2RsE=; b=RcqodMjHtOC3uy7Pn+w9/GOPfV/ET+WvHUvx+gbG0hAuODYsAIcTbcuaDaxv6M3tyq mFkya0P41IzPemiWAPFvJP8mSjmZjU/Yv3tlu0icPABulnfK4kDpLH7unenEiE1gBiQ8 d2/O4rdBV+iXxzdpIKT2fwLatDUxWcbfVrR/sfRV72LnyEMQMP0bGqGjbrXHKdgEN5Or K7FLjvirlezk/6W1ccz1DJc1BRMjQiktRSaxk9l3ccQUj/LqYFuGgYfi5xgkn2r16m3Q +b7ruGxuN4gpKWqx7yBFyDIRMkHMjbYj8bNZ0Oj1GnRyXcjQcQ6CDvsnjLhut0Ir20dH lnFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=RWg0DHYs; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w13si2339611oiw.106.2020.02.11.14.53.27; Tue, 11 Feb 2020 14:53:40 -0800 (PST) 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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=RWg0DHYs; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727822AbgBKWvp (ORCPT + 99 others); Tue, 11 Feb 2020 17:51:45 -0500 Received: from mail-wr1-f66.google.com ([209.85.221.66]:37048 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727646AbgBKWvp (ORCPT ); Tue, 11 Feb 2020 17:51:45 -0500 Received: by mail-wr1-f66.google.com with SMTP id w15so14627155wru.4; Tue, 11 Feb 2020 14:51:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:from:to:cc:date:message-id:in-reply-to:references :user-agent:mime-version:content-transfer-encoding; bh=gbRBokZUeADxG1Js0n3CcSXLvNNKI4dY2r2GfqE2RsE=; b=RWg0DHYshDumqM8KMtdD8WzZEBRBdtcqeptU7cfM++emlBM0larEOBvFM99t8D9+IF f+yjlO17jmr2gdU6vRzDtyc6jwPXblwrne+kIvat6vJnJIGf9MR51g2wmcuMUTcI+8uY oPy/m7ue6+e0HA7536dalkZxz/vAaSTsyrOY7xBgdR6VokqoBmxGaBIt2yCOg+5kkzrl GxdidR52st8cameycVetD0lo8nHhVmMrHBklSFA1l/bBTEBqSzDngjidW1S0TngyWLgS XqMi9DzkafK93/r9NhbP7IhbmwGuE6fUM3t5jdOepH9eqfHCf8CnmJ4/DKYeGxesaCtu 4WOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:date:message-id:in-reply-to :references:user-agent:mime-version:content-transfer-encoding; bh=gbRBokZUeADxG1Js0n3CcSXLvNNKI4dY2r2GfqE2RsE=; b=gAh/YIkN8eHEF+s3sNXVEDXJcsigFiytW7fHKritA+SCphTZ2okOHkPIsg6f9Nnf9B 8fIs45EFC97OSxheh/uFmT4GlRGyqqcD3iwQay/WisWToqJoJd5xOxp3/upIagTbFkUL QK3Jjo/YNpbTXEsfkYrL4sOg0Oo86Dk+Dgh1DS6lhW+ng8xyGPQOHPrFHEyF/26PQE3W skzHDFubZIX53kC5MayVI8n8C8iYeHsz4et182QuwsHixpCRiaI0hY9WckZmqE/fcakC mAZj8JF7R4sPe3PBYD4tt5hlmb6mdwLpJVDtlg9Ve8KFTw1TToG+bH4omHn7fZ126xM7 100g== X-Gm-Message-State: APjAAAXOPMIvkpaa1NJgv40RD6iInNP/HIWrKLFTg+vJ35F1muQOK7Vf Mz+ziTG4cDbIIODXIvjNd8I= X-Received: by 2002:adf:9c8d:: with SMTP id d13mr11670626wre.392.1581461502576; Tue, 11 Feb 2020 14:51:42 -0800 (PST) Received: from localhost.localdomain ([2001:470:b:9c3:9e5c:8eff:fe4f:f2d0]) by smtp.gmail.com with ESMTPSA id d204sm5547055wmd.30.2020.02.11.14.51.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Feb 2020 14:51:42 -0800 (PST) Subject: [PATCH v17 QEMU 3/3] virtio-balloon: Provide a interface for free page reporting From: Alexander Duyck To: virtio-dev@lists.oasis-open.org, kvm@vger.kernel.org, mst@redhat.com, david@redhat.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, akpm@linux-foundation.org Cc: yang.zhang.wz@gmail.com, pagupta@redhat.com, konrad.wilk@oracle.com, nitesh@redhat.com, riel@surriel.com, willy@infradead.org, lcapitulino@redhat.com, dave.hansen@intel.com, wei.w.wang@intel.com, aarcange@redhat.com, pbonzini@redhat.com, dan.j.williams@intel.com, mhocko@kernel.org, mgorman@techsingularity.net, alexander.h.duyck@linux.intel.com, vbabka@suse.cz, osalvador@suse.de Date: Tue, 11 Feb 2020 14:51:36 -0800 Message-ID: <20200211225136.30409.19938.stgit@localhost.localdomain> In-Reply-To: <20200211224416.29318.44077.stgit@localhost.localdomain> References: <20200211224416.29318.44077.stgit@localhost.localdomain> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexander Duyck Add support for what I am referring to as "free 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 +- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c index 455d85b7082f..5faafd2f62ac 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c @@ -321,6 +321,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); @@ -628,7 +662,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); @@ -716,7 +751,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); } @@ -806,6 +842,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); + } + if (virtio_has_feature(s->host_features, VIRTIO_BALLOON_F_FREE_PAGE_HINT)) { s->free_page_vq = virtio_add_queue(vdev, VIRTQUEUE_MAX_SIZE, @@ -939,6 +979,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;