From: Alexander Duyck <alexander.duyck@gmail.com> To: virtio-dev@lists.oasis-open.org, kvm@vger.kernel.org, mst@redhat.com, david@redhat.com, dave.hansen@intel.com, linux-kernel@vger.kernel.org, willy@infradead.org, mhocko@kernel.org, linux-mm@kvack.org, akpm@linux-foundation.org, mgorman@techsingularity.net, vbabka@suse.cz, osalvador@suse.de Cc: yang.zhang.wz@gmail.com, pagupta@redhat.com, konrad.wilk@oracle.com, nitesh@redhat.com, riel@surriel.com, 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 Subject: [PATCH v11 QEMU 3/3] virtio-balloon: Provide a interface for unused page reporting Date: Tue, 01 Oct 2019 08:31:17 -0700 [thread overview] Message-ID: <20191001153117.4422.30512.stgit@localhost.localdomain> (raw) In-Reply-To: <20191001152441.27008.99285.stgit@localhost.localdomain> From: Alexander Duyck <alexander.h.duyck@linux.intel.com> 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 <alexander.h.duyck@linux.intel.com> --- 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 6ecfec422309..47f253d016db 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, @@ -932,6 +972,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;
WARNING: multiple messages have this Message-ID (diff)
From: Alexander Duyck <alexander.duyck@gmail.com> To: virtio-dev@lists.oasis-open.org, kvm@vger.kernel.org, mst@redhat.com, david@redhat.com, dave.hansen@intel.com, linux-kernel@vger.kernel.org, willy@infradead.org, mhocko@kernel.org, linux-mm@kvack.org, akpm@linux-foundation.org, mgorman@techsingularity.net, vbabka@suse.cz, osalvador@suse.de Cc: yang.zhang.wz@gmail.com, pagupta@redhat.com, konrad.wilk@oracle.com, nitesh@redhat.com, riel@surriel.com, 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 Subject: [virtio-dev] [PATCH v11 QEMU 3/3] virtio-balloon: Provide a interface for unused page reporting Date: Tue, 01 Oct 2019 08:31:17 -0700 [thread overview] Message-ID: <20191001153117.4422.30512.stgit@localhost.localdomain> (raw) In-Reply-To: <20191001152441.27008.99285.stgit@localhost.localdomain> From: Alexander Duyck <alexander.h.duyck@linux.intel.com> 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 <alexander.h.duyck@linux.intel.com> --- 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 6ecfec422309..47f253d016db 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, @@ -932,6 +972,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; --------------------------------------------------------------------- To unsubscribe, e-mail: virtio-dev-unsubscribe@lists.oasis-open.org For additional commands, e-mail: virtio-dev-help@lists.oasis-open.org
next prev parent reply other threads:[~2019-10-01 15:31 UTC|newest] Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-10-01 15:29 [PATCH v11 0/6] mm / virtio: Provide support for unused page reporting Alexander Duyck 2019-10-01 15:29 ` [virtio-dev] " Alexander Duyck 2019-10-01 15:29 ` [PATCH v11 1/6] mm: Adjust shuffle code to allow for future coalescing Alexander Duyck 2019-10-01 15:29 ` [virtio-dev] " Alexander Duyck 2019-10-01 15:29 ` [PATCH v11 2/6] mm: Use zone and order instead of free area in free_list manipulators Alexander Duyck 2019-10-01 15:29 ` [virtio-dev] " Alexander Duyck 2019-10-15 0:42 ` [mm] 2eca680594: will-it-scale.per_process_ops -2.5% regression kernel test robot 2019-10-15 0:42 ` kernel test robot 2019-10-01 15:29 ` [PATCH v11 3/6] mm: Introduce Reported pages Alexander Duyck 2019-10-01 15:29 ` [virtio-dev] " Alexander Duyck 2019-10-01 15:29 ` [PATCH v11 4/6] mm: Add device side and notifier for unused page reporting Alexander Duyck 2019-10-01 15:29 ` [virtio-dev] " Alexander Duyck 2019-10-01 15:29 ` [PATCH v11 5/6] virtio-balloon: Pull page poisoning config out of free page hinting Alexander Duyck 2019-10-01 15:29 ` [virtio-dev] " Alexander Duyck 2019-10-01 15:29 ` [PATCH v11 6/6] virtio-balloon: Add support for providing unused page reports to host Alexander Duyck 2019-10-01 15:29 ` [virtio-dev] " Alexander Duyck 2019-10-01 15:31 ` [PATCH v11 QEMU 1/3] virtio-ballon: Implement support for page poison tracking feature Alexander Duyck 2019-10-01 15:31 ` [virtio-dev] " Alexander Duyck 2019-10-01 15:31 ` [PATCH v11 QEMU 2/3] virtio-balloon: Add bit to notify guest of unused page reporting Alexander Duyck 2019-10-01 15:31 ` [virtio-dev] " Alexander Duyck 2019-10-01 15:31 ` Alexander Duyck [this message] 2019-10-01 15:31 ` [virtio-dev] [PATCH v11 QEMU 3/3] virtio-balloon: Provide a interface for " Alexander Duyck 2019-10-01 15:35 ` [PATCH v11 0/6] mm / virtio: Provide support " David Hildenbrand 2019-10-01 15:35 ` [virtio-dev] " David Hildenbrand 2019-10-01 16:21 ` Alexander Duyck 2019-10-01 16:21 ` [virtio-dev] " Alexander Duyck 2019-10-01 16:21 ` Alexander Duyck 2019-10-01 18:41 ` David Hildenbrand 2019-10-01 18:41 ` [virtio-dev] " David Hildenbrand 2019-10-01 19:17 ` Nitesh Narayan Lal 2019-10-01 19:17 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-01 19:08 ` Michael S. Tsirkin 2019-10-01 19:08 ` [virtio-dev] " Michael S. Tsirkin 2019-10-01 19:16 ` Nitesh Narayan Lal 2019-10-01 19:16 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-01 20:25 ` Alexander Duyck 2019-10-01 20:25 ` [virtio-dev] " Alexander Duyck 2019-10-01 20:25 ` Alexander Duyck 2019-10-01 20:49 ` Alexander Duyck 2019-10-01 20:49 ` [virtio-dev] " Alexander Duyck 2019-10-01 20:49 ` Alexander Duyck 2019-10-01 20:51 ` Dave Hansen 2019-10-02 15:04 ` Nitesh Narayan Lal 2019-10-02 15:04 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-02 14:41 ` Nitesh Narayan Lal 2019-10-02 14:41 ` Nitesh Narayan Lal 2019-10-02 0:55 ` Alexander Duyck 2019-10-02 0:55 ` [virtio-dev] " Alexander Duyck 2019-10-02 0:55 ` Alexander Duyck 2019-10-02 7:13 ` David Hildenbrand 2019-10-02 7:13 ` [virtio-dev] " David Hildenbrand 2019-10-02 10:44 ` Nitesh Narayan Lal 2019-10-02 10:44 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-02 10:36 ` Nitesh Narayan Lal 2019-10-02 10:36 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-02 14:25 ` Alexander Duyck 2019-10-02 14:25 ` [virtio-dev] " Alexander Duyck 2019-10-02 14:25 ` Alexander Duyck 2019-10-02 14:36 ` Nitesh Narayan Lal 2019-10-02 14:36 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-07 12:29 ` Nitesh Narayan Lal 2019-10-07 12:29 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-07 15:33 ` Alexander Duyck 2019-10-07 15:33 ` [virtio-dev] " Alexander Duyck 2019-10-07 15:33 ` Alexander Duyck 2019-10-07 16:19 ` Nitesh Narayan Lal 2019-10-07 16:19 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-07 16:27 ` Alexander Duyck 2019-10-07 16:27 ` [virtio-dev] " Alexander Duyck 2019-10-07 16:27 ` Alexander Duyck 2019-10-07 17:06 ` Nitesh Narayan Lal 2019-10-07 17:06 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-07 17:20 ` Alexander Duyck 2019-10-07 17:20 ` [virtio-dev] " Alexander Duyck 2019-10-07 17:20 ` Alexander Duyck 2019-10-09 16:25 ` Nitesh Narayan Lal 2019-10-09 16:25 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-09 16:25 ` Nitesh Narayan Lal 2019-10-09 16:50 ` Alexander Duyck 2019-10-09 16:50 ` [virtio-dev] " Alexander Duyck 2019-10-09 16:50 ` Alexander Duyck 2019-10-09 17:08 ` Nitesh Narayan Lal 2019-10-09 17:08 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-09 17:26 ` Alexander Duyck 2019-10-09 17:26 ` [virtio-dev] " Alexander Duyck 2019-10-09 17:26 ` Alexander Duyck 2019-10-09 15:21 ` Nitesh Narayan Lal 2019-10-09 15:21 ` [virtio-dev] " Nitesh Narayan Lal 2019-10-09 16:35 ` Alexander Duyck 2019-10-09 16:35 ` Alexander Duyck 2019-10-09 16:35 ` Alexander Duyck 2019-10-09 19:46 ` Nitesh Narayan Lal 2019-10-10 7:36 ` David Hildenbrand 2019-10-10 10:27 ` Nitesh Narayan Lal
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20191001153117.4422.30512.stgit@localhost.localdomain \ --to=alexander.duyck@gmail.com \ --cc=aarcange@redhat.com \ --cc=akpm@linux-foundation.org \ --cc=alexander.h.duyck@linux.intel.com \ --cc=dan.j.williams@intel.com \ --cc=dave.hansen@intel.com \ --cc=david@redhat.com \ --cc=konrad.wilk@oracle.com \ --cc=kvm@vger.kernel.org \ --cc=lcapitulino@redhat.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=mgorman@techsingularity.net \ --cc=mhocko@kernel.org \ --cc=mst@redhat.com \ --cc=nitesh@redhat.com \ --cc=osalvador@suse.de \ --cc=pagupta@redhat.com \ --cc=pbonzini@redhat.com \ --cc=riel@surriel.com \ --cc=vbabka@suse.cz \ --cc=virtio-dev@lists.oasis-open.org \ --cc=wei.w.wang@intel.com \ --cc=willy@infradead.org \ --cc=yang.zhang.wz@gmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.