From 8c5d26bbb77c8525719466dc50b1c2d0f04584ad Mon Sep 17 00:00:00 2001 From: riastradh Date: Sun, 29 Jul 2018 02:00:17 +0000 Subject: [PATCH] Use callout_halt and usb_rem_task_wait on detach in aue(4). --- sys/dev/usb/if_aue.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/sys/dev/usb/if_aue.c b/sys/dev/usb/if_aue.c index 56f872141dec..54778583d514 100644 --- a/sys/dev/usb/if_aue.c +++ b/sys/dev/usb/if_aue.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_aue.c,v 1.143 2018/06/26 06:48:02 msaitoh Exp $ */ +/* $NetBSD: if_aue.c,v 1.144 2018/07/29 02:00:17 riastradh Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 @@ -78,7 +78,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.143 2018/06/26 06:48:02 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.144 2018/07/29 02:00:17 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -886,13 +886,16 @@ aue_detach(device_t self, int flags) return 0; } - callout_stop(&sc->aue_stat_ch); /* - * Remove any pending tasks. They cannot be executing because they run - * in the same thread as detach. + * XXX Halting callout guarantees no more tick tasks. What + * guarantees no more stop tasks? What guarantees no more + * calls to aue_send? Don't we need to wait for if_detach or + * something? Should we set sc->aue_dying here? Is device + * deactivation guaranteed to have already happened? */ - usb_rem_task(sc->aue_udev, &sc->aue_tick_task); - usb_rem_task(sc->aue_udev, &sc->aue_stop_task); + callout_halt(&sc->aue_stat_ch, NULL); + usb_rem_task_wait(sc->aue_udev, &sc->aue_tick_task, USB_TASKQ_DRIVER); + usb_rem_task_wait(sc->aue_udev, &sc->aue_stop_task, USB_TASKQ_DRIVER); sc->aue_closing = 1; cv_signal(&sc->aue_domc);