Re: [PATCH] usb: cdc-wdm: close race between read and workqueue
From: Aleksander Morgado
Date: Mon Apr 15 2024 - 01:42:21 EST
Hey Oliver & Bjørn,
On 3/14/24 11:50, Oliver Neukum wrote:
wdm_read() cannot race with itself. However, in
service_outstanding_interrupt() it can race with the
workqueue, which can be triggered by error handling.
Hence we need to make sure that the WDM_RESPONDING
flag is not just only set but tested.
Fixes: afba937e540c9 ("USB: CDC WDM driver")
Signed-off-by: Oliver Neukum <oneukum@xxxxxxxx>
We are not aware of all the details involved in this patch, but we had
to revert it in all the different ChromeOS kernel versions where we had
it cherry-picked, because it broke the MBIM communication with the Intel
XMM based Fibocomm L850 modem. Other modems shipped in Chromebooks like
the QC based Fibocomm FM101 don't seem to be affected.
Attached is an example output of mbimcli talking directly to the cdc-wdm
port (i.e. without ModemManager or the mbim-proxy). In the example, we
are receiving a bunch of different messages from previous mbimcli runs.
Looking at the timestamps, it looks as if we only receive a message
right after we have sent one, e.g. after each "open request" we end up
receiving responses for requests sent in earlier runs; or something
along those lines.
Is this bad behavior of this specific modem chipset, and if so, how can
we workaround it? If you need any additional information or help to test
new patches, let us know.
Cheers!
--
Aleksander
metaknight-rev4 ~ # mbimcli -d /dev/cdc-wdm0 --query-device-services --verbose-full
[11 Apr 2024, 01:13:25] [Debug] [/dev/cdc-wdm0] opening device...
[11 Apr 2024, 01:13:25] [Debug] [/dev/cdc-wdm0] queried max control message size: 512
[11 Apr 2024, 01:13:25] [Debug] [/dev/cdc-wdm0] sent message...
<<<<<< RAW:
<<<<<< length = 16
<<<<<< data = 01:00:00:00:10:00:00:00:01:00:00:00:00:02:00:00
[11 Apr 2024, 01:13:25] [Debug] [/dev/cdc-wdm0] sent message (translated)...
<<<<<< Header:
<<<<<< length = 16
<<<<<< type = open (0x00000001)
<<<<<< transaction = 1
<<<<<< Contents:
<<<<<< max control transfer = 512
[11 Apr 2024, 01:13:25] [Debug] [/dev/cdc-wdm0] received message... (partial fragment)
>>>>>> RAW:
>>>>>> length = 168
>>>>>> data = 03:00:00:80:A8:00:00:00:05:00:00:00:03:00:00:00:02:00:00:00:00:00:00:00:00:00:00:00:01:00:00:00:01:00:00:00:3D:01:DC:C5:FE:F5:4D:05:0D:3A:BE:F7:05:8E:9A:AF:00:00:00:00:00:00:00:00:04:00:00:00:03:00:00:00:04:00:00:00:06:00:00:00:09:00:00:00:C2:F6:58:8E:F0:37:4B:C9:86:65:F4:D4:4B:D0:93:67:00:00:00:00:00:00:00:00:06:00:00:00:01:00:00:00:02:00:00:00:03:00:00:00:04:00:00:00:05:00:00:00:06:00:00:00:68:22:3D:04:9F:6C:4E:0F:82:2D:28:44:1F:B7:23:40:00:00:00:00:00:00:00:00:02:00:00:00:01:00:00:00:02:00:00:00
[11 Apr 2024, 01:13:25] [Debug] [/dev/cdc-wdm0] received message fragment (translated)...
>>>>>> Header:
>>>>>> length = 168
>>>>>> type = command-done (0x80000003)
>>>>>> transaction = 5
>>>>>> Fragment header:
>>>>>> total = 3
>>>>>> current = 2
[11 Apr 2024, 01:13:25] [Debug] [/dev/cdc-wdm0] no transaction matched in received message
[11 Apr 2024, 01:13:25] [Debug] [/dev/cdc-wdm0] received unexpected message (translated)...
>>>>>> Header:
>>>>>> length = 168
>>>>>> type = command-done (0x80000003)
>>>>>> transaction = 5
>>>>>> Fragment header:
>>>>>> total = 3
>>>>>> current = 2
[11 Apr 2024, 01:13:30] [Debug] [/dev/cdc-wdm0] number of consecutive timeouts: 1
[11 Apr 2024, 01:13:30] [Debug] [/dev/cdc-wdm0] sent message...
<<<<<< RAW:
<<<<<< length = 16
<<<<<< data = 01:00:00:00:10:00:00:00:02:00:00:00:00:02:00:00
[11 Apr 2024, 01:13:30] [Debug] [/dev/cdc-wdm0] sent message (translated)...
<<<<<< Header:
<<<<<< length = 16
<<<<<< type = open (0x00000001)
<<<<<< transaction = 2
<<<<<< Contents:
<<<<<< max control transfer = 512
[11 Apr 2024, 01:13:30] [Debug] [/dev/cdc-wdm0] received message...
>>>>>> RAW:
>>>>>> length = 212
>>>>>> data = 03:00:00:80:D4:00:00:00:06:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:01:00:00:00:00:00:00:00:A4:00:00:00:01:00:00:00:01:00:00:00:01:00:00:00:02:00:00:00:3C:00:00:80:03:00:00:00:01:00:00:00:08:00:00:00:40:00:00:00:0A:00:00:00:4C:00:00:00:1E:00:00:00:6C:00:00:00:2C:00:00:00:98:00:00:00:0C:00:00:00:48:00:53:00:50:00:41:00:2B:00:00:00:38:00:36:00:37:00:35:00:38:00:30:00:30:00:35:00:30:00:37:00:37:00:39:00:34:00:31:00:35:00:00:00:31:00:38:00:35:00:30:00:30:00:2E:00:35:00:30:00:30:00:31:00:2E:00:30:00:30:00:2E:00:30:00:35:00:2E:00:32:00:37:00:2E:00:31:00:32:00:56:00:31:00:2E:00:30:00:2E:00:34:00
[11 Apr 2024, 01:13:30] [Debug] [/dev/cdc-wdm0] no transaction matched in received message
[11 Apr 2024, 01:13:30] [Debug] [/dev/cdc-wdm0] received unexpected message (translated)...
>>>>>> Header:
>>>>>> length = 212
>>>>>> type = command-done (0x80000003)
>>>>>> transaction = 6
>>>>>> Fragment header:
>>>>>> total = 1
>>>>>> current = 0
>>>>>> Contents:
>>>>>> status error = 'None' (0x00000000)
>>>>>> service = 'basic-connect' (a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)
>>>>>> cid = 'device-caps' (0x00000001)
>>>>>> Fields:
>>>>>> DeviceType = 'embedded'
>>>>>> CellularClass = 'gsm'
>>>>>> VoiceClass = 'no-voice'
>>>>>> SimClass = 'removable'
>>>>>> DataClass = 'umts, hsdpa, hsupa, lte, custom'
>>>>>> SmsCaps = 'pdu-receive, pdu-send'
>>>>>> ControlCaps = 'reg-manual'
>>>>>> MaxSessions = '8'
>>>>>> CustomDataClass = 'HSPA+'
>>>>>> DeviceId = '867580050779415'
>>>>>> FirmwareInfo = '18500.5001.00.05.27.12'
>>>>>> HardwareInfo = 'V1.0.4'
[11 Apr 2024, 01:13:35] [Debug] [/dev/cdc-wdm0] number of consecutive timeouts: 2
[11 Apr 2024, 01:13:35] [Debug] [/dev/cdc-wdm0] sent message...
<<<<<< RAW:
<<<<<< length = 16
<<<<<< data = 01:00:00:00:10:00:00:00:03:00:00:00:00:02:00:00
[11 Apr 2024, 01:13:35] [Debug] [/dev/cdc-wdm0] sent message (translated)...
<<<<<< Header:
<<<<<< length = 16
<<<<<< type = open (0x00000001)
<<<<<< transaction = 3
<<<<<< Contents:
<<<<<< max control transfer = 512
[11 Apr 2024, 01:13:35] [Debug] [/dev/cdc-wdm0] received message...
>>>>>> RAW:
>>>>>> length = 212
>>>>>> data = 03:00:00:80:D4:00:00:00:07:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:01:00:00:00:00:00:00:00:A4:00:00:00:01:00:00:00:01:00:00:00:01:00:00:00:02:00:00:00:3C:00:00:80:03:00:00:00:01:00:00:00:08:00:00:00:40:00:00:00:0A:00:00:00:4C:00:00:00:1E:00:00:00:6C:00:00:00:2C:00:00:00:98:00:00:00:0C:00:00:00:48:00:53:00:50:00:41:00:2B:00:00:00:38:00:36:00:37:00:35:00:38:00:30:00:30:00:35:00:30:00:37:00:37:00:39:00:34:00:31:00:35:00:00:00:31:00:38:00:35:00:30:00:30:00:2E:00:35:00:30:00:30:00:31:00:2E:00:30:00:30:00:2E:00:30:00:35:00:2E:00:32:00:37:00:2E:00:31:00:32:00:56:00:31:00:2E:00:30:00:2E:00:34:00
[11 Apr 2024, 01:13:35] [Debug] [/dev/cdc-wdm0] no transaction matched in received message
[11 Apr 2024, 01:13:35] [Debug] [/dev/cdc-wdm0] received unexpected message (translated)...
>>>>>> Header:
>>>>>> length = 212
>>>>>> type = command-done (0x80000003)
>>>>>> transaction = 7
>>>>>> Fragment header:
>>>>>> total = 1
>>>>>> current = 0
>>>>>> Contents:
>>>>>> status error = 'None' (0x00000000)
>>>>>> service = 'basic-connect' (a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)
>>>>>> cid = 'device-caps' (0x00000001)
>>>>>> Fields:
>>>>>> DeviceType = 'embedded'
>>>>>> CellularClass = 'gsm'
>>>>>> VoiceClass = 'no-voice'
>>>>>> SimClass = 'removable'
>>>>>> DataClass = 'umts, hsdpa, hsupa, lte, custom'
>>>>>> SmsCaps = 'pdu-receive, pdu-send'
>>>>>> ControlCaps = 'reg-manual'
>>>>>> MaxSessions = '8'
>>>>>> CustomDataClass = 'HSPA+'
>>>>>> DeviceId = '867580050779415'
>>>>>> FirmwareInfo = '18500.5001.00.05.27.12'
>>>>>> HardwareInfo = 'V1.0.4'
[11 Apr 2024, 01:13:40] [Debug] [/dev/cdc-wdm0] number of consecutive timeouts: 3
[11 Apr 2024, 01:13:40] [Debug] [/dev/cdc-wdm0] sent message...
<<<<<< RAW:
<<<<<< length = 16
<<<<<< data = 01:00:00:00:10:00:00:00:04:00:00:00:00:02:00:00
[11 Apr 2024, 01:13:40] [Debug] [/dev/cdc-wdm0] sent message (translated)...
<<<<<< Header:
<<<<<< length = 16
<<<<<< type = open (0x00000001)
<<<<<< transaction = 4
<<<<<< Contents:
<<<<<< max control transfer = 512
[11 Apr 2024, 01:13:40] [Debug] [/dev/cdc-wdm0] received message...
>>>>>> RAW:
>>>>>> length = 212
>>>>>> data = 03:00:00:80:D4:00:00:00:08:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:01:00:00:00:00:00:00:00:A4:00:00:00:01:00:00:00:01:00:00:00:01:00:00:00:02:00:00:00:3C:00:00:80:03:00:00:00:01:00:00:00:08:00:00:00:40:00:00:00:0A:00:00:00:4C:00:00:00:1E:00:00:00:6C:00:00:00:2C:00:00:00:98:00:00:00:0C:00:00:00:48:00:53:00:50:00:41:00:2B:00:00:00:38:00:36:00:37:00:35:00:38:00:30:00:30:00:35:00:30:00:37:00:37:00:39:00:34:00:31:00:35:00:00:00:31:00:38:00:35:00:30:00:30:00:2E:00:35:00:30:00:30:00:31:00:2E:00:30:00:30:00:2E:00:30:00:35:00:2E:00:32:00:37:00:2E:00:31:00:32:00:56:00:31:00:2E:00:30:00:2E:00:34:00
[11 Apr 2024, 01:13:40] [Debug] [/dev/cdc-wdm0] no transaction matched in received message
[11 Apr 2024, 01:13:40] [Debug] [/dev/cdc-wdm0] received unexpected message (translated)...
>>>>>> Header:
>>>>>> length = 212
>>>>>> type = command-done (0x80000003)
>>>>>> transaction = 8
>>>>>> Fragment header:
>>>>>> total = 1
>>>>>> current = 0
>>>>>> Contents:
>>>>>> status error = 'None' (0x00000000)
>>>>>> service = 'basic-connect' (a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)
>>>>>> cid = 'device-caps' (0x00000001)
>>>>>> Fields:
>>>>>> DeviceType = 'embedded'
>>>>>> CellularClass = 'gsm'
>>>>>> VoiceClass = 'no-voice'
>>>>>> SimClass = 'removable'
>>>>>> DataClass = 'umts, hsdpa, hsupa, lte, custom'
>>>>>> SmsCaps = 'pdu-receive, pdu-send'
>>>>>> ControlCaps = 'reg-manual'
>>>>>> MaxSessions = '8'
>>>>>> CustomDataClass = 'HSPA+'
>>>>>> DeviceId = '867580050779415'
>>>>>> FirmwareInfo = '18500.5001.00.05.27.12'
>>>>>> HardwareInfo = 'V1.0.4'
[11 Apr 2024, 01:13:44] [Debug] [/dev/cdc-wdm0] received message...
>>>>>> RAW:
>>>>>> length = 212
>>>>>> data = 03:00:00:80:D4:00:00:00:09:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:01:00:00:00:00:00:00:00:A4:00:00:00:01:00:00:00:01:00:00:00:01:00:00:00:02:00:00:00:3C:00:00:80:03:00:00:00:01:00:00:00:08:00:00:00:40:00:00:00:0A:00:00:00:4C:00:00:00:1E:00:00:00:6C:00:00:00:2C:00:00:00:98:00:00:00:0C:00:00:00:48:00:53:00:50:00:41:00:2B:00:00:00:38:00:36:00:37:00:35:00:38:00:30:00:30:00:35:00:30:00:37:00:37:00:39:00:34:00:31:00:35:00:00:00:31:00:38:00:35:00:30:00:30:00:2E:00:35:00:30:00:30:00:31:00:2E:00:30:00:30:00:2E:00:30:00:35:00:2E:00:32:00:37:00:2E:00:31:00:32:00:56:00:31:00:2E:00:30:00:2E:00:34:00
[11 Apr 2024, 01:13:44] [Debug] [/dev/cdc-wdm0] no transaction matched in received message
[11 Apr 2024, 01:13:44] [Debug] [/dev/cdc-wdm0] received unexpected message (translated)...
>>>>>> Header:
>>>>>> length = 212
>>>>>> type = command-done (0x80000003)
>>>>>> transaction = 9
>>>>>> Fragment header:
>>>>>> total = 1
>>>>>> current = 0
>>>>>> Contents:
>>>>>> status error = 'None' (0x00000000)
>>>>>> service = 'basic-connect' (a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)
>>>>>> cid = 'device-caps' (0x00000001)
>>>>>> Fields:
>>>>>> DeviceType = 'embedded'
>>>>>> CellularClass = 'gsm'
>>>>>> VoiceClass = 'no-voice'
>>>>>> SimClass = 'removable'
>>>>>> DataClass = 'umts, hsdpa, hsupa, lte, custom'
>>>>>> SmsCaps = 'pdu-receive, pdu-send'
>>>>>> ControlCaps = 'reg-manual'
>>>>>> MaxSessions = '8'
>>>>>> CustomDataClass = 'HSPA+'
>>>>>> DeviceId = '867580050779415'
>>>>>> FirmwareInfo = '18500.5001.00.05.27.12'
>>>>>> HardwareInfo = 'V1.0.4'
[11 Apr 2024, 01:13:45] [Debug] [/dev/cdc-wdm0] number of consecutive timeouts: 4
[11 Apr 2024, 01:13:45] [Debug] [/dev/cdc-wdm0] sent message...
<<<<<< RAW:
<<<<<< length = 16
<<<<<< data = 01:00:00:00:10:00:00:00:05:00:00:00:00:02:00:00
[11 Apr 2024, 01:13:45] [Debug] [/dev/cdc-wdm0] sent message (translated)...
<<<<<< Header:
<<<<<< length = 16
<<<<<< type = open (0x00000001)
<<<<<< transaction = 5
<<<<<< Contents:
<<<<<< max control transfer = 512
[11 Apr 2024, 01:13:45] [Debug] [/dev/cdc-wdm0] received message...
>>>>>> RAW:
>>>>>> length = 212
>>>>>> data = 03:00:00:80:D4:00:00:00:0A:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:01:00:00:00:00:00:00:00:A4:00:00:00:01:00:00:00:01:00:00:00:01:00:00:00:02:00:00:00:3C:00:00:80:03:00:00:00:01:00:00:00:08:00:00:00:40:00:00:00:0A:00:00:00:4C:00:00:00:1E:00:00:00:6C:00:00:00:2C:00:00:00:98:00:00:00:0C:00:00:00:48:00:53:00:50:00:41:00:2B:00:00:00:38:00:36:00:37:00:35:00:38:00:30:00:30:00:35:00:30:00:37:00:37:00:39:00:34:00:31:00:35:00:00:00:31:00:38:00:35:00:30:00:30:00:2E:00:35:00:30:00:30:00:31:00:2E:00:30:00:30:00:2E:00:30:00:35:00:2E:00:32:00:37:00:2E:00:31:00:32:00:56:00:31:00:2E:00:30:00:2E:00:34:00
[11 Apr 2024, 01:13:45] [Debug] [/dev/cdc-wdm0] no transaction matched in received message
[11 Apr 2024, 01:13:45] [Debug] [/dev/cdc-wdm0] received unexpected message (translated)...
>>>>>> Header:
>>>>>> length = 212
>>>>>> type = command-done (0x80000003)
>>>>>> transaction = 10
>>>>>> Fragment header:
>>>>>> total = 1
>>>>>> current = 0
>>>>>> Contents:
>>>>>> status error = 'None' (0x00000000)
>>>>>> service = 'basic-connect' (a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)
>>>>>> cid = 'device-caps' (0x00000001)
>>>>>> Fields:
>>>>>> DeviceType = 'embedded'
>>>>>> CellularClass = 'gsm'
>>>>>> VoiceClass = 'no-voice'
>>>>>> SimClass = 'removable'
>>>>>> DataClass = 'umts, hsdpa, hsupa, lte, custom'
>>>>>> SmsCaps = 'pdu-receive, pdu-send'
>>>>>> ControlCaps = 'reg-manual'
>>>>>> MaxSessions = '8'
>>>>>> CustomDataClass = 'HSPA+'
>>>>>> DeviceId = '867580050779415'
>>>>>> FirmwareInfo = '18500.5001.00.05.27.12'
>>>>>> HardwareInfo = 'V1.0.4'
[11 Apr 2024, 01:13:50] [Debug] [/dev/cdc-wdm0] number of consecutive timeouts: 5
[11 Apr 2024, 01:13:50] [Debug] [/dev/cdc-wdm0] sent message...
<<<<<< RAW:
<<<<<< length = 16
<<<<<< data = 01:00:00:00:10:00:00:00:06:00:00:00:00:02:00:00
[11 Apr 2024, 01:13:50] [Debug] [/dev/cdc-wdm0] sent message (translated)...
<<<<<< Header:
<<<<<< length = 16
<<<<<< type = open (0x00000001)
<<<<<< transaction = 6
<<<<<< Contents:
<<<<<< max control transfer = 512
[11 Apr 2024, 01:13:54] [Debug] [/dev/cdc-wdm0] received message...
>>>>>> RAW:
>>>>>> length = 212
>>>>>> data = 03:00:00:80:D4:00:00:00:0D:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:01:00:00:00:00:00:00:00:A4:00:00:00:01:00:00:00:01:00:00:00:01:00:00:00:02:00:00:00:3C:00:00:80:03:00:00:00:01:00:00:00:08:00:00:00:40:00:00:00:0A:00:00:00:4C:00:00:00:1E:00:00:00:6C:00:00:00:2C:00:00:00:98:00:00:00:0C:00:00:00:48:00:53:00:50:00:41:00:2B:00:00:00:38:00:36:00:37:00:35:00:38:00:30:00:30:00:35:00:30:00:37:00:37:00:39:00:34:00:31:00:35:00:00:00:31:00:38:00:35:00:30:00:30:00:2E:00:35:00:30:00:30:00:31:00:2E:00:30:00:30:00:2E:00:30:00:35:00:2E:00:32:00:37:00:2E:00:31:00:32:00:56:00:31:00:2E:00:30:00:2E:00:34:00
[11 Apr 2024, 01:13:54] [Debug] [/dev/cdc-wdm0] no transaction matched in received message
[11 Apr 2024, 01:13:54] [Debug] [/dev/cdc-wdm0] received unexpected message (translated)...
>>>>>> Header:
>>>>>> length = 212
>>>>>> type = command-done (0x80000003)
>>>>>> transaction = 13
>>>>>> Fragment header:
>>>>>> total = 1
>>>>>> current = 0
>>>>>> Contents:
>>>>>> status error = 'None' (0x00000000)
>>>>>> service = 'basic-connect' (a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)
>>>>>> cid = 'device-caps' (0x00000001)
>>>>>> Fields:
>>>>>> DeviceType = 'embedded'
>>>>>> CellularClass = 'gsm'
>>>>>> VoiceClass = 'no-voice'
>>>>>> SimClass = 'removable'
>>>>>> DataClass = 'umts, hsdpa, hsupa, lte, custom'
>>>>>> SmsCaps = 'pdu-receive, pdu-send'
>>>>>> ControlCaps = 'reg-manual'
>>>>>> MaxSessions = '8'
>>>>>> CustomDataClass = 'HSPA+'
>>>>>> DeviceId = '867580050779415'
>>>>>> FirmwareInfo = '18500.5001.00.05.27.12'
>>>>>> HardwareInfo = 'V1.0.4'
[11 Apr 2024, 01:13:55] [Debug] [/dev/cdc-wdm0] number of consecutive timeouts: 6
[11 Apr 2024, 01:13:55] [Debug] [/dev/cdc-wdm0] open operation timed out: closed
error: couldn't open the MbimDevice: Operation timed out: device is closed
Attachment:
OpenPGP_0xAECE0239C6606AD5.asc
Description: OpenPGP public key
Attachment:
OpenPGP_signature.asc
Description: OpenPGP digital signature