From nobody Sat Mar 19 12:38:22 2022 X-Original-To: dev-commits-src-all@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 1DC121A29354; Sat, 19 Mar 2022 12:38:23 +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 4KLL5W0Hv0z51mc; Sat, 19 Mar 2022 12:38:23 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1647693503; 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=eC/sJtdf+XVcSr9ozdCPYy1PkPQXHDo4pJcqg19A9TU=; b=SgUkEexGt/lxvnrg8Yh70LT3eXEPN9TqAvR5xl5j5VKc6EajbhCNsHvwi0Q5LeiDA0uL9r TEGPbYQ9umQ+1Wecwn5rjCvCdQ/WmHvzCuYGRfV60/6fVH3FFdVYTogAvdsFI2XHJjN3N2 kcies12k3kfk0T9uQkepR1Ji/MyQ0CBcQ6SG/DzyH1TXpLgae9lkrBngoQk+ULl/gQl/cz kHYA/X9M39aE4FPXqeudXV+Y4nXcLqddEhh89S78fGIqjWlHcmMSlv4ePix1rguWVoHI+j CuCMlZQIIRo77LF/TnLk7+M8MUx+K68E8PIZPe5287L/PNDmnOB8UWqXdbtSdw== 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 DA5EA13753; Sat, 19 Mar 2022 12:38:22 +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 22JCcMmw073981; Sat, 19 Mar 2022 12:38:22 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 22JCcMQU073980; Sat, 19 Mar 2022 12:38:22 GMT (envelope-from git) Date: Sat, 19 Mar 2022 12:38:22 GMT Message-Id: <202203191238.22JCcMQU073980@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: fa67c45842bb - releng/13.1 - virtio_random(8): MFC: avoid deadlock at shutdown time (regression fix) List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@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/releng/13.1 X-Git-Reftype: branch X-Git-Commit: fa67c45842bb5d34780a536b1bff1ac64f381562 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1647693503; 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=eC/sJtdf+XVcSr9ozdCPYy1PkPQXHDo4pJcqg19A9TU=; b=H7T5vLQKcTCE5NSQ5Qy8XtRdJzrC75Q+VgLcL5wTXAY7wc7aPfNZidsQP/k8QCbgFLQIUv CCU6bHIoitZAooaBQ1/4fgr+jLztzupJBxF6a9+3KX4GBKETGAVT71tPVfVFnEPZJL1tVV YG248urm7uMmKdKh2zIxtCEyIoHi2KpuSq0RPFfVIH3YBAzpfMWVlnE/7oA3rKdSbrJmo0 0HWAkSMRT4nLIL2hS5DS2yuYUtX4WW3MaGJ2R6fYoUrSC83+v2qPNAiFB5hoFCioAaDxab xC2cokzh5C91IUWEY5Pqiq3WTgWoa+kXP2VDcm04RJ9kMbzydnmHsbQVQWHvpQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1647693503; a=rsa-sha256; cv=none; b=wf94jk66a2AIakYZX3CNhjCO6z3vt0TK+AO9+GRlFNN/hveiX+XfjcINxYX6qLonqOkfyM AlF4NEDZYzJ9OhswY9Nrucm6rApY6aYEi8t9dDkksN+Tou5ac4qwsnCKPlFd2mfWp+w6bQ 3ENzhL3+wswC05oJB82Uz5Vtn35Ihq/4oZ/EL4W0kTfCIuuU44hjn9jOfLIUbQqFaxtxDd K6zGhQKiq466uqSIWR49qxtUIEBxY3g+IXQcL4Wy5sIm7bSFFIJNUVwGxVdo82faPar1Lm D7JkGOQYiB/oPo6HeVu6joSpXqFuOxr17KNGK/1TSzS0NZwlGVsdX9b5U1zZFQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch releng/13.1 has been updated by eugen: URL: https://cgit.FreeBSD.org/src/commit/?id=fa67c45842bb5d34780a536b1bff1ac64f381562 commit fa67c45842bb5d34780a536b1bff1ac64f381562 Author: Eugene Grosbein AuthorDate: 2022-03-16 04:41:51 +0000 Commit: Eugene Grosbein CommitDate: 2022-03-19 12:36:26 +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 Approved by: re (gjb) (cherry picked from commit adbf7727b3a2aad3c2faa6e543ee7fa7a6c9a3d5) (cherry picked from commit 4a11315a2c3fc55333772f48aaef32ae1eb11ceb) --- 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)