In the Linux kernel, the following vulnerability has been resolved:
usb: xhci: tegra: fix sleep in atomic call
When we set the dual-role 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 tegraxusbusbphywork [ 167.057954] Call trace: [ 167.057962] dumpbacktrace+0x0/0x210 [ 167.057996] showstack+0x30/0x50 [ 167.058020] dumpstacklvl+0x64/0x84 [ 167.058065] dumpstack+0x14/0x34 [ 167.058100] _mightresched+0x144/0x180 [ 167.058140] _mightsleep+0x64/0xd0 [ 167.058171] slabpreallochook.constprop.0+0xa8/0x110 [ 167.058202] _kmalloctrackcaller+0x74/0x2b0 [ 167.058233] kvasprintf+0xa4/0x190 [ 167.058261] kasprintf+0x58/0x90 [ 167.058285] tegraxusbfindportnode.isra.0+0x58/0xd0 [ 167.058334] tegraxusbfindport+0x38/0xa0 [ 167.058380] tegraxusbpadctlgetusb3companion+0x38/0xd0 [ 167.058430] tegraxhciidnotify+0x8c/0x1e0 [ 167.058473] notifiercallchain+0x88/0x100 [ 167.058506] atomicnotifiercallchain+0x44/0x70 [ 167.058537] tegraxusbusbphywork+0x60/0xd0 [ 167.058581] processonework+0x1dc/0x4c0 [ 167.058618] workerthread+0x54/0x410 [ 167.058650] kthread+0x188/0x1b0 [ 167.058672] retfromfork+0x10/0x20
The function tegraxusbpadctlgetusb3companion eventually calls tegraxusbfindport 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 tegraxusbpadctlgetusb3companion to the tegraxhciidwork function where it is really needed.