[Devel] [PATCH RHEL7 COMMIT] virtio_balloon: Create debugfs file with the usage information

Konstantin Khorenko khorenko at virtuozzo.com
Fri Sep 23 21:27:23 MSK 2022


The commit is pushed to "branch-rh7-3.10.0-1160.76.1.vz7.189.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-1160.76.1.vz7.189.2
------>
commit fe5aabf2ea527ef9e43926db8a3da95ff52a542b
Author: Alexander Atanasov <alexander.atanasov at virtuozzo.com>
Date:   Fri Sep 2 14:19:42 2022 +0300

    virtio_balloon: Create debugfs file with the usage information
    
    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>
    
    khorenko@: a related topic: how to check the balloon features from inside Guest?
    
     1. Check if the "virtio_balloon" module is loaded
     2. Find the virtio device which driver point to "virtio_balloon"
        /sys/devices/pci0000:00/0000:00:07.0/virtio3/driver ->
            ../../../../bus/virtio/drivers/virtio_balloon/
     3. Check the content of its "features" file:
    
    Examples:
    
      Without deflate on OOM:
      # cat /sys/devices/pci0000:00/0000:00:03.0/virtio0/features
      0100000000000000000000000000110010000000000000000000000000000000
    
      With deflate on OOM:
      # cat /sys/devices/pci0000:00/0000:00:03.0/virtio0/features
      0110000000000000000000000000110010000000000000000000000000000000
    
    To decipher balloon bits are defined in include/uapi/linux/virtio_balloon.h
---
 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 142719d05dc51..e8cefeea4f222 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);
+	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);
+
+	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