From: Dongli Zhang <[email protected]> Sent: Wednesday, December 10, 2025
11:10 AM
>
> Hi David,
>
> On 12/10/25 12:09 AM, David Hildenbrand (Red Hat) wrote:
> > On 12/9/25 22:23, Dongli Zhang wrote:
> >> Do not set vb->pr_dev_info.report unconditionally if
> >> VIRTIO_BALLOON_F_REPORTING is not available.
> >
> > Can you share with us why you think that should be done? Please document the
> > "why" and not only the "what".
> >
> > Without VIRTIO_BALLOON_F_REPORTING, we'll never call
> > page_reporting_register(),
> > so it will never be used.
> >
> > But the compiler cannot optimize it out. It only happens during driver
> > loading,
> > so I am not sure it is worth the churn?
>
> When I was reading about the free-page reporting feature in virtio-balloon, I
> was confused as to why pr_dev_info.report was always configured
> unconditionally.
>
> Later, I looked at the implementation in the Hyper-V balloon driver and
> noticed
> that it even resets pr_dev_info.report back to NULL if
> page_reporting_register()
> fails (see line 1669).
The Hyper-V balloon driver does this because it uses the NULL in
pr_dev_info.report
to indicate if page_reporting_unregister() should be called when the driver
exits.
See disable_page_reporting(). Unlike the virtio balloon driver, the Hyper-V
balloon_probe() function succeeds even if page_reporting_register() fails, so
some indicator is needed on exit. I didn't look super carefully, but it
appears the
virtio balloon driver doesn't need such an indicator.
That said, I don't have opinion on the tradeoffs of this proposed change.
Michael
>
> 1651 static void enable_page_reporting(void)
> 1652 {
> 1653 int ret;
> 1654
> 1655 if
> (!hv_query_ext_cap(HV_EXT_CAPABILITY_MEMORY_COLD_DISCARD_HINT)) {
> 1656 pr_debug("Cold memory discard hint not supported by
> Hyper-V\n");
> 1657 return;
> 1658 }
> 1659
> 1660 BUILD_BUG_ON(PAGE_REPORTING_CAPACITY >
> HV_MEMORY_HINT_MAX_GPA_PAGE_RANGES);
> 1661 dm_device.pr_dev_info.report = hv_free_page_report;
> 1662 /*
> 1663 * We let the page_reporting_order parameter decide the order
> 1664 * in the page_reporting code
> 1665 */
> 1666 dm_device.pr_dev_info.order = 0;
> 1667 ret = page_reporting_register(&dm_device.pr_dev_info);
> 1668 if (ret < 0) {
> 1669 dm_device.pr_dev_info.report = NULL;
> 1670 pr_err("Failed to enable cold memory discard: %d\n",
> ret);
> 1671 } else {
> 1672 pr_info("Cold memory discard hint enabled with order
> %d\n",
> 1673 page_reporting_order);
> 1674 }
> 1675 }
>
> That's why I'd like to move the configuration of pr_dev_info.report inside the
> if statement.
>
> It's a purely non-functional change, intended only to make the initialization
> look cleaner.
>
> Apologies - I should have mentioned that this is a non-functional change in
> the
> commit message.
>
> Thank you very much!
>
> Dongli Zhang
>
>
>
> >
> >>
> >> Signed-off-by: Dongli Zhang <[email protected]>
> >> ---
> >> drivers/virtio/virtio_balloon.c | 3 ++-
> >> 1 file changed, 2 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/drivers/virtio/virtio_balloon.c
> >> b/drivers/virtio/virtio_balloon.c
> >> index 74fe59f5a78c..0c39f2415324 100644
> >> --- a/drivers/virtio/virtio_balloon.c
> >> +++ b/drivers/virtio/virtio_balloon.c
> >> @@ -1034,7 +1034,6 @@ static int virtballoon_probe(struct virtio_device
> >> *vdev)
> >> poison_val, &poison_val);
> >> }
> >> - vb->pr_dev_info.report = virtballoon_free_page_report;
> >> if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_REPORTING)) {
> >> unsigned int capacity;
> >> @@ -1044,6 +1043,8 @@ static int virtballoon_probe(struct virtio_device
> >> *vdev)
> >> goto out_unregister_oom;
> >> }
> >> + vb->pr_dev_info.report = virtballoon_free_page_report;
> >> +
> >> /*
> >> * The default page reporting order is @pageblock_order, which
> >> * corresponds to 512MB in size on ARM64 when 64KB base page
> >
> >
>