summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoravg <avg@FreeBSD.org>2011-12-21 10:52:17 +0000
committeravg <avg@FreeBSD.org>2011-12-21 10:52:17 +0000
commit1978c13acfb0ee99028517bffc774c1db12b112d (patch)
treeefdaccce16c9ddf61a6f94944b8e2ec7307bdb50
parentd26d94695993e318a8fa7ccaefdf7c8c9022ad8d (diff)
downloadFreeBSD-src-1978c13acfb0ee99028517bffc774c1db12b112d.zip
FreeBSD-src-1978c13acfb0ee99028517bffc774c1db12b112d.tar.gz
adapt usb transfer code for SCHEDULER_STOPPED
When SCHEDULER_STOPPED() is true the mtx_owned() call may return an unexpected and thus meaningless result. So, in the code paths that can be reached when SCHEDULER_STOPPED() is true we need to protect the mtx_owned() calls with the SCHEDULER_STOPPED() checks and ensure that an appropriate branch is taken in each case. Reviewed by: hselasky MFC after: 3 months X-MFC after: r228424
-rw-r--r--sys/dev/usb/usb_transfer.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/dev/usb/usb_transfer.c b/sys/dev/usb/usb_transfer.c
index 6f4b678..4a5cfbd 100644
--- a/sys/dev/usb/usb_transfer.c
+++ b/sys/dev/usb/usb_transfer.c
@@ -2150,7 +2150,7 @@ usbd_callback_wrapper(struct usb_xfer_queue *pq)
struct usb_xfer_root *info = xfer->xroot;
USB_BUS_LOCK_ASSERT(info->bus, MA_OWNED);
- if (!mtx_owned(info->xfer_mtx)) {
+ if (!mtx_owned(info->xfer_mtx) && !SCHEDULER_STOPPED()) {
/*
* Cases that end up here:
*
@@ -3119,14 +3119,14 @@ usbd_transfer_poll(struct usb_xfer **ppxfer, uint16_t max)
/* make sure that the BUS mutex is not locked */
drop_bus = 0;
- while (mtx_owned(&xroot->udev->bus->bus_mtx)) {
+ while (mtx_owned(&xroot->udev->bus->bus_mtx) && !SCHEDULER_STOPPED()) {
mtx_unlock(&xroot->udev->bus->bus_mtx);
drop_bus++;
}
/* make sure that the transfer mutex is not locked */
drop_xfer = 0;
- while (mtx_owned(xroot->xfer_mtx)) {
+ while (mtx_owned(xroot->xfer_mtx) && !SCHEDULER_STOPPED()) {
mtx_unlock(xroot->xfer_mtx);
drop_xfer++;
}
OpenPOWER on IntegriCloud