Re: [PATCH hyperv-next v5 09/11] Drivers: hv: vmbus: Introduce hv_get_vmbus_root_device()

Tianyu Lan
2025-03-10T13:42:35Z

On Sat, Mar 8, 2025 at 6:05 AM Roman Kisel <romank@linux.microsoft.com> wrote:
>
> The ARM64 PCI code for hyperv needs to know the VMBus root
> device, and it is private.
>
> Provide a function that returns it. Rename it from "hv_dev"
> as "hv_dev" as a symbol is very overloaded. No functional
> changes.
>
> Signed-off-by: Roman Kisel <romank@linux.microsoft.com>

Why change all device's parent to vmbus_root_device?

The ARM64 platform uses the device tree to enumerate vmbus
devices.. Can we find the root device via device tree? vmbus
code on the x86 use ACPI and it seems to work via ACPI.

> ---
> drivers/hv/vmbus_drv.c | 23 +++++++++++++++--------
> include/linux/hyperv.h | 2 ++
> 2 files changed, 17 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
> index c8474b48dcd2..7bfafe702963 100644
> --- a/drivers/hv/vmbus_drv.c
> +++ b/drivers/hv/vmbus_drv.c
> @@ -45,7 +45,8 @@ struct vmbus_dynid {
> struct hv_vmbus_device_id id;
> };
>
> -static struct device *hv_dev;
> +/* VMBus Root Device */
> +static struct device *vmbus_root_device;
>
> static int hyperv_cpuhp_online;
>
> @@ -80,9 +81,15 @@ static struct resource *fb_mmio;
> static struct resource *hyperv_mmio;
> static DEFINE_MUTEX(hyperv_mmio_lock);
>
> +struct device *hv_get_vmbus_root_device(void)
> +{
> + return vmbus_root_device;
> +}
> +EXPORT_SYMBOL_GPL(hv_get_vmbus_root_device);
> +
> static int vmbus_exists(void)
> {
> - if (hv_dev == NULL)
> + if (vmbus_root_device == NULL)
> return -ENODEV;
>
> return 0;
> @@ -861,7 +868,7 @@ static int vmbus_dma_configure(struct device *child_device)
> * On x86/x64 coherence is assumed and these calls have no effect.
> */
> hv_setup_dma_ops(child_device,
> - device_get_dma_attr(hv_dev) == DEV_DMA_COHERENT);
> + device_get_dma_attr(vmbus_root_device) == DEV_DMA_COHERENT);
> return 0;
> }
>
> @@ -1930,7 +1937,7 @@ int vmbus_device_register(struct hv_device *child_device_obj)
> &child_device_obj->channel->offermsg.offer.if_instance);
>
> child_device_obj->device.bus = &hv_bus;
> - child_device_obj->device.parent = hv_dev;
> + child_device_obj->device.parent = vmbus_root_device;
> child_device_obj->device.release = vmbus_device_release;
>
> child_device_obj->device.dma_parms = &child_device_obj->dma_parms;
> @@ -2292,7 +2299,7 @@ static int vmbus_acpi_add(struct platform_device *pdev)
> struct acpi_device *ancestor;
> struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
>
> - hv_dev = &device->dev;
> + vmbus_root_device = &device->dev;
>
> /*
> * Older versions of Hyper-V for ARM64 fail to include the _CCA
> @@ -2383,7 +2390,7 @@ static int vmbus_device_add(struct platform_device *pdev)
> struct device_node *np = pdev->dev.of_node;
> int ret;
>
> - hv_dev = &pdev->dev;
> + vmbus_root_device = &pdev->dev;
>
> ret = of_range_parser_init(&parser, np);
> if (ret)
> @@ -2702,7 +2709,7 @@ static int __init hv_acpi_init(void)
> if (ret)
> return ret;
>
> - if (!hv_dev) {
> + if (!vmbus_root_device) {
> ret = -ENODEV;
> goto cleanup;
> }
> @@ -2733,7 +2740,7 @@ static int __init hv_acpi_init(void)
>
> cleanup:
> platform_driver_unregister(&vmbus_platform_driver);
> - hv_dev = NULL;
> + vmbus_root_device = NULL;
> return ret;
> }
>
> diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
> index 7f4f8d8bdf43..1f0851fde041 100644
> --- a/include/linux/hyperv.h
> +++ b/include/linux/hyperv.h
> @@ -1333,6 +1333,8 @@ static inline void *hv_get_drvdata(struct hv_device *dev)
> return dev_get_drvdata(&dev->device);
> }
>
> +struct device *hv_get_vmbus_root_device(void);
> +
> struct hv_ring_buffer_debug_info {
> u32 current_interrupt_mask;
> u32 current_read_index;
> --
> 2.43.0
>
>

--
Thanks
Tianyu Lan