From owner-svn-src-head@freebsd.org Tue Dec 12 17:29:36 2017 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 31456E9FE67; Tue, 12 Dec 2017 17:29:36 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id F284867209; Tue, 12 Dec 2017 17:29:35 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id vBCHTZaH075016; Tue, 12 Dec 2017 17:29:35 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id vBCHTZdV075014; Tue, 12 Dec 2017 17:29:35 GMT (envelope-from markj@FreeBSD.org) Message-Id: <201712121729.vBCHTZdV075014@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Tue, 12 Dec 2017 17:29:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r326798 - head/sys/geom/mirror X-SVN-Group: head X-SVN-Commit-Author: markj X-SVN-Commit-Paths: head/sys/geom/mirror X-SVN-Commit-Revision: 326798 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Dec 2017 17:29:36 -0000 Author: markj Date: Tue Dec 12 17:29:34 2017 New Revision: 326798 URL: https://svnweb.freebsd.org/changeset/base/326798 Log: Address a possible lost wakeup for gmirror events. g_mirror_event_send() acquires the I/O queue lock to deliver a wakeup to the worker thread, and this is done after enqueuing the event. So it's sufficient to check the event queue before atomically releasing the queue lock and going to sleep. MFC after: 1 week Sponsored by: Dell EMC Isilon Modified: head/sys/geom/mirror/g_mirror.c Modified: head/sys/geom/mirror/g_mirror.c ============================================================================== --- head/sys/geom/mirror/g_mirror.c Tue Dec 12 17:25:25 2017 (r326797) +++ head/sys/geom/mirror/g_mirror.c Tue Dec 12 17:29:34 2017 (r326798) @@ -1945,16 +1945,9 @@ g_mirror_worker(void *arg) continue; } } + if (g_mirror_event_first(sc) != NULL) + continue; sx_xunlock(&sc->sc_lock); - /* - * XXX: We can miss an event here, because an event - * can be added without sx-device-lock and without - * mtx-queue-lock. Maybe I should just stop using - * dedicated mutex for events synchronization and - * stick with the queue lock? - * The event will hang here until next I/O request - * or next event is received. - */ MSLEEP(sc, &sc->sc_queue_mtx, PRIBIO | PDROP, "m:w1", timeout * hz); sx_xlock(&sc->sc_lock);