[Devel] [PATCH vz7] Create debugfs file with virtio balloon usage information
Konstantin Khorenko
khorenko at virtuozzo.com
Thu Sep 22 20:45:19 MSK 2022
On 05.09.2022 16:01, Konstantin Khorenko wrote:
> 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.
And please, address this comment as well.
> ===========================
>
> 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);
> _______________________________________________
> Devel mailing list
> Devel at openvz.org
> https://lists.openvz.org/mailman/listinfo/devel
> .
More information about the Devel
mailing list