From nobody Sat Mar 19 04:22:59 2022 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 1BCD81A14974; Sat, 19 Mar 2022 04:23:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4KL75v6nFvz4k5b; Sat, 19 Mar 2022 04:22:59 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1647663780; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=69Pe0qdOh3khWTMA5pHX/8MJ/kQuD/mxgk5cjCE4cnM=; b=MeRCcufmu5QYY/wwqLLA/ZlGVXfYukvSvCCGUeKWz1en7jMY1+PTmHEWUvsGrXMQAzgQ0d 6kt0lkoCMB1d5uq+R6P/D98+wkysaVW6c9+3SedYEb60s1kEuu3C9vjzNmkkZdE+eRpaSX Qrcf8/yA+pCxuvUF9lW7aSXgUHuk2WHhDxwIhHNDpoXhiZoaEEG9e4CgKpPdrFG/U/ALon 2SiGBrARkmjDoKmST2sF7/5KHZ/3oqXFge8nENQiOghaq2qRcHwc76J3W/Va48+h29ZPRk V1wTbbNPQm2lu4h+GSAWsVEl5CWyR4+T2mOmqMk8HtYTcovcWJ7JMr4EFNcV4w== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id C9AEA498C; Sat, 19 Mar 2022 04:22:59 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 22J4Mx9U016669; Sat, 19 Mar 2022 04:22:59 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 22J4MxB5016668; Sat, 19 Mar 2022 04:22:59 GMT (envelope-from git) Date: Sat, 19 Mar 2022 04:22:59 GMT Message-Id: <202203190422.22J4MxB5016668@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Eugene Grosbein Subject: git: 4a11315a2c3f - stable/13 - virtio_random(8): MFC: avoid deadlock at shutdown time (regression fix) List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: eugen X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 4a11315a2c3fc55333772f48aaef32ae1eb11ceb Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1647663780; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=69Pe0qdOh3khWTMA5pHX/8MJ/kQuD/mxgk5cjCE4cnM=; b=hlzuWBe5a1H1qBlc+tTvvC3u6VU5e4wd69MNIbE0C+6brsecrermwkbv5qqPYoUdq5icdi FcBjxDigpuzW58GCnuKvTYpiz+cRG/kOJfDoEwo+WwuUXBCmAJE/XBMU4hmAK35LmWNhUA AkbP5jBfA0QH5Rarp3EbxvU5whdyDplRMq9Tn8bsLJWmHWYYb2ohd/RKoButt6vUW73euF TxPpTGyXyddgcgJWaJrWZTnlDCnlHGUDW3VkhL0RyeyHqBzFFViJfd71IjMmEBoxJ792z/ bCw48O4pMn9lC25hobKzPbdgKDLHwOvCDY2S/HUN8xyryVreiS+uiaJqW6O4Nw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1647663780; a=rsa-sha256; cv=none; b=pTfJVk/Mfsy4AmA4/hWMpXyezdx1PMCehZNctE3K9dVv3am7IhwLSlxCMp1jtWNAafy5Pt CpM6cadSIlnom25lgjWfJ2HD8xj5qCpVjYjbbRH83Gy+k7YiPWIIExBVn6KDdX9SBBtLSZ j+IBRLgy7XYuIOvMk9yggyoNOFbH+cbqmuU6uyEHz6nrwpJoGH4tJqus6lmde6HSlovUpa RBKJW8oHw/ePVjOXaqmp9yo2bq1OM/C3CRSE4l9+yYevz91erx2yZZn4ksGWM9VU1YCTNP DVP4LwPGWWJwJz4GL+m4Ff+EZIa6lRxj1F1t5LsyunIRZQuIe5OAR0ESOFG4IQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by eugen: URL: https://cgit.FreeBSD.org/src/commit/?id=4a11315a2c3fc55333772f48aaef32ae1eb11ceb commit 4a11315a2c3fc55333772f48aaef32ae1eb11ceb Author: Eugene Grosbein AuthorDate: 2022-03-16 04:41:51 +0000 Commit: Eugene Grosbein CommitDate: 2022-03-19 04:20:58 +0000 virtio_random(8): MFC: avoid deadlock at shutdown time (regression fix) FreeBSD 13+ running as virtual guest may load virtio_random(8) driver by means of devd(8) unless the driver is blacklisted or disabled via device.hints(5). Currently, the driver may prevent the system from rebooting or shutting down correctly. This change deactivates virtio_random at very late stage during system shutdown sequence to avoid deadlock that results in kernel hang. PR: 253175 Tested by: tom Relnotes: yes (cherry picked from commit adbf7727b3a2aad3c2faa6e543ee7fa7a6c9a3d5) --- sys/dev/virtio/random/virtio_random.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/sys/dev/virtio/random/virtio_random.c b/sys/dev/virtio/random/virtio_random.c index a8553ecab287..a95dcadcddcd 100644 --- a/sys/dev/virtio/random/virtio_random.c +++ b/sys/dev/virtio/random/virtio_random.c @@ -32,6 +32,8 @@ __FBSDID("$FreeBSD$"); #include +#include +#include #include #include #include @@ -52,6 +54,8 @@ struct vtrnd_softc { device_t vtrnd_dev; uint64_t vtrnd_features; struct virtqueue *vtrnd_vq; + eventhandler_tag eh; + bool inactive; }; static int vtrnd_modevent(module_t, int, void *); @@ -59,6 +63,7 @@ static int vtrnd_modevent(module_t, int, void *); static int vtrnd_probe(device_t); static int vtrnd_attach(device_t); static int vtrnd_detach(device_t); +static int vtrnd_shutdown(device_t); static int vtrnd_negotiate_features(struct vtrnd_softc *); static int vtrnd_setup_features(struct vtrnd_softc *); @@ -86,6 +91,7 @@ static device_method_t vtrnd_methods[] = { DEVMETHOD(device_probe, vtrnd_probe), DEVMETHOD(device_attach, vtrnd_attach), DEVMETHOD(device_detach, vtrnd_detach), + DEVMETHOD(device_shutdown, vtrnd_shutdown), DEVMETHOD_END }; @@ -160,6 +166,16 @@ vtrnd_attach(device_t dev) error = EEXIST; goto fail; } + + sc->eh = EVENTHANDLER_REGISTER(shutdown_post_sync, + vtrnd_shutdown, dev, SHUTDOWN_PRI_LAST + 1); /* ??? */ + if (sc->eh == NULL) { + device_printf(dev, "Shutdown event registration failed\n"); + error = ENXIO; + goto fail; + } + + sc->inactive = false; random_source_register(&random_vtrnd); fail: @@ -179,11 +195,27 @@ vtrnd_detach(device_t dev) atomic_load_explicit(&g_vtrnd_softc, memory_order_acquire) == sc, ("only one global instance at a time")); + sc->inactive = true; + if (sc->eh != NULL) { + EVENTHANDLER_DEREGISTER(shutdown_post_sync, sc->eh); + sc->eh = NULL; + } random_source_deregister(&random_vtrnd); atomic_store_explicit(&g_vtrnd_softc, NULL, memory_order_release); return (0); } +static int +vtrnd_shutdown(device_t dev) +{ + struct vtrnd_softc *sc; + + sc = device_get_softc(dev); + sc->inactive = true; + + return(0); +} + static int vtrnd_negotiate_features(struct vtrnd_softc *sc) { @@ -235,6 +267,9 @@ vtrnd_harvest(struct vtrnd_softc *sc, void *buf, size_t *sz) _Static_assert(sizeof(value) < PAGE_SIZE, "sglist assumption"); + if (sc->inactive) + return (EDEADLK); + sglist_init(&sg, 1, segs); error = sglist_append(&sg, value, *sz); if (error != 0)