Date: Wed, 3 Nov 2010 16:19:35 +0000 (UTC) From: Jaakko Heinonen <jh@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r214748 - head/sys/geom Message-ID: <201011031619.oA3GJZ2s026523@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jh Date: Wed Nov 3 16:19:35 2010 New Revision: 214748 URL: http://svn.freebsd.org/changeset/base/214748 Log: Extend the g_eventlock mutex coverage in one_event() to include setting of the EV_DONE flag and use the mutex to protect against losing wakeups in g_waitfor_event(). Reported by: davidxu Tested by: davidxu Discussed on: freebsd-current Modified: head/sys/geom/geom_event.c Modified: head/sys/geom/geom_event.c ============================================================================== --- head/sys/geom/geom_event.c Wed Nov 3 15:54:50 2010 (r214747) +++ head/sys/geom/geom_event.c Wed Nov 3 16:19:35 2010 (r214748) @@ -220,11 +220,12 @@ one_event(void) mtx_lock(&g_eventlock); TAILQ_REMOVE(&g_events, ep, events); ep->flag &= ~EV_INPROGRESS; - mtx_unlock(&g_eventlock); if (ep->flag & EV_WAKEUP) { ep->flag |= EV_DONE; + mtx_unlock(&g_eventlock); wakeup(ep); } else { + mtx_unlock(&g_eventlock); g_free(ep); } g_topology_unlock(); @@ -365,11 +366,14 @@ g_waitfor_event(g_event_t *func, void *a va_end(ap); if (error) return (error); - do - tsleep(ep, PRIBIO, "g_waitfor_event", hz); - while (!(ep->flag & EV_DONE)); + + mtx_lock(&g_eventlock); + while (!(ep->flag & EV_DONE)) + msleep(ep, &g_eventlock, PRIBIO, "g_waitfor_event", hz); if (ep->flag & EV_CANCELED) error = EAGAIN; + mtx_unlock(&g_eventlock); + g_free(ep); return (error); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011031619.oA3GJZ2s026523>