From nobody Fri Apr 14 14:01:02 2023 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 4PydQR2sNCz45JYT; Fri, 14 Apr 2023 14:01:03 +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 4PydQQ1nxVz3K5r; Fri, 14 Apr 2023 14:01:02 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1681480862; 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=++huD+x6dgMVadl1lf0sBRMCEo9YXAf4Rr/xA4zCy3k=; b=nFroxVeTeCaaH5KIYVZ8Mlub2grnnvheWcz4FL3lQe/BX9SCP/D6I8SgHly5QKpJsO/Zmx oCc6qIdgV5YpooYBgh+1OaU6zNjC0MMTWOOeNipCvthAWOO5QHJWB2nb6Ds62GdGlTDan/ 9oVwrvGG8cmcHOuRIE9TL3C9c7u00nJb6W3vmEZ4vjMHYlNMV2X1Cuw9602sErSu77yc9u 08C0g/V8HB0ohWmdERcuUTvnL9L2w7mmuAJfnUUNWY3cQCqcitLbhTZzVt2DqE+80R/R/N 6/j2Gu49JyEvoy+U8Lp1KaoEjpeP6DAt466sdFecgob8LYQRh+S0z6BWwqZ4fw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1681480862; 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=++huD+x6dgMVadl1lf0sBRMCEo9YXAf4Rr/xA4zCy3k=; b=vTroxnHh2K7q/38Vnrr+EEvEGhB8z3fWl8snVrd5UV4DWbZcGqrLRO+7RMh3c0PdpMfXrl MeNnpb/bnksD/rDmZRWc28vBJPbTqPw1z7lI2w886c2rHEoQZMnR4+mim/XGORMGHFCkaL FphtUkPzxujgySlEsISK2cs9f4bBancgq6JodFgAJbyLiuDx0Pl0lPwAk373WDalD/aK9B LjLvX/cEpNFOrWyWArG7WiHuj9sbabeOytpFzj8hLodJA+rt0aAau3fI2AjRMKX+UWy+Lj +RkeWsl7IX2Mnpmvc0+rNp86Kq6SkK0F1dEl3CnXE5RGKIY8gIuOXoqKboFexQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1681480862; a=rsa-sha256; cv=none; b=L0Hs99zDk780LASC9a4oDpQLDCsmGtspX6PvMh8okhOGvthHklEx9r3cG+Ik8KR9+Z+lK0 8DyBS0MQryU1+PVfbo8ZoCX1qyxLOR4OQCINyFOo2kRlyOIL1EhOGXSjHJaEVUwR/dUKP4 l4HO5FDvEWrz/7D4wgX5yDIlXNTNk4M5fNq2+7llz+1iWQ1NvQUqrYmCwDgckBR7Q9j8Jk offgIaQhMbCVwIrFq5ZCfU3rSb8M2KYE9gulrIlwc+/TvmxQFkNXZ8D+yyvURHs2wK9kji JlPXYiIjnxAfUeLOyyca2UdWuqfbHh+/nXm9FEzUXZNbQAuCzR9nMIXJPwH9UA== 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 4PydQQ0ty4zRSx; Fri, 14 Apr 2023 14:01:02 +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 33EE12h9083910; Fri, 14 Apr 2023 14:01:02 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 33EE12E0083909; Fri, 14 Apr 2023 14:01:02 GMT (envelope-from git) Date: Fri, 14 Apr 2023 14:01:02 GMT Message-Id: <202304141401.33EE12E0083909@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: =?utf-8?Q?Roger=20Pau=20Monn=C3=A9?= Subject: git: d0a69069bb22 - main - xen/x86: rework isrc allocation to use list instead of table scanning 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: royger X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: d0a69069bb22316319835fbabf1a713c381878b8 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by royger: URL: https://cgit.FreeBSD.org/src/commit/?id=d0a69069bb22316319835fbabf1a713c381878b8 commit d0a69069bb22316319835fbabf1a713c381878b8 Author: Elliott Mitchell AuthorDate: 2021-10-13 23:13:53 +0000 Commit: Roger Pau Monné CommitDate: 2023-04-14 13:58:54 +0000 xen/x86: rework isrc allocation to use list instead of table scanning Scanning the list of interrupts to find an unused entry is rather inefficient. Instead overlay a free list structure and use a list instead. This also has the useful effect of removing the last use of evtchn_type values outside of xen_intr.c. Reviewed by: royger [royger] - Make avail_list static. --- sys/x86/xen/xen_intr.c | 76 +++++++++++++++++++------------------------------- 1 file changed, 29 insertions(+), 47 deletions(-) diff --git a/sys/x86/xen/xen_intr.c b/sys/x86/xen/xen_intr.c index e23a021c069b..fe4a4b0f4dce 100644 --- a/sys/x86/xen/xen_intr.c +++ b/sys/x86/xen/xen_intr.c @@ -74,9 +74,6 @@ static MALLOC_DEFINE(M_XENINTR, "xen_intr", "Xen Interrupt Services"); * Lock for x86-related structures. Notably modifying * xen_intr_auto_vector_count, and allocating interrupts require this lock be * held. - * - * ->xi_type == EVTCHN_TYPE_UNBOUND indicates a xenisrc is under control of - * this lock and operations require it be held. */ static struct mtx xen_intr_x86_lock; @@ -165,6 +162,18 @@ static struct mtx xen_intr_isrc_lock; static u_int xen_intr_auto_vector_count; static struct xenisrc *xen_intr_port_to_isrc[NR_EVENT_CHANNELS]; +/* + * list of released isrcs + * This is meant to overlay struct xenisrc, with only the xen_arch_isrc_t + * portion being preserved, everything else can be wiped. + */ +struct avail_list { + xen_arch_isrc_t preserve; + SLIST_ENTRY(avail_list) free; +}; +static SLIST_HEAD(free, avail_list) avail_list = + SLIST_HEAD_INITIALIZER(avail_list); + /*------------------------- Private Functions --------------------------------*/ /** @@ -242,48 +251,6 @@ evtchn_cpu_unmask_port(u_int cpu, evtchn_port_t port) xen_set_bit(port, pcpu->evtchn_enabled); } -/** - * Search for an already allocated but currently unused Xen interrupt - * source object. - * - * \param type Restrict the search to interrupt sources of the given - * type. - * - * \return A pointer to a free Xen interrupt source object or NULL. - */ -static struct xenisrc * -xen_intr_find_unused_isrc(enum evtchn_type type) -{ - int isrc_idx; - - mtx_assert(&xen_intr_x86_lock, MA_OWNED); - - for (isrc_idx = 0; isrc_idx < xen_intr_auto_vector_count; isrc_idx ++) { - struct xenisrc *isrc; - u_int vector; - - vector = first_evtchn_irq + isrc_idx; - isrc = (struct xenisrc *)intr_lookup_source(vector); - /* - * Since intr_register_source() must be called while unlocked, - * isrc == NULL *will* occur, though very infrequently. - * - * This also allows a very small gap where a foreign intrusion - * into Xen's interrupt range could be examined by this test. - */ - if (__predict_true(isrc != NULL) && - __predict_true(isrc->xi_arch.intsrc.is_pic == - &xen_intr_pic) && - isrc->xi_type == EVTCHN_TYPE_UNBOUND) { - KASSERT(isrc->xi_arch.intsrc.is_handlers == 0, - ("Free evtchn still has handlers")); - isrc->xi_type = type; - return (isrc); - } - } - return (NULL); -} - /** * Allocate a Xen interrupt source object. * @@ -301,9 +268,18 @@ xen_intr_alloc_isrc(enum evtchn_type type) int error; mtx_lock(&xen_intr_x86_lock); - isrc = xen_intr_find_unused_isrc(type); + isrc = (struct xenisrc *)SLIST_FIRST(&avail_list); if (isrc != NULL) { + SLIST_REMOVE_HEAD(&avail_list, free); mtx_unlock(&xen_intr_x86_lock); + + KASSERT(isrc->xi_arch.intsrc.is_pic == &xen_intr_pic, + ("interrupt not owned by Xen code?")); + + KASSERT(isrc->xi_arch.intsrc.is_handlers == 0, + ("Free evtchn still has handlers")); + + isrc->xi_type = type; return (isrc); } @@ -369,8 +345,14 @@ xen_intr_release_isrc(struct xenisrc *isrc) /* not reachable from xen_intr_port_to_isrc[], unlock */ mtx_unlock(&xen_intr_isrc_lock); + _Static_assert(sizeof(struct xenisrc) >= sizeof(struct avail_list), + "unused structure MUST be no larger than in-use structure"); + _Static_assert(offsetof(struct xenisrc, xi_arch) == + offsetof(struct avail_list, preserve), + "unused structure does not properly overlay in-use structure"); + mtx_lock(&xen_intr_x86_lock); - isrc->xi_type = EVTCHN_TYPE_UNBOUND; + SLIST_INSERT_HEAD(&avail_list, (struct avail_list *)isrc, free); mtx_unlock(&xen_intr_x86_lock); return (0); }