diff mbox series

[RESEND,v3] bus: fsl-mc: don't assume child devices are all fsl-mc devices

Message ID 20230613160718.29500-1-laurentiu.tudor@nxp.com (mailing list archive)
State New, archived
Headers show
Series [RESEND,v3] bus: fsl-mc: don't assume child devices are all fsl-mc devices | expand

Commit Message

Laurentiu Tudor June 13, 2023, 4:07 p.m. UTC
From: Laurentiu Tudor <laurentiu.tudor@nxp.com>

Changes in VFIO caused a pseudo-device to be created as child of
fsl-mc devices causing a crash [1] when trying to bind a fsl-mc
device to VFIO. Fix this by checking the device type when enumerating
fsl-mc child devices.

[1]
Modules linked in:
Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP
CPU: 6 PID: 1289 Comm: sh Not tainted 6.2.0-rc5-00047-g7c46948a6e9c #2
Hardware name: NXP Layerscape LX2160ARDB (DT)
pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : mc_send_command+0x24/0x1f0
lr : dprc_get_obj_region+0xfc/0x1c0
sp : ffff80000a88b900
x29: ffff80000a88b900 x28: ffff48a9429e1400 x27: 00000000000002b2
x26: ffff48a9429e1718 x25: 0000000000000000 x24: 0000000000000000
x23: ffffd59331ba3918 x22: ffffd59331ba3000 x21: 0000000000000000
x20: ffff80000a88b9b8 x19: 0000000000000000 x18: 0000000000000001
x17: 7270642f636d2d6c x16: 73662e3030303030 x15: ffffffffffffffff
x14: ffffd59330f1d668 x13: ffff48a8727dc389 x12: ffff48a8727dc386
x11: 0000000000000002 x10: 00008ceaf02f35d4 x9 : 0000000000000012
x8 : 0000000000000000 x7 : 0000000000000006 x6 : ffff80000a88bab0
x5 : 0000000000000000 x4 : 0000000000000000 x3 : ffff80000a88b9e8
x2 : ffff80000a88b9e8 x1 : 0000000000000000 x0 : ffff48a945142b80
Call trace:
 mc_send_command+0x24/0x1f0
 dprc_get_obj_region+0xfc/0x1c0
 fsl_mc_device_add+0x340/0x590
 fsl_mc_obj_device_add+0xd0/0xf8
 dprc_scan_objects+0x1c4/0x340
 dprc_scan_container+0x38/0x60
 vfio_fsl_mc_probe+0x9c/0xf8
 fsl_mc_driver_probe+0x24/0x70
 really_probe+0xbc/0x2a8
 __driver_probe_device+0x78/0xe0
 device_driver_attach+0x30/0x68
 bind_store+0xa8/0x130
 drv_attr_store+0x24/0x38
 sysfs_kf_write+0x44/0x60
 kernfs_fop_write_iter+0x128/0x1b8
 vfs_write+0x334/0x448
 ksys_write+0x68/0xf0
 __arm64_sys_write+0x1c/0x28
 invoke_syscall+0x44/0x108
 el0_svc_common.constprop.1+0x94/0xf8
 do_el0_svc+0x38/0xb0
 el0_svc+0x20/0x50
 el0t_64_sync_handler+0x98/0xc0
 el0t_64_sync+0x174/0x178
Code: aa0103f4 a9025bf5 d5384100 b9400801 (79401260)
---[ end trace 0000000000000000 ]---

Fixes: 3c28a76124b2 ("vfio: Add struct device to vfio_device")
Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com>
---
Hi Greg,

Somehow, this patch was not picked up, so resending. Last seen here:
https://lore.kernel.org/linux-arm-kernel/20230201165923.19369-1-laurentiu.tudor@nxp.com/

For context, small chat we had on it:
https://lore.kernel.org/linux-arm-kernel/20230127131636.20889-1-laurentiu.tudor@nxp.com/

Thanks!

Changes in v3:
 - added changelog

Changes in v2:
 - added "Fixes:" tag

 drivers/bus/fsl-mc/dprc-driver.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Ioana Ciornei June 14, 2023, 2:07 p.m. UTC | #1
On Tue, Jun 13, 2023 at 07:07:18PM +0300, laurentiu.tudor@nxp.com wrote:
> From: Laurentiu Tudor <laurentiu.tudor@nxp.com>
> 
> Changes in VFIO caused a pseudo-device to be created as child of
> fsl-mc devices causing a crash [1] when trying to bind a fsl-mc
> device to VFIO. Fix this by checking the device type when enumerating
> fsl-mc child devices.
> 
> [1]
> Modules linked in:
> Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP
> CPU: 6 PID: 1289 Comm: sh Not tainted 6.2.0-rc5-00047-g7c46948a6e9c #2
> Hardware name: NXP Layerscape LX2160ARDB (DT)
> pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> pc : mc_send_command+0x24/0x1f0
> lr : dprc_get_obj_region+0xfc/0x1c0
> sp : ffff80000a88b900
> x29: ffff80000a88b900 x28: ffff48a9429e1400 x27: 00000000000002b2
> x26: ffff48a9429e1718 x25: 0000000000000000 x24: 0000000000000000
> x23: ffffd59331ba3918 x22: ffffd59331ba3000 x21: 0000000000000000
> x20: ffff80000a88b9b8 x19: 0000000000000000 x18: 0000000000000001
> x17: 7270642f636d2d6c x16: 73662e3030303030 x15: ffffffffffffffff
> x14: ffffd59330f1d668 x13: ffff48a8727dc389 x12: ffff48a8727dc386
> x11: 0000000000000002 x10: 00008ceaf02f35d4 x9 : 0000000000000012
> x8 : 0000000000000000 x7 : 0000000000000006 x6 : ffff80000a88bab0
> x5 : 0000000000000000 x4 : 0000000000000000 x3 : ffff80000a88b9e8
> x2 : ffff80000a88b9e8 x1 : 0000000000000000 x0 : ffff48a945142b80
> Call trace:
>  mc_send_command+0x24/0x1f0
>  dprc_get_obj_region+0xfc/0x1c0
>  fsl_mc_device_add+0x340/0x590
>  fsl_mc_obj_device_add+0xd0/0xf8
>  dprc_scan_objects+0x1c4/0x340
>  dprc_scan_container+0x38/0x60
>  vfio_fsl_mc_probe+0x9c/0xf8
>  fsl_mc_driver_probe+0x24/0x70
>  really_probe+0xbc/0x2a8
>  __driver_probe_device+0x78/0xe0
>  device_driver_attach+0x30/0x68
>  bind_store+0xa8/0x130
>  drv_attr_store+0x24/0x38
>  sysfs_kf_write+0x44/0x60
>  kernfs_fop_write_iter+0x128/0x1b8
>  vfs_write+0x334/0x448
>  ksys_write+0x68/0xf0
>  __arm64_sys_write+0x1c/0x28
>  invoke_syscall+0x44/0x108
>  el0_svc_common.constprop.1+0x94/0xf8
>  do_el0_svc+0x38/0xb0
>  el0_svc+0x20/0x50
>  el0t_64_sync_handler+0x98/0xc0
>  el0t_64_sync+0x174/0x178
> Code: aa0103f4 a9025bf5 d5384100 b9400801 (79401260)
> ---[ end trace 0000000000000000 ]---
> 
> Fixes: 3c28a76124b2 ("vfio: Add struct device to vfio_device")
> Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com>

Tested-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
diff mbox series

Patch

diff --git a/drivers/bus/fsl-mc/dprc-driver.c b/drivers/bus/fsl-mc/dprc-driver.c
index 4c84be378bf2..ec5f26a45641 100644
--- a/drivers/bus/fsl-mc/dprc-driver.c
+++ b/drivers/bus/fsl-mc/dprc-driver.c
@@ -45,6 +45,9 @@  static int __fsl_mc_device_remove_if_not_in_mc(struct device *dev, void *data)
 	struct fsl_mc_child_objs *objs;
 	struct fsl_mc_device *mc_dev;
 
+	if (!dev_is_fsl_mc(dev))
+		return 0;
+
 	mc_dev = to_fsl_mc_device(dev);
 	objs = data;
 
@@ -64,6 +67,9 @@  static int __fsl_mc_device_remove_if_not_in_mc(struct device *dev, void *data)
 
 static int __fsl_mc_device_remove(struct device *dev, void *data)
 {
+	if (!dev_is_fsl_mc(dev))
+		return 0;
+
 	fsl_mc_device_remove(to_fsl_mc_device(dev));
 	return 0;
 }