Received: by 2002:a25:c593:0:0:0:0:0 with SMTP id v141csp820259ybe; Wed, 4 Sep 2019 08:13:26 -0700 (PDT) X-Google-Smtp-Source: APXvYqzOJlqcZyoQmgT8QSjHOwk8rqF/K98egQsjJ5iLZfdcDSDSNXmX7wS5XGUtZmH5JvI0flUp X-Received: by 2002:a17:90a:fa3:: with SMTP id 32mr5576971pjz.35.1567610006462; Wed, 04 Sep 2019 08:13:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1567610006; cv=none; d=google.com; s=arc-20160816; b=Qc+JrdBOQ4fryO8eHxfSvTTRb0vVWqynV8S/XGJkPUlBk/Pkv8l2FZv0/SOVDuoU21 FbqGQpxDF0hWqXM9UjXJlOkS9w0musbo4GtVB9jXdnMOZyCFNKpjYII/M+sLtB5/YBKe 6H1dwfB9YNtaMzD3Z9PCTaIu5Qnb4OZGwRzNdWZ/+pfHDJy617qYDqHUpDU3dsrAk0R0 wyueHTr8qHO76ZBl5XBh/Ep+RIEgp1D057Q4+dKG6qWB8UBaT8uggcs02wnN7KpLLaKC G3RqX67es0kpRcQrh3gcok2L87I0eShVDfutqschYQb1e9xjIuPBBIEOWbE82fWK1Mrm sTfg== 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=R9EIePxtKgh7rutMNGBvqWvR/nyIQIv1yBQVlI6lc80=; b=xT8cvw3nqaYDWridLQkASICJVYOJw2Wm6TgN8baIWPJmcjr4tkqiU6qi2vC/oooM7H ilFoH9CizYOJXEdJKytQSrqYb8xUGHKxfoq6R/4F+QspZ/HcSxjRmcdGK8CbRTRxHIe0 DfHegp6rI8E0npGvu2h+2t5meABdBaDbxl7RZHzDzz8Q5SYyM/DmUa1y3qSnstkHn2c5 MylTwsBrsqOcLGZ/PfGys1CxNCqaJKxoKI+uypdTwCaM2qnU+fT7HFgBJ4wNR4ZXp0fp bLssYns0cCOvJE9mJF2TbQRH/tTZxP0b2JTF0lBJtv2V4E0v6SbO5XbEuJRyB6iXNEsl Qxqg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="Icdioip/"; 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 y8si1662572plp.294.2019.09.04.08.13.10; Wed, 04 Sep 2019 08:13:26 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b="Icdioip/"; 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 S1731455AbfIDPL6 (ORCPT + 99 others); Wed, 4 Sep 2019 11:11:58 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:40429 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731212AbfIDPL6 (ORCPT ); Wed, 4 Sep 2019 11:11:58 -0400 Received: by mail-pf1-f196.google.com with SMTP id x127so745688pfb.7; Wed, 04 Sep 2019 08:11:57 -0700 (PDT) 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=R9EIePxtKgh7rutMNGBvqWvR/nyIQIv1yBQVlI6lc80=; b=Icdioip/LrE7zC1LjFhruymYKz5CChvFweZFNaQHSt0elL4kf0rEcwoiDnrDAo4wsd lculUOTKABzUpllh/6JcZEK1C9+szQUevDm2233hJRsBXFMqL+lPRscj3lXDE/HHlbPc IBQXiIFzd2gHcYCAeLDhNUCB6KcdFk+xudcysNTpWBn1q0+V0ZbnDtTTKUv4dZtnXFTF SDeiUW0XA4dD6JYzcDZrrCDgkttwlOmQb5RhC2E0bY2x7KP9gIYZHnqGku9VfUVUpUzw weh3WeDoEkbWkXv/rneDrEogXrWTovdbhvtRNFXL0460yxwc4bSW4ENUncFhf71IfM/p s5zg== 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=R9EIePxtKgh7rutMNGBvqWvR/nyIQIv1yBQVlI6lc80=; b=biJkbAYVTCLJT2t288O0Xzi4TBwUdQXD7EUJTsg82kb3u168n54OOKv/RXQk8cCnhE 5iWHUdxvSwZRKkp1hp0ogU0RM0R1oINOZl1oQlhjdX1NXA4RgoXnImAIuxcwz2H9bYYz usUSSZVWPzMCJeF5RSZWlVXpvIBqIsNGaLCI9MtN5UYZAWN4tyFOJjrKFZ3px+FI71Sk r8A6v1cD9strkNxViDqLjjFE9QBRx8YMSy0Lq5LuGMh9mq+IqD5xE0D2r4GRgZrWB/Mm fGJC7wimp1MGEIn0jueSd5G5AhnPRcZIMtfY3z9WaPNVocBNFO/AjHq4eFj7PHnX4QY4 GYzg== X-Gm-Message-State: APjAAAXwQW3IySmrSuO9W53fgT79Yz796fVF51GkUMB012Lc0MiZF4/e DeQW89dygcAWX1qbQFy99zM= X-Received: by 2002:a65:4505:: with SMTP id n5mr21223408pgq.301.1567609917279; Wed, 04 Sep 2019 08:11:57 -0700 (PDT) Received: from localhost.localdomain ([2001:470:b:9c3:9e5c:8eff:fe4f:f2d0]) by smtp.gmail.com with ESMTPSA id q186sm11375401pfb.47.2019.09.04.08.11.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 04 Sep 2019 08:11:56 -0700 (PDT) Subject: [PATCH v7 QEMU 3/3] virtio-balloon: Provide a interface for unused page reporting From: Alexander Duyck To: nitesh@redhat.com, kvm@vger.kernel.org, mst@redhat.com, david@redhat.com, dave.hansen@intel.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, akpm@linux-foundation.org, virtio-dev@lists.oasis-open.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, mhocko@kernel.org, alexander.h.duyck@linux.intel.com, osalvador@suse.de Date: Wed, 04 Sep 2019 08:11:56 -0700 Message-ID: <20190904151156.14270.25192.stgit@localhost.localdomain> In-Reply-To: <20190904150920.13848.32271.stgit@localhost.localdomain> References: <20190904150920.13848.32271.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 "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 +- 2 files changed, 45 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); + } + 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;