From nobody Fri Jan 24 15:08:25 2025 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 4Yfh5j6Dnmz5lX30; Fri, 24 Jan 2025 15:08:25 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Yfh5j5jW9z3jY3; Fri, 24 Jan 2025 15:08:25 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737731305; 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=w5VavZ0tpP5BeHhfLGZKAFTeAvBVV160a5fgN5EDSNg=; b=YmVBEYPq6jQkA4UzySiuwymwjmyWH6f4rm8br1tMQUDSl8yjKi8AEF128emKlwQs5ns9zz n0bV5XehWCEcfD6oguIj6PXPbhzOZVcr9Mm6EqlGWxZzse1xz3+6EGxrjADaVkxbzE5FnH UeP2pp8UjbpAt+uRKtBboaIVUKedAt7vRVTANZp3T/oKnbCOuytc9jTyQMwKaiXXJLvteO 5X22byE2Pp2fBla1CSs41xeCmo/CTHiH3sRUtNLd7cm8Fslnw+10vW0zOYr/L3MM4HNuBP ba5+kTkEYinVnk6z8SGJSNrwQDrpAbFZYATQTPN/N5OSQBicASdEvAbVAvXqaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737731305; 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=w5VavZ0tpP5BeHhfLGZKAFTeAvBVV160a5fgN5EDSNg=; b=WJVsJkWdAqKaJ3jdn5PQaxJEAjpiya5M9ZXv2p4ibLkJPA+fApAkrYC8g5UWiAzfQOjrAY ZzhCNfRjK1aym4jsRg//l8s4Fa8+MY12e9AXWzGeazgcok7VZB3wmKwn+QrhaavSaNIh9c noXYb61/BJ+gu8SsYLdFcOTg3qhaqUQ2LAxKzKZgBLBjsDwi1Edg7K1c8aG6A3n4aHiY7q 3q92XdlSh4zXCZiWjA1v4bO4GnzB+MqksJPisX/orSehCVh2L9Nvx6g9A8x+3OrtAL4lX/ 7dobfuRs9Gxqum0qSebBYRIfyg43a6pc3z5wcoF70aqJ5eVn3U6tahMokWrMtw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1737731305; a=rsa-sha256; cv=none; b=B9WhOG/oLA24Gn9JD+mlvm3DuKS0AZUK8CuYz4lm1WBf+psQgeAgvv3DPoxUBo59NMslD4 //vxSnERO6senxyHHsinUSl9J+NisFsIIPR9fBmzKdtm/pD7wf7qdrS8rqn7xcedb7FTNo 215CV3L8QZpeaANGy/Bj/XWgg5aw1u3dPf3LG9UQ/hvEsZzc4PUqeS+g6bsjdps3koeZFS fWqWbOeQlluK4k75PQ/3JIs3pjCm+B+Q1O2b1NuSI7tUF3fEfnJPeu8+AtFTn7Z+qLhs09 8GzGaYh+SQGZmSf+AE6sCj2ywU23PTTr6wfM0lPTFBIICHEUSMtRp3MNm7dUTg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none 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 4Yfh5j5962zV0h; Fri, 24 Jan 2025 15:08:25 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 50OF8PdN064573; Fri, 24 Jan 2025 15:08:25 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 50OF8PF4064570; Fri, 24 Jan 2025 15:08:25 GMT (envelope-from git) Date: Fri, 24 Jan 2025 15:08:25 GMT Message-Id: <202501241508.50OF8PF4064570@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: 0863dc10354f - main - ithread: Allow some ithreads to sleep 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: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 0863dc10354ff458a3ddf8ef3b47044d7a615154 Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=0863dc10354ff458a3ddf8ef3b47044d7a615154 commit 0863dc10354ff458a3ddf8ef3b47044d7a615154 Author: Andrew Turner AuthorDate: 2025-01-13 05:35:27 +0000 Commit: Andrew Turner CommitDate: 2025-01-24 15:08:09 +0000 ithread: Allow some ithreads to sleep Some ithreads need to hold a sleep mutex, e.g. when calling ACPI methods. Allow ithreads to be marked as sleepable when this is known to be safe. Reviewed by: markj, jhb Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D48283 --- share/man/man9/intr_event.9 | 10 +++++++++- sys/kern/kern_intr.c | 18 +++++++++++++----- sys/sys/bus.h | 1 + sys/sys/interrupt.h | 1 + 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/share/man/man9/intr_event.9 b/share/man/man9/intr_event.9 index d1964ce289a5..ba8faf877e6a 100644 --- a/share/man/man9/intr_event.9 +++ b/share/man/man9/intr_event.9 @@ -27,7 +27,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd October 30, 2022 +.Dd January 24, 2025 .Dt INTR_EVENT 9 .Os .Sh NAME @@ -295,6 +295,14 @@ from the handler's source triggers. Presently, the .Dv INTR_ENTROPY flag is not valid for software interrupt handlers. +The +.Dv INTR_SLEEPABLE +flag specifies that the interrupt ithread may sleep. +Presently, the +.Dv INTR_SLEEPABLE +flag requires the +.Dv INTR_EXCL +flag to be set. .Ss Handler Callbacks Each .Vt struct intr_event diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c index ad0cc135167e..4ef37ac829b3 100644 --- a/sys/kern/kern_intr.c +++ b/sys/kern/kern_intr.c @@ -610,6 +610,12 @@ intr_event_add_handler(struct intr_event *ie, const char *name, if (ie == NULL || name == NULL || (handler == NULL && filter == NULL)) return (EINVAL); + if ((flags & INTR_SLEEPABLE) != 0 && (flags & INTR_EXCL) == 0) { + printf("%s: INTR_SLEEPABLE requires INTR_EXCL to be set\n", + __func__); + return (EINVAL); + } + /* Allocate and populate an interrupt handler structure. */ ih = malloc(sizeof(struct intr_handler), M_ITHREAD, M_WAITOK | M_ZERO); ih->ih_filter = filter; @@ -627,16 +633,18 @@ intr_event_add_handler(struct intr_event *ie, const char *name, if (flags & INTR_TYPE_NET) ih->ih_flags |= IH_NET; - /* We can only have one exclusive handler in a event. */ + /* We can only have one exclusive or sleepable handler in a event. */ mtx_lock(&ie->ie_lock); if (!CK_SLIST_EMPTY(&ie->ie_handlers)) { - if ((flags & INTR_EXCL) || + if ((flags & (INTR_EXCL | INTR_SLEEPABLE)) || (CK_SLIST_FIRST(&ie->ie_handlers)->ih_flags & IH_EXCLUSIVE)) { mtx_unlock(&ie->ie_lock); free(ih, M_ITHREAD); return (EINVAL); } } + if (flags & INTR_SLEEPABLE) + ie->ie_flags |= IE_SLEEPABLE; /* Create a thread if we need one. */ while (ie->ie_thread == NULL && handler != NULL) { @@ -1190,11 +1198,11 @@ static void ithread_execute_handlers(struct proc *p, struct intr_event *ie) { - /* Interrupt handlers should not sleep. */ - if (!(ie->ie_flags & IE_SOFT)) + /* Only specifically marked sleepable interrupt handlers can sleep. */ + if (!(ie->ie_flags & (IE_SOFT | IE_SLEEPABLE))) THREAD_NO_SLEEPING(); intr_event_execute_handlers(p, ie); - if (!(ie->ie_flags & IE_SOFT)) + if (!(ie->ie_flags & (IE_SOFT | IE_SLEEPABLE))) THREAD_SLEEPING_OK(); /* diff --git a/sys/sys/bus.h b/sys/sys/bus.h index 8b32e10f1285..84df9e6956d3 100644 --- a/sys/sys/bus.h +++ b/sys/sys/bus.h @@ -277,6 +277,7 @@ enum intr_type { INTR_EXCL = 256, /* exclusive interrupt */ INTR_MPSAFE = 512, /* this interrupt is SMP safe */ INTR_ENTROPY = 1024, /* this interrupt provides entropy */ + INTR_SLEEPABLE = 2048, /* this interrupt handler can sleep */ INTR_MD1 = 4096, /* flag reserved for MD use */ INTR_MD2 = 8192, /* flag reserved for MD use */ INTR_MD3 = 16384, /* flag reserved for MD use */ diff --git a/sys/sys/interrupt.h b/sys/sys/interrupt.h index 899d65e386e0..2e84faa78e38 100644 --- a/sys/sys/interrupt.h +++ b/sys/sys/interrupt.h @@ -129,6 +129,7 @@ struct intr_event { /* Interrupt event flags kept in ie_flags. */ #define IE_SOFT 0x000001 /* Software interrupt. */ +#define IE_SLEEPABLE 0x000002 /* Sleepable ithread */ #define IE_ADDING_THREAD 0x000004 /* Currently building an ithread. */ /* Flags to pass to swi_sched. */