From nobody Fri May 13 23:47:53 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 3525D1ADEFF7; Fri, 13 May 2022 23:47:54 +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 4L0QLf0vFLz3vcR; Fri, 13 May 2022 23:47:54 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1652485674; 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=XGxz7QuZz+HmpadhKCGw/wKOtijQsowraX6OPF2EZIE=; b=YEI6pQTVjXQgowF+UOz/+xKjBgTT9q4UKi1lA7sFndt1B9nMwGkRPV9Q3AaDfCiFArzFtt vO+VKsqP+bqStri21LX7q1uoZpF+jnS40AdwPVfMpnhvvBJJenM7o4dDtTcvfOhWpCZC2w myn3ndUxU0VCkC2WlADtwO991mW7Z16z4BdGt7emhhcIvUwSKYoTQYg/jkJeC9oLEKO2bn +3kIUQxBKuWBt9ujdJbSyfTQfNOFUe7zxrDDIhb3+YYc+vKe4x3fmvozWIFc1GDi2CEMcl bLrUAADkYWbIEx87diGHzTQi2fDRWRQXLbLP/ZMv239f09nZpnnaGqO0mBtZ+A== 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 E19204631; Fri, 13 May 2022 23:47:53 +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 24DNlrjE046309; Fri, 13 May 2022 23:47:53 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 24DNlr7M046308; Fri, 13 May 2022 23:47:53 GMT (envelope-from git) Date: Fri, 13 May 2022 23:47:53 GMT Message-Id: <202205132347.24DNlr7M046308@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: 59aad2819456 - stable/13 - destroy_dev_sched*: Don't hold Giant for all deferred destroy_dev. 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: jhb X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 59aad28194568efbcb34c6054bcb62fbc0524e5b Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1652485674; 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=XGxz7QuZz+HmpadhKCGw/wKOtijQsowraX6OPF2EZIE=; b=ci1NeTJ4H4rRUp7WXlG+uqkODI6S9FNUbiRxrloTQbsv0JzaMdCzqSJG68y7+wFgv6ZNSr e6OCtCSpNlCe/9gXkhqggtejnJfbHMlb2Ouf4cwYnmnMzN7CqKuP1OiIq4zY5P3CmNSDZK VBaNUzF3xF1RIdifvOxxcAvAiSEsvhEksuXtJh0HArD0MTo2ZHGXGFV/SonESZSCADWkjc 1suG4hcrd3/EaqwAw2C6utntG/km624aFe2Ymold3+TLpI7XGub++Y8I7DY5OPSdhMw5WT 9vbH0MyLn/iMwxSGqcgempvJaS/gRODvMSNVNK2PwLybRRG5WvE7ofKLoZdLZg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1652485674; a=rsa-sha256; cv=none; b=lGWYax/LSFiYGXd3CPdRpEqyMMCkC4ei2jQ9dSSaAg7259cgefJZdUEO0/dCQ3lRMum7A+ uRiwjhbJIoXwGw5pclQJ3YpVd52pUrBG6ogVrKc1dLgJJfWfRGQcP21fSPID3qwURL6XbU /1Hem1KursIH+/WqIg9eZY53v87NM2CBQ/ioJNHFJbP3cBF8el1sRoU+8CzdqT4+8f3t9E zeqCYEyiJyT1G+3qElnYNhYmGMjj/oIVKbE8PSxYIBn066QuFculPLZNDkz2N9cfU7Bq3c CQNjctTSljsOeM9PWoH+uzLGxeD16OilH/f3May+s+09t8SjgOu2s6yfXf8OIg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=59aad28194568efbcb34c6054bcb62fbc0524e5b commit 59aad28194568efbcb34c6054bcb62fbc0524e5b Author: John Baldwin AuthorDate: 2022-04-18 19:04:30 +0000 Commit: John Baldwin CommitDate: 2022-05-13 22:55:03 +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 (cherry picked from commit d139909d6e8d540c0b832554d1b77fef0cf215b6) --- 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); }