drivers/hv/vmbus_drv.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
Initialize the device's dma_{mask,parms} pointers before invoking
device_register(). Address the following trace with 5.17-rc7:
[ 49.646839] WARNING: CPU: 0 PID: 189 at include/linux/dma-mapping.h:543
netvsc_probe+0x37a/0x3a0 [hv_netvsc]
[ 49.646928] Call Trace:
[ 49.646930] <TASK>
[ 49.646935] vmbus_probe+0x40/0x60 [hv_vmbus]
[ 49.646942] really_probe+0x1ce/0x3b0
[ 49.646948] __driver_probe_device+0x109/0x180
[ 49.646952] driver_probe_device+0x23/0xa0
[ 49.646955] __device_attach_driver+0x76/0xe0
[ 49.646958] ? driver_allows_async_probing+0x50/0x50
[ 49.646961] bus_for_each_drv+0x84/0xd0
[ 49.646964] __device_attach+0xed/0x170
[ 49.646967] device_initial_probe+0x13/0x20
[ 49.646970] bus_probe_device+0x8f/0xa0
[ 49.646973] device_add+0x41a/0x8e0
[ 49.646975] ? hrtimer_init+0x28/0x80
[ 49.646981] device_register+0x1b/0x20
[ 49.646983] vmbus_device_register+0x5e/0xf0 [hv_vmbus]
[ 49.646991] vmbus_add_channel_work+0x12d/0x190 [hv_vmbus]
[ 49.646999] process_one_work+0x21d/0x3f0
[ 49.647002] worker_thread+0x4a/0x3b0
[ 49.647005] ? process_one_work+0x3f0/0x3f0
[ 49.647007] kthread+0xff/0x130
[ 49.647011] ? kthread_complete_and_exit+0x20/0x20
[ 49.647015] ret_from_fork+0x22/0x30
[ 49.647020] </TASK>
[ 49.647021] ---[ end trace 0000000000000000 ]---
Fixes: 743b237c3a7b0 ("scsi: storvsc: Add Isolation VM support for storvsc driver")
Signed-off-by: Andrea Parri (Microsoft) <parri.andrea@gmail.com>
---
drivers/hv/vmbus_drv.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index 12a2b37e87f30..65db5048b1763 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -2097,6 +2097,9 @@ int vmbus_device_register(struct hv_device *child_device_obj)
child_device_obj->device.parent = &hv_acpi_dev->dev;
child_device_obj->device.release = vmbus_device_release;
+ child_device_obj->device.dma_parms = &child_device_obj->dma_parms;
+ child_device_obj->device.dma_mask = &child_device_obj->dma_mask;
+
/*
* Register with the LDM. This will kick off the driver/device
* binding...which will eventually call vmbus_match() and vmbus_probe()
@@ -2122,8 +2125,6 @@ int vmbus_device_register(struct hv_device *child_device_obj)
}
hv_debug_add_dev_dir(child_device_obj);
- child_device_obj->device.dma_parms = &child_device_obj->dma_parms;
- child_device_obj->device.dma_mask = &child_device_obj->dma_mask;
dma_set_mask(&child_device_obj->device, DMA_BIT_MASK(64));
return 0;
--
2.25.1
From: Andrea Parri (Microsoft) <parri.andrea@gmail.com> Sent: Friday, March 11, 2022 5:38 AM
>
> Initialize the device's dma_{mask,parms} pointers before invoking
> device_register(). Address the following trace with 5.17-rc7:
>
> [ 49.646839] WARNING: CPU: 0 PID: 189 at include/linux/dma-mapping.h:543
> netvsc_probe+0x37a/0x3a0 [hv_netvsc]
> [ 49.646928] Call Trace:
> [ 49.646930] <TASK>
> [ 49.646935] vmbus_probe+0x40/0x60 [hv_vmbus]
> [ 49.646942] really_probe+0x1ce/0x3b0
> [ 49.646948] __driver_probe_device+0x109/0x180
> [ 49.646952] driver_probe_device+0x23/0xa0
> [ 49.646955] __device_attach_driver+0x76/0xe0
> [ 49.646958] ? driver_allows_async_probing+0x50/0x50
> [ 49.646961] bus_for_each_drv+0x84/0xd0
> [ 49.646964] __device_attach+0xed/0x170
> [ 49.646967] device_initial_probe+0x13/0x20
> [ 49.646970] bus_probe_device+0x8f/0xa0
> [ 49.646973] device_add+0x41a/0x8e0
> [ 49.646975] ? hrtimer_init+0x28/0x80
> [ 49.646981] device_register+0x1b/0x20
> [ 49.646983] vmbus_device_register+0x5e/0xf0 [hv_vmbus]
> [ 49.646991] vmbus_add_channel_work+0x12d/0x190 [hv_vmbus]
> [ 49.646999] process_one_work+0x21d/0x3f0
> [ 49.647002] worker_thread+0x4a/0x3b0
> [ 49.647005] ? process_one_work+0x3f0/0x3f0
> [ 49.647007] kthread+0xff/0x130
> [ 49.647011] ? kthread_complete_and_exit+0x20/0x20
> [ 49.647015] ret_from_fork+0x22/0x30
> [ 49.647020] </TASK>
> [ 49.647021] ---[ end trace 0000000000000000 ]---
>
> Fixes: 743b237c3a7b0 ("scsi: storvsc: Add Isolation VM support for storvsc driver")
> Signed-off-by: Andrea Parri (Microsoft) <parri.andrea@gmail.com>
> ---
> drivers/hv/vmbus_drv.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
> index 12a2b37e87f30..65db5048b1763 100644
> --- a/drivers/hv/vmbus_drv.c
> +++ b/drivers/hv/vmbus_drv.c
> @@ -2097,6 +2097,9 @@ int vmbus_device_register(struct hv_device
> *child_device_obj)
> child_device_obj->device.parent = &hv_acpi_dev->dev;
> child_device_obj->device.release = vmbus_device_release;
>
> + child_device_obj->device.dma_parms = &child_device_obj->dma_parms;
> + child_device_obj->device.dma_mask = &child_device_obj->dma_mask;
> +
> /*
> * Register with the LDM. This will kick off the driver/device
> * binding...which will eventually call vmbus_match() and vmbus_probe()
> @@ -2122,8 +2125,6 @@ int vmbus_device_register(struct hv_device
> *child_device_obj)
> }
> hv_debug_add_dev_dir(child_device_obj);
>
> - child_device_obj->device.dma_parms = &child_device_obj->dma_parms;
> - child_device_obj->device.dma_mask = &child_device_obj->dma_mask;
> dma_set_mask(&child_device_obj->device, DMA_BIT_MASK(64));
Is there any reason to not move dma_set_mask() as well? That call is
closely related to the previous two lines, so it is unexpected to have
them separated.
Michael
> > --- > > drivers/hv/vmbus_drv.c | 5 +++-- > > 1 file changed, 3 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c > > index 12a2b37e87f30..65db5048b1763 100644 > > --- a/drivers/hv/vmbus_drv.c > > +++ b/drivers/hv/vmbus_drv.c > > @@ -2097,6 +2097,9 @@ int vmbus_device_register(struct hv_device > > *child_device_obj) > > child_device_obj->device.parent = &hv_acpi_dev->dev; > > child_device_obj->device.release = vmbus_device_release; > > > > + child_device_obj->device.dma_parms = &child_device_obj->dma_parms; > > + child_device_obj->device.dma_mask = &child_device_obj->dma_mask; > > + > > /* > > * Register with the LDM. This will kick off the driver/device > > * binding...which will eventually call vmbus_match() and vmbus_probe() > > @@ -2122,8 +2125,6 @@ int vmbus_device_register(struct hv_device > > *child_device_obj) > > } > > hv_debug_add_dev_dir(child_device_obj); > > > > - child_device_obj->device.dma_parms = &child_device_obj->dma_parms; > > - child_device_obj->device.dma_mask = &child_device_obj->dma_mask; > > dma_set_mask(&child_device_obj->device, DMA_BIT_MASK(64)); > > Is there any reason to not move dma_set_mask() as well? That call is > closely related to the previous two lines, so it is unexpected to have > them separated. The only reason was "minimize diff"; sounds like I'll move it in v2. ;-) Thanks, Andrea
© 2016 - 2026 Red Hat, Inc.