Message ID | 20230320074028.186282-1-haotienh@nvidia.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | usb: xhci: tegra: fix sleep in atomic call | expand |
On Mon, Mar 20, 2023 at 03:40:28PM +0800, Haotien Hsu wrote: > From: Wayne Chang <waynec@nvidia.com> > > When we set the OTG port to Host mode, we observed the following splat: > [ 167.057718] BUG: sleeping function called from invalid context at > include/linux/sched/mm.h:229 > [ 167.057872] Workqueue: events tegra_xusb_usb_phy_work > [ 167.057954] Call trace: > [ 167.057962] dump_backtrace+0x0/0x210 > [ 167.057996] show_stack+0x30/0x50 > [ 167.058020] dump_stack_lvl+0x64/0x84 > [ 167.058065] dump_stack+0x14/0x34 > [ 167.058100] __might_resched+0x144/0x180 > [ 167.058140] __might_sleep+0x64/0xd0 > [ 167.058171] slab_pre_alloc_hook.constprop.0+0xa8/0x110 > [ 167.058202] __kmalloc_track_caller+0x74/0x2b0 > [ 167.058233] kvasprintf+0xa4/0x190 > [ 167.058261] kasprintf+0x58/0x90 > [ 167.058285] tegra_xusb_find_port_node.isra.0+0x58/0xd0 > [ 167.058334] tegra_xusb_find_port+0x38/0xa0 > [ 167.058380] tegra_xusb_padctl_get_usb3_companion+0x38/0xd0 > [ 167.058430] tegra_xhci_id_notify+0x8c/0x1e0 > [ 167.058473] notifier_call_chain+0x88/0x100 > [ 167.058506] atomic_notifier_call_chain+0x44/0x70 > [ 167.058537] tegra_xusb_usb_phy_work+0x60/0xd0 > [ 167.058581] process_one_work+0x1dc/0x4c0 > [ 167.058618] worker_thread+0x54/0x410 > [ 167.058650] kthread+0x188/0x1b0 > [ 167.058672] ret_from_fork+0x10/0x20 > > The function tegra_xusb_padctl_get_usb3_companion eventually calls > tegra_xusb_find_port and this in turn calls kasprintf which might sleep > and so cannot be called from an atomic context. > > Fix this by moving the call to tegra_xusb_padctl_get_usb3_companion to > the tegra_xhci_id_work function where it is really needed. > > Signed-off-by: Wayne Chang <waynec@nvidia.com> > Signed-off-by: Haotien Hsu <haotienh@nvidia.com> What commit id does this fix? And does it need to be backported to older kernels? > --- > drivers/usb/host/xhci-tegra.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c > index 1ff22f675930..af0185bacc70 100644 > --- a/drivers/usb/host/xhci-tegra.c > +++ b/drivers/usb/host/xhci-tegra.c > @@ -2,7 +2,7 @@ > /* > * NVIDIA Tegra xHCI host controller driver > * > - * Copyright (c) 2014-2020, NVIDIA CORPORATION. All rights reserved. > + * Copyright (c) 2014-2023, NVIDIA CORPORATION. All rights reserved. Please submit copyright updates separately, showing that there really was copyright updates during those years as that is independent of this fix and does not need to be backported anywhere. thanks, greg k-h
On Mon, 2023-03-20 at 09:09 +0100, Greg Kroah-Hartman wrote: > External email: Use caution opening links or attachments > > > On Mon, Mar 20, 2023 at 03:40:28PM +0800, Haotien Hsu wrote: > > From: Wayne Chang <waynec@nvidia.com> > > > > When we set the OTG port to Host mode, we observed the following > > splat: > > [ 167.057718] BUG: sleeping function called from invalid context > > at > > include/linux/sched/mm.h:229 > > [ 167.057872] Workqueue: events tegra_xusb_usb_phy_work > > [ 167.057954] Call trace: > > [ 167.057962] dump_backtrace+0x0/0x210 > > [ 167.057996] show_stack+0x30/0x50 > > [ 167.058020] dump_stack_lvl+0x64/0x84 > > [ 167.058065] dump_stack+0x14/0x34 > > [ 167.058100] __might_resched+0x144/0x180 > > [ 167.058140] __might_sleep+0x64/0xd0 > > [ 167.058171] slab_pre_alloc_hook.constprop.0+0xa8/0x110 > > [ 167.058202] __kmalloc_track_caller+0x74/0x2b0 > > [ 167.058233] kvasprintf+0xa4/0x190 > > [ 167.058261] kasprintf+0x58/0x90 > > [ 167.058285] tegra_xusb_find_port_node.isra.0+0x58/0xd0 > > [ 167.058334] tegra_xusb_find_port+0x38/0xa0 > > [ 167.058380] tegra_xusb_padctl_get_usb3_companion+0x38/0xd0 > > [ 167.058430] tegra_xhci_id_notify+0x8c/0x1e0 > > [ 167.058473] notifier_call_chain+0x88/0x100 > > [ 167.058506] atomic_notifier_call_chain+0x44/0x70 > > [ 167.058537] tegra_xusb_usb_phy_work+0x60/0xd0 > > [ 167.058581] process_one_work+0x1dc/0x4c0 > > [ 167.058618] worker_thread+0x54/0x410 > > [ 167.058650] kthread+0x188/0x1b0 > > [ 167.058672] ret_from_fork+0x10/0x20 > > > > The function tegra_xusb_padctl_get_usb3_companion eventually calls > > tegra_xusb_find_port and this in turn calls kasprintf which might > > sleep > > and so cannot be called from an atomic context. > > > > Fix this by moving the call to tegra_xusb_padctl_get_usb3_companion > > to > > the tegra_xhci_id_work function where it is really needed. > > > > Signed-off-by: Wayne Chang <waynec@nvidia.com> > > Signed-off-by: Haotien Hsu <haotienh@nvidia.com> > > What commit id does this fix? And does it need to be backported to > older kernels? > Sorry for missing "Fixes:" and "Cc: stable" lines. > > --- > > drivers/usb/host/xhci-tegra.c | 9 +++++---- > > 1 file changed, 5 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci- > > tegra.c > > index 1ff22f675930..af0185bacc70 100644 > > --- a/drivers/usb/host/xhci-tegra.c > > +++ b/drivers/usb/host/xhci-tegra.c > > @@ -2,7 +2,7 @@ > > /* > > * NVIDIA Tegra xHCI host controller driver > > * > > - * Copyright (c) 2014-2020, NVIDIA CORPORATION. All rights > > reserved. > > + * Copyright (c) 2014-2023, NVIDIA CORPORATION. All rights > > reserved. > > Please submit copyright updates separately, showing that there really > was copyright updates during those years as that is independent of > this > fix and does not need to be backported anywhere. > Thanks for the detailed information! > thanks, > > greg k-h
On Mon, Mar 20, 2023 at 09:54:28AM +0000, Haotien Hsu wrote: > On Mon, 2023-03-20 at 09:09 +0100, Greg Kroah-Hartman wrote: > > External email: Use caution opening links or attachments > > > > > > On Mon, Mar 20, 2023 at 03:40:28PM +0800, Haotien Hsu wrote: > > > From: Wayne Chang <waynec@nvidia.com> > > > > > > When we set the OTG port to Host mode, we observed the following > > > splat: > > > [ 167.057718] BUG: sleeping function called from invalid context > > > at > > > include/linux/sched/mm.h:229 > > > [ 167.057872] Workqueue: events tegra_xusb_usb_phy_work > > > [ 167.057954] Call trace: > > > [ 167.057962] dump_backtrace+0x0/0x210 > > > [ 167.057996] show_stack+0x30/0x50 > > > [ 167.058020] dump_stack_lvl+0x64/0x84 > > > [ 167.058065] dump_stack+0x14/0x34 > > > [ 167.058100] __might_resched+0x144/0x180 > > > [ 167.058140] __might_sleep+0x64/0xd0 > > > [ 167.058171] slab_pre_alloc_hook.constprop.0+0xa8/0x110 > > > [ 167.058202] __kmalloc_track_caller+0x74/0x2b0 > > > [ 167.058233] kvasprintf+0xa4/0x190 > > > [ 167.058261] kasprintf+0x58/0x90 > > > [ 167.058285] tegra_xusb_find_port_node.isra.0+0x58/0xd0 > > > [ 167.058334] tegra_xusb_find_port+0x38/0xa0 > > > [ 167.058380] tegra_xusb_padctl_get_usb3_companion+0x38/0xd0 > > > [ 167.058430] tegra_xhci_id_notify+0x8c/0x1e0 > > > [ 167.058473] notifier_call_chain+0x88/0x100 > > > [ 167.058506] atomic_notifier_call_chain+0x44/0x70 > > > [ 167.058537] tegra_xusb_usb_phy_work+0x60/0xd0 > > > [ 167.058581] process_one_work+0x1dc/0x4c0 > > > [ 167.058618] worker_thread+0x54/0x410 > > > [ 167.058650] kthread+0x188/0x1b0 > > > [ 167.058672] ret_from_fork+0x10/0x20 > > > > > > The function tegra_xusb_padctl_get_usb3_companion eventually calls > > > tegra_xusb_find_port and this in turn calls kasprintf which might > > > sleep > > > and so cannot be called from an atomic context. > > > > > > Fix this by moving the call to tegra_xusb_padctl_get_usb3_companion > > > to > > > the tegra_xhci_id_work function where it is really needed. > > > > > > Signed-off-by: Wayne Chang <waynec@nvidia.com> > > > Signed-off-by: Haotien Hsu <haotienh@nvidia.com> > > > > What commit id does this fix? And does it need to be backported to > > older kernels? > > > > Sorry for missing "Fixes:" and "Cc: stable" lines. What should be listed for the Fixes line? Please add it when you resubmit it. thanks, greg k-h
diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c index 1ff22f675930..af0185bacc70 100644 --- a/drivers/usb/host/xhci-tegra.c +++ b/drivers/usb/host/xhci-tegra.c @@ -2,7 +2,7 @@ /* * NVIDIA Tegra xHCI host controller driver * - * Copyright (c) 2014-2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2014-2023, NVIDIA CORPORATION. All rights reserved. * Copyright (C) 2014 Google, Inc. */ @@ -1360,6 +1360,10 @@ static void tegra_xhci_id_work(struct work_struct *work) mutex_unlock(&tegra->lock); + tegra->otg_usb3_port = tegra_xusb_padctl_get_usb3_companion( + tegra->padctl, + tegra->otg_usb2_port); + if (tegra->host_mode) { /* switch to host mode */ if (tegra->otg_usb3_port >= 0) { @@ -1474,9 +1478,6 @@ static int tegra_xhci_id_notify(struct notifier_block *nb, } tegra->otg_usb2_port = tegra_xusb_get_usb2_port(tegra, usbphy); - tegra->otg_usb3_port = tegra_xusb_padctl_get_usb3_companion( - tegra->padctl, - tegra->otg_usb2_port); tegra->host_mode = (usbphy->last_event == USB_EVENT_ID) ? true : false;