From: "Michael S. Tsirkin" <mst@redhat.com>
To: Alexander Duyck <alexander.duyck@gmail.com>
Cc: kvm@vger.kernel.org, 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, yang.zhang.wz@gmail.com, nitesh@redhat.com,
konrad.wilk@oracle.com, david@redhat.com, pagupta@redhat.com,
riel@surriel.com, lcapitulino@redhat.com, dave.hansen@intel.com,
wei.w.wang@intel.com, aarcange@redhat.com, pbonzini@redhat.com,
dan.j.williams@intel.com, alexander.h.duyck@linux.intel.com,
osalvador@suse.de
Subject: Re: [PATCH v15 6/7] virtio-balloon: Add support for providing free page reports to host
Date: Fri, 13 Dec 2019 02:08:19 -0500 [thread overview]
Message-ID: <20191213020553-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20191205162255.19548.63866.stgit@localhost.localdomain>
On Thu, Dec 05, 2019 at 08:22:55AM -0800, Alexander Duyck wrote:
> From: Alexander Duyck <alexander.h.duyck@linux.intel.com>
>
> Add support for the page reporting feature provided by virtio-balloon.
> Reporting differs from the regular balloon functionality in that is is
> much less durable than a standard memory balloon. Instead of creating a
> list of pages that cannot be accessed the pages are only inaccessible
> while they are being indicated to the virtio interface. Once the
> interface has acknowledged them they are placed back into their respective
> free lists and are once again accessible by the guest system.
>
> Unlike a standard balloon we don't inflate and deflate the pages. Instead
> we perform the reporting, and once the reporting is completed it is
> assumed that the page has been dropped from the guest and will be faulted
> back in the next time the page is accessed.
>
> For this reason when I had originally introduced the patch set I referred
> to this behavior as a "bubble" instead of a "balloon" since the duration
> is short lived, and when the page is touched the "bubble" is popped and
> the page is faulted back in.
>
> Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com>
virtio POV is fine here:
Acked-by: Michael S. Tsirkin <mst@redhat.com>
However please copy virtio-comment on UAPI changes.
If possible isolate the last chunk in a patch by itself
to make it easier for non-kernel developers to review.
> ---
> drivers/virtio/Kconfig | 1 +
> drivers/virtio/virtio_balloon.c | 64 +++++++++++++++++++++++++++++++++++
> include/uapi/linux/virtio_balloon.h | 1 +
> 3 files changed, 66 insertions(+)
>
> diff --git a/drivers/virtio/Kconfig b/drivers/virtio/Kconfig
> index 078615cf2afc..4b2dd8259ff5 100644
> --- a/drivers/virtio/Kconfig
> +++ b/drivers/virtio/Kconfig
> @@ -58,6 +58,7 @@ config VIRTIO_BALLOON
> tristate "Virtio balloon driver"
> depends on VIRTIO
> select MEMORY_BALLOON
> + select PAGE_REPORTING
> ---help---
> This driver supports increasing and decreasing the amount
> of memory within a KVM guest.
> diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
> index 252591bc7e01..ecd54edba968 100644
> --- a/drivers/virtio/virtio_balloon.c
> +++ b/drivers/virtio/virtio_balloon.c
> @@ -19,6 +19,7 @@
> #include <linux/mount.h>
> #include <linux/magic.h>
> #include <linux/pseudo_fs.h>
> +#include <linux/page_reporting.h>
>
> /*
> * Balloon device works in 4K page units. So each page is pointed to by
> @@ -47,6 +48,7 @@ enum virtio_balloon_vq {
> VIRTIO_BALLOON_VQ_DEFLATE,
> VIRTIO_BALLOON_VQ_STATS,
> VIRTIO_BALLOON_VQ_FREE_PAGE,
> + VIRTIO_BALLOON_VQ_REPORTING,
> VIRTIO_BALLOON_VQ_MAX
> };
>
> @@ -114,6 +116,10 @@ struct virtio_balloon {
>
> /* To register a shrinker to shrink memory upon memory pressure */
> struct shrinker shrinker;
> +
> + /* Free page reporting device */
> + struct virtqueue *reporting_vq;
> + struct page_reporting_dev_info pr_dev_info;
> };
>
> static struct virtio_device_id id_table[] = {
> @@ -153,6 +159,33 @@ static void tell_host(struct virtio_balloon *vb, struct virtqueue *vq)
>
> }
>
> +int virtballoon_free_page_report(struct page_reporting_dev_info *pr_dev_info,
> + struct scatterlist *sg, unsigned int nents)
> +{
> + struct virtio_balloon *vb =
> + container_of(pr_dev_info, struct virtio_balloon, pr_dev_info);
> + struct virtqueue *vq = vb->reporting_vq;
> + unsigned int unused, err;
> +
> + /* We should always be able to add these buffers to an empty queue. */
> + err = virtqueue_add_inbuf(vq, sg, nents, vb, GFP_NOWAIT | __GFP_NOWARN);
> +
> + /*
> + * In the extremely unlikely case that something has occurred and we
> + * are able to trigger an error we will simply display a warning
> + * and exit without actually processing the pages.
> + */
> + if (WARN_ON_ONCE(err))
> + return err;
> +
> + virtqueue_kick(vq);
> +
> + /* When host has read buffer, this completes via balloon_ack */
> + wait_event(vb->acked, virtqueue_get_buf(vq, &unused));
> +
> + return 0;
> +}
> +
> static void set_page_pfns(struct virtio_balloon *vb,
> __virtio32 pfns[], struct page *page)
> {
> @@ -477,6 +510,7 @@ static int init_vqs(struct virtio_balloon *vb)
> names[VIRTIO_BALLOON_VQ_DEFLATE] = "deflate";
> names[VIRTIO_BALLOON_VQ_STATS] = NULL;
> names[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL;
> + names[VIRTIO_BALLOON_VQ_REPORTING] = NULL;
>
> if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_STATS_VQ)) {
> names[VIRTIO_BALLOON_VQ_STATS] = "stats";
> @@ -488,6 +522,11 @@ static int init_vqs(struct virtio_balloon *vb)
> callbacks[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL;
> }
>
> + if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_REPORTING)) {
> + names[VIRTIO_BALLOON_VQ_REPORTING] = "reporting_vq";
> + callbacks[VIRTIO_BALLOON_VQ_REPORTING] = balloon_ack;
> + }
> +
> err = vb->vdev->config->find_vqs(vb->vdev, VIRTIO_BALLOON_VQ_MAX,
> vqs, callbacks, names, NULL, NULL);
> if (err)
> @@ -520,6 +559,9 @@ static int init_vqs(struct virtio_balloon *vb)
> if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT))
> vb->free_page_vq = vqs[VIRTIO_BALLOON_VQ_FREE_PAGE];
>
> + if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_REPORTING))
> + vb->reporting_vq = vqs[VIRTIO_BALLOON_VQ_REPORTING];
> +
> return 0;
> }
>
> @@ -939,12 +981,31 @@ static int virtballoon_probe(struct virtio_device *vdev)
> if (err)
> goto out_del_balloon_wq;
> }
> +
> + vb->pr_dev_info.report = virtballoon_free_page_report;
> + if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_REPORTING)) {
> + unsigned int capacity;
> +
> + capacity = virtqueue_get_vring_size(vb->reporting_vq);
> + if (capacity < PAGE_REPORTING_CAPACITY) {
> + err = -ENOSPC;
> + goto out_unregister_shrinker;
> + }
> +
> + err = page_reporting_register(&vb->pr_dev_info);
> + if (err)
> + goto out_unregister_shrinker;
> + }
> +
> virtio_device_ready(vdev);
>
> if (towards_target(vb))
> virtballoon_changed(vdev);
> return 0;
>
> +out_unregister_shrinker:
> + if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_DEFLATE_ON_OOM))
> + virtio_balloon_unregister_shrinker(vb);
> out_del_balloon_wq:
> if (virtio_has_feature(vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT))
> destroy_workqueue(vb->balloon_wq);
> @@ -973,6 +1034,8 @@ static void virtballoon_remove(struct virtio_device *vdev)
> {
> struct virtio_balloon *vb = vdev->priv;
>
> + if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_REPORTING))
> + page_reporting_unregister(&vb->pr_dev_info);
> if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_DEFLATE_ON_OOM))
> virtio_balloon_unregister_shrinker(vb);
> spin_lock_irq(&vb->stop_update_lock);
> @@ -1045,6 +1108,7 @@ static int virtballoon_validate(struct virtio_device *vdev)
> VIRTIO_BALLOON_F_DEFLATE_ON_OOM,
> VIRTIO_BALLOON_F_FREE_PAGE_HINT,
> VIRTIO_BALLOON_F_PAGE_POISON,
> + VIRTIO_BALLOON_F_REPORTING,
> };
>
> static struct virtio_driver virtio_balloon_driver = {
> diff --git a/include/uapi/linux/virtio_balloon.h b/include/uapi/linux/virtio_balloon.h
> index a1966cd7b677..19974392d324 100644
> --- a/include/uapi/linux/virtio_balloon.h
> +++ b/include/uapi/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 */
>
> /* Size of a PFN in the balloon interface. */
> #define VIRTIO_BALLOON_PFN_SHIFT 12
next prev parent reply other threads:[~2019-12-13 7:08 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-05 16:22 [PATCH v15 0/7] mm / virtio: Provide support for free page reporting Alexander Duyck
2019-12-05 16:22 ` [PATCH v15 1/7] mm: Adjust shuffle code to allow for future coalescing Alexander Duyck
2019-12-05 16:22 ` [PATCH v15 2/7] mm: Use zone and order instead of free area in free_list manipulators Alexander Duyck
2019-12-05 16:22 ` [PATCH v15 3/7] mm: Add function __putback_isolated_page Alexander Duyck
2019-12-16 11:36 ` David Hildenbrand
2019-12-16 16:22 ` Alexander Duyck
2019-12-17 10:58 ` David Hildenbrand
2019-12-17 16:26 ` Alexander Duyck
2019-12-17 17:24 ` David Hildenbrand
2019-12-17 18:24 ` Alexander Duyck
2019-12-17 18:46 ` David Hildenbrand
2019-12-17 21:50 ` Alexander Duyck
2019-12-05 16:22 ` [PATCH v15 4/7] mm: Introduce Reported pages Alexander Duyck
2019-12-16 10:17 ` Nitesh Narayan Lal
2019-12-16 16:28 ` Alexander Duyck
2019-12-17 8:55 ` Nitesh Narayan Lal
2019-12-17 16:31 ` Alexander Duyck
2019-12-18 7:31 ` Mel Gorman
2019-12-16 11:44 ` Nitesh Narayan Lal
2019-12-16 16:10 ` Alexander Duyck
2019-12-05 16:22 ` [PATCH v15 5/7] virtio-balloon: Pull page poisoning config out of free page hinting Alexander Duyck
2019-12-13 7:03 ` Michael S. Tsirkin
2019-12-05 16:22 ` [PATCH v15 6/7] virtio-balloon: Add support for providing free page reports to host Alexander Duyck
2019-12-13 7:08 ` Michael S. Tsirkin [this message]
2019-12-13 16:35 ` Alexander Duyck
2019-12-15 9:29 ` Michael S. Tsirkin
2019-12-13 10:15 ` David Hildenbrand
2019-12-13 16:37 ` Alexander Duyck
2019-12-05 16:23 ` [PATCH v15 7/7] mm: Add free page reporting documentation Alexander Duyck
2019-12-05 16:24 ` [virtio-dev] [PATCH v15 QEMU 1/3] virtio-ballon: Implement support for page poison tracking feature Alexander Duyck
2019-12-05 16:24 ` Alexander Duyck
2019-12-05 16:24 ` [virtio-dev] [PATCH v15 QEMU 2/3] virtio-balloon: Add bit to notify guest of unused page reporting Alexander Duyck
2019-12-05 16:24 ` Alexander Duyck
2019-12-05 16:24 ` [virtio-dev] [PATCH v15 QEMU 3/3] virtio-balloon: Provide a interface for " Alexander Duyck
2019-12-05 16:24 ` Alexander Duyck
2019-12-05 16:26 ` [virtio-dev] [PATCH v15 QEMU 4/3 RFC] memory: Add support for MADV_FREE as mechanism to lazy discard pages Alexander Duyck
2019-12-05 16:26 ` Alexander Duyck
2019-12-12 23:47 ` [PATCH v15 0/7] mm / virtio: Provide support for free page reporting Alexander Duyck
2019-12-13 10:00 ` David Hildenbrand
2019-12-13 11:08 ` Mel Gorman
2019-12-13 16:59 ` Alexander Duyck
2019-12-13 16:46 ` Alexander Duyck
2019-12-16 12:21 ` David Hildenbrand
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=20191213020553-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=alexander.duyck@gmail.com \
--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=nitesh@redhat.com \
--cc=osalvador@suse.de \
--cc=pagupta@redhat.com \
--cc=pbonzini@redhat.com \
--cc=riel@surriel.com \
--cc=vbabka@suse.cz \
--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: link
Be 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.