summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorriastradh <riastradh@NetBSD.org>2022-03-03 05:47:06 +0000
committerriastradh <riastradh@NetBSD.org>2022-03-03 05:47:06 +0000
commit2d5a6724d019aaefb0780da17788d036e57904b3 (patch)
tree3292a090e51a0160367fec307ccd4a1068c0f351 /sys/dev
parent0c57e692542262d66289cc23f87c3bb19b0ab547 (diff)
usbnet: Take IFNET_LOCK around access to if_flags in usbnet_detach.
This is not stable without IFNET_LOCK. Extraneous calls to usbnet_stop arising from this race might be harmless, but let's render it unnecessary to even think about that.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/usb/usbnet.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/dev/usb/usbnet.c b/sys/dev/usb/usbnet.c
index 767d4268c57..99fc4c24aea 100644
--- a/sys/dev/usb/usbnet.c
+++ b/sys/dev/usb/usbnet.c
@@ -1,4 +1,4 @@
-/* $NetBSD: usbnet.c,v 1.46 2022/03/03 05:46:58 riastradh Exp $ */
+/* $NetBSD: usbnet.c,v 1.47 2022/03/03 05:47:06 riastradh Exp $ */
/*
* Copyright (c) 2019 Matthew R. Green
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.46 2022/03/03 05:46:58 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.47 2022/03/03 05:47:06 riastradh Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -1554,11 +1554,11 @@ usbnet_detach(device_t self, int flags)
unp->unp_dying = true;
mutex_exit(&unp->unp_core_lock);
+ IFNET_LOCK(ifp);
if (ifp->if_flags & IFF_RUNNING) {
- IFNET_LOCK(ifp);
usbnet_if_stop(ifp, 1);
- IFNET_UNLOCK(ifp);
}
+ IFNET_UNLOCK(ifp);
callout_halt(&unp->unp_stat_ch, NULL);
usb_rem_task_wait(un->un_udev, &unp->unp_ticktask, USB_TASKQ_DRIVER,