[Devel] [PATCH vz7] Create debugfs file with virtio balloon usage information
Konstantin Khorenko
khorenko at virtuozzo.com
Mon Sep 5 17:01:54 MSK 2022
Subject: [PATCH vz7] virtio_balloon: Create debugfs file with the usage information
On 02.09.2022 13:19, Alexander Atanasov wrote:
> Allow the guest to know how much it is ballooned by the host.
> Depending on options the ballooned memory is accounted in two ways.
> If deflate on oom is enabled - ballooned memory is accounted as used.
> If deflate on oom is not enabled - ballooned memory is subtracted
> from total ram.
Allow the guest to know how much memory is ballooned by the Host.
Depending on options the ballooned memory is accounted in two ways:
1. If deflate on OOM is enabled - ballooned memory is accounted as used.
2. If deflate on OOM is not enabled - ballooned memory is subtracted
from total RAM.
> https://jira.sw.ru/browse/PSBM-140407
> Signed-off-by: Alexander Atanasov <alexander.atanasov at virtuozzo.com>
> ---
> drivers/virtio/virtio_balloon.c | 52 +++++++++++++++++++++++++++++++++
> 1 file changed, 52 insertions(+)
>
> diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
> index 142719d05dc5..e8cefeea4f22 100644
> --- a/drivers/virtio/virtio_balloon.c
> +++ b/drivers/virtio/virtio_balloon.c
> @@ -23,6 +23,7 @@
> #include <linux/virtio_balloon.h>
> #include <linux/swap.h>
> #include <linux/workqueue.h>
> +#include <linux/debugfs.h>
> #include <linux/delay.h>
> #include <linux/slab.h>
> #include <linux/module.h>
> @@ -447,6 +448,54 @@ static int init_vqs(struct virtio_balloon *vb)
> return 0;
> }
>
> +/*
> + * DEBUGFS Interface
> + */
> +#ifdef CONFIG_DEBUG_FS
> +
> +static int virtio_balloon_debug_show(struct seq_file *f, void *offset)
> +{
> + struct virtio_balloon *vb = f->private;
> + u64 inflated_kb = vb->num_pages << (VIRTIO_BALLOON_PFN_SHIFT - 10);
/*
* Balloon device works in 4K page units. So each page is pointed to by
* multiple balloon pages. All memory counters in this driver are in balloon
* page units.
*/
#define VIRTIO_BALLOON_PAGES_PER_PAGE (unsigned)(PAGE_SIZE >> VIRTIO_BALLOON_PFN_SHIFT)
/* Size of a PFN in the balloon interface. */
#define VIRTIO_BALLOON_PFN_SHIFT 12
Taking into account defines above, i think the proper code should be:
/* "+2" here because we want the value in kilobytes */
u64 inflated_kb = vb->num_pages << (PAGE_SHIFT - VIRTIO_BALLOON_PFN_SHIFT + 2);
As it's said VIRTIO_BALLOON_PAGE cannot be larger than PAGE_SIZE,
so if we imagine VIRTIO_BALLOON_PFN_SHIFT is defined to, say, 10, the original code
"<< (VIRTIO_BALLOON_PFN_SHIFT - 10)" will definitely work wrong.
===========================
Another question: why we report "num_pages", but not "actual"?
struct virtio_balloon_config {
/* Number of pages host wants Guest to give up. */
__u32 num_pages;
/* Number of pages we've actually got in balloon. */
__u32 actual;
};
If we have a VM with, say, 4GB RAM and balloon is configured to grab, say, 4GB, we need to know the
memory _actually_ grabbed by balloon i think.
Or may be to report both "num_pages" and "actual"?
> + u64 inflated_total = 0;
> + u64 inflated_free = 0;
> +
> + if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_DEFLATE_ON_OOM))
> + inflated_free = inflated_kb;
> + else
> + inflated_total = inflated_kb;
> +
> + seq_printf(f, "InflatedTotal: %lld kB\n", inflated_total);
> + seq_printf(f, "InflatedFree: %lld kB\n", inflated_free);
Are those namings are stoned already?
May be to rename them to "DeflatedTotal" and "InflatedUsed" ?
s/kB/KB/
> +
> + return 0;
> +}
> +
> +DEFINE_SHOW_ATTRIBUTE(virtio_balloon_debug);
> +
> +static void virtio_balloon_debugfs_init(struct virtio_balloon *b)
> +{
> + debugfs_create_file("virtio-balloon", 0444, NULL, b,
> + &virtio_balloon_debug_fops);
> +}
> +
> +static void virtio_balloon_debugfs_exit(struct virtio_balloon *b)
> +{
> + debugfs_remove(debugfs_lookup("virtio-balloon", NULL));
> +}
> +
> +#else
> +
> +static inline void virtio_balloon_debugfs_init(struct virtio_balloon *b)
> +{
> +}
> +
> +static inline void virtio_balloon_debugfs_exit(struct virtio_balloon *b)
> +{
> +}
> +
> +#endif /* CONFIG_DEBUG_FS */
> +
> #ifdef CONFIG_BALLOON_COMPACTION
> /*
> * virtballoon_migratepage - perform the balloon page migration on behalf of
> @@ -568,6 +617,8 @@ static int virtballoon_probe(struct virtio_device *vdev)
>
> if (towards_target(vb))
> virtballoon_changed(vdev);
> + virtio_balloon_debugfs_init(vb);
> +
> return 0;
>
> out_oom_notify:
> @@ -595,6 +646,7 @@ static void virtballoon_remove(struct virtio_device *vdev)
> {
> struct virtio_balloon *vb = vdev->priv;
>
> + virtio_balloon_debugfs_exit(vb);
> unregister_oom_notifier(&vb->nb);
>
> spin_lock_irq(&vb->stop_update_lock);
More information about the Devel
mailing list