From nobody Mon Apr 18 19:06:04 2022 X-Original-To: dev-commits-src-main@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 EBF6911D480C; Mon, 18 Apr 2022 19:06:04 +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 4KhxH06CQfz4RSM; Mon, 18 Apr 2022 19:06:04 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1650308764; 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=e20oZDitilsfH4LVbN34hjpJP6kwtUbU1mus+KvWVQw=; b=UUG5u+K3Jdv1g1qQwjlBZ8+w1l0Hr4FJX/3vgyg0TWmFq9gEj+kJnqvL6xIqfum3ZoX9GX 1eN4Z5Ink8tIdO9Bxseq7iku5qOacfDqcXAHzjxnRVSmJDGvXzikCjeV7JXfKdGJ3PBEN6 R+55clx2MikvVaFdKiXN4PFDAinU4lYmYvAjVCMnNkfG6iPtvJR0dTfr4IH3OBy7XZzd5O FqrHmN0ZJ/N1bR9PqE6yUomzOQpq8K9QU9VH31riCfdNHWhmFOYrMFnYWPqpySYjGtaczO NEdLv3Ks/ppXmBRnIdMHe90FTUV3rwSJjqVgvEJ/G5cn3WokUFyerzcYA+4Vbg== 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 B658D188D3; Mon, 18 Apr 2022 19:06:04 +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 23IJ642J089331; Mon, 18 Apr 2022 19:06:04 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 23IJ6459089330; Mon, 18 Apr 2022 19:06:04 GMT (envelope-from git) Date: Mon, 18 Apr 2022 19:06:04 GMT Message-Id: <202204181906.23IJ6459089330@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: d139909d6e8d - main - destroy_dev_sched*: Don't hold Giant for all deferred destroy_dev. List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: d139909d6e8d540c0b832554d1b77fef0cf215b6 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1650308764; 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=e20oZDitilsfH4LVbN34hjpJP6kwtUbU1mus+KvWVQw=; b=GOIRRFja+ziEQ8U0iFXrQPUG9H89EPjrsAg46CeCflF2+vFZI6/YT4Q73Nf0hyXuXfVnD+ RiQ0f3CsBDItVa6CVPqpipw5vto6iQt46V3mKzlHb1Mma+KYMj2Esh8bPMG7umSO9TMaR6 IOyvb7U1HJ5ClVE0TSUoSnQSx3omjQo/MBgkk7B6cSo3Lf8G86ezYJEK6+PjmE2RwRrK0V kV47k6NnnTD/ZXUng69ACCFI3kbOkv6POJcwYDChzXhjVDwDnix5yBofYwfz3rNh/KiQVf zBKNHW4JBRaUxQhNlxc1JQxbxl0tGeZ5VLdxWUFEsBKVVyk+5wLTGiPXWzo2ZA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1650308764; a=rsa-sha256; cv=none; b=dso6+zOyW8AL4DjB9j09pTyj0TGzjBpK7zltfPe9VKA5sXvTJk44w8mzMPzPDLde4C7BeJ yM6WYKcctI0RM93+mL0HSHKlVBJLfrKTiJNb98j8gNuwVPxEQi5yOKzBjGZ1QQxxS3RDLb OHybgcxIdYBequs0yk3tUELIW3U4IgBfoCI+VbCsUkSnSEssiaZHVORwIQ4QZ1Qz4j+ViT Ydnp8iXiNrtyCKpXXr/yXizWO8PW63j+t62tDAMXrOeRnI5RYu2S7rSogVeLkpsMf2FAEd v/fn11fY24taPFe3HBwxjrpXI1lPc09EAwXEtOjEiJC0bvH6k8ghr5hJz73iGQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=d139909d6e8d540c0b832554d1b77fef0cf215b6 commit d139909d6e8d540c0b832554d1b77fef0cf215b6 Author: John Baldwin AuthorDate: 2022-04-18 19:04:30 +0000 Commit: John Baldwin CommitDate: 2022-04-18 19:04:30 +0000 destroy_dev_sched*: Don't hold Giant for all deferred destroy_dev. Rather than using taskqueue_swi_giant which holds Giant for all deferred destroy_dev calls, create a separate queue for destroyed devices with D_NEEDGIANT set in the corresponding cdevsw. The task for this queue holds Giant whild destroying deferred devices while the task for the default queue does not hold Giant. In addition, switch to taskqueue_thread for destroy_dev_sched. Deferred destroy_dev requests don't need to run at an SWI priority. Reviewed by: imp, markj MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D34915 --- sys/kern/kern_conf.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index cb575114571a..f6724095c762 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -58,6 +58,7 @@ static void destroy_devl(struct cdev *dev); static int destroy_dev_sched_cbl(struct cdev *dev, void (*cb)(void *), void *arg); static void destroy_dev_tq(void *ctx, int pending); +static void destroy_dev_tq_giant(void *ctx, int pending); static int make_dev_credv(int flags, struct cdev **dres, struct cdevsw *devsw, int unit, struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt, va_list ap); @@ -1428,23 +1429,28 @@ clone_cleanup(struct clonedevs **cdp) static TAILQ_HEAD(, cdev_priv) dev_ddtr = TAILQ_HEAD_INITIALIZER(dev_ddtr); -static struct task dev_dtr_task = TASK_INITIALIZER(0, destroy_dev_tq, NULL); +static TAILQ_HEAD(, cdev_priv) dev_ddtr_giant = + TAILQ_HEAD_INITIALIZER(dev_ddtr_giant); +static struct task dev_dtr_task = TASK_INITIALIZER(0, destroy_dev_tq, &dev_ddtr); +static struct task dev_dtr_task_giant = TASK_INITIALIZER(0, destroy_dev_tq_giant, + &dev_ddtr_giant); static void destroy_dev_tq(void *ctx, int pending) { + TAILQ_HEAD(, cdev_priv) *ddtr = ctx; struct cdev_priv *cp; struct cdev *dev; void (*cb)(void *); void *cb_arg; dev_lock(); - while (!TAILQ_EMPTY(&dev_ddtr)) { - cp = TAILQ_FIRST(&dev_ddtr); + while (!TAILQ_EMPTY(ddtr)) { + cp = TAILQ_FIRST(ddtr); dev = &cp->cdp_c; KASSERT(cp->cdp_flags & CDP_SCHED_DTR, ("cdev %p in dev_destroy_tq without CDP_SCHED_DTR", cp)); - TAILQ_REMOVE(&dev_ddtr, cp, cdp_dtr_list); + TAILQ_REMOVE(ddtr, cp, cdp_dtr_list); cb = cp->cdp_dtr_cb; cb_arg = cp->cdp_dtr_cb_arg; destroy_devl(dev); @@ -1457,6 +1463,14 @@ destroy_dev_tq(void *ctx, int pending) dev_unlock(); } +static void +destroy_dev_tq_giant(void *ctx, int pending) +{ + mtx_lock(&Giant); + destroy_dev_tq(ctx, pending); + mtx_unlock(&Giant); +} + /* * devmtx shall be locked on entry. devmtx will be unlocked after * function return. @@ -1465,6 +1479,7 @@ static int destroy_dev_sched_cbl(struct cdev *dev, void (*cb)(void *), void *arg) { struct cdev_priv *cp; + bool need_giant; dev_lock_assert_locked(); cp = cdev2priv(dev); @@ -1476,9 +1491,16 @@ destroy_dev_sched_cbl(struct cdev *dev, void (*cb)(void *), void *arg) cp->cdp_flags |= CDP_SCHED_DTR; cp->cdp_dtr_cb = cb; cp->cdp_dtr_cb_arg = arg; - TAILQ_INSERT_TAIL(&dev_ddtr, cp, cdp_dtr_list); + need_giant = (dev->si_devsw->d_flags & D_NEEDGIANT) != 0; + if (need_giant) + TAILQ_INSERT_TAIL(&dev_ddtr_giant, cp, cdp_dtr_list); + else + TAILQ_INSERT_TAIL(&dev_ddtr, cp, cdp_dtr_list); dev_unlock(); - taskqueue_enqueue(taskqueue_swi_giant, &dev_dtr_task); + if (need_giant) + taskqueue_enqueue(taskqueue_thread, &dev_dtr_task_giant); + else + taskqueue_enqueue(taskqueue_thread, &dev_dtr_task); return (1); }