2023-03-20 07:41:21

by HaoTien Hsu

[permalink] [raw]
Subject: [PATCH] usb: xhci: tegra: fix sleep in atomic call

From: Wayne Chang <[email protected]>

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 <[email protected]>
Signed-off-by: Haotien Hsu <[email protected]>
---
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.
* 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;

--
2.25.1



2023-03-20 08:10:08

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH] usb: xhci: tegra: fix sleep in atomic call

On Mon, Mar 20, 2023 at 03:40:28PM +0800, Haotien Hsu wrote:
> From: Wayne Chang <[email protected]>
>
> 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 <[email protected]>
> Signed-off-by: Haotien Hsu <[email protected]>

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

2023-03-20 09:54:40

by HaoTien Hsu

[permalink] [raw]
Subject: Re: [PATCH] usb: xhci: tegra: fix sleep in atomic call

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 <[email protected]>
> >
> > 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 <[email protected]>
> > Signed-off-by: Haotien Hsu <[email protected]>
>
> 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

2023-03-20 10:03:12

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH] usb: xhci: tegra: fix sleep in atomic call

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 <[email protected]>
> > >
> > > 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 <[email protected]>
> > > Signed-off-by: Haotien Hsu <[email protected]>
> >
> > 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