linux/drivers/net/can/usb
Ahmed S. Darwish 80af10e2a0 can: kvaser_usb: Fix tx queue start/stop race conditions
commit a9dc960c37 upstream.

A number of tx queue wake-up events went missing due to the
outlined scenario below. Start state is a pool of 16 tx URBs,
active tx_urbs count = 15, with the netdev tx queue open.

CPU #1 [softirq]                         CPU #2 [softirq]
start_xmit()                             tx_acknowledge()
................                         ................

atomic_inc(&tx_urbs);
if (atomic_read(&tx_urbs) >= 16) {
                        -->
                                         atomic_dec(&tx_urbs);
                                         netif_wake_queue();
                                         return;
                        <--
    netif_stop_queue();
}

At the end, the correct state expected is a 15 tx_urbs count
value with the tx queue state _open_. Due to the race, we get
the same tx_urbs value but with the tx queue state _stopped_.
The wake-up event is completely lost.

Thus avoid hand-rolled concurrency mechanisms and use a proper
lock for contexts and tx queue protection.

Signed-off-by: Ahmed S. Darwish <ahmed.darwish@valeo.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
[ luis: backported to 3.16: adjusted context ]
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
History 2015-03-30 11:11:34 +01:00
..
peak_usb can: peak_usb: fix cleanup sequence order in case of error during init 2015-01-15 10:43:35 +00:00
ems_usb.c can: Unify MTU settings for CAN interfaces 2014-03-17 09:20:16 +01:00
esd_usb2.c can: esd_usb2: fix memory leak on disconnect 2014-12-01 10:02:15 +00:00
gs_usb.c can: gs_usb: gs_destroy_candev(): fix use after free 2014-05-21 13:04:20 +02:00
Kconfig can: gs_usb: Added support for the GS_USB CAN devices 2014-05-19 09:38:25 +02:00
kvaser_usb.c can: kvaser_usb: Fix tx queue start/stop race conditions 2015-03-30 11:11:34 +01:00
Makefile can: gs_usb: Added support for the GS_USB CAN devices 2014-05-19 09:38:25 +02:00
usb_8dev.c linux-can-fixes-for-3.15-20140401 2014-04-01 17:49:50 -04:00