From nobody Wed Mar 29 07:52:36 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 4Pmf0h5JbYz42B0H; Wed, 29 Mar 2023 07:52:36 +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 4Pmf0h4NPFz3Pyj; Wed, 29 Mar 2023 07:52:36 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1680076356; 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=/uy8IXH6bZJyIL0Z1EmtKNnQUEfZyOrIT4oNn4nNiZ0=; b=b+Ig/iEnKYKmm7h7fdav4C55FYeFeQqrf+fejT++EOFXmZVgcgD0+ws0S6KIlZNZ7CcKWC Qkk5TvafKxv1hxLCMpW+OyLkjpIIvAkoLn+wd0dj3bkl8Veby5+keALCRpayqGb8hD0IVp wxweqC8BZafMO3DbYOiC2Ni0pbOvAVobBgU+wvr9YVobhEKlk720yJgEcU9P3m19yo1eIm deukCwybsdJj7qaBPMXoV+82HTjSSUGNgHGsuhiOkH6AFMkWAuYSwfEih0skWnyq0ZvXcb qeOvR9cklY02bAfA7ix7WngrsZNfSJBsvOjNN0RY2S0y8pLO21dcYqu7PSrMLw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1680076356; 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=/uy8IXH6bZJyIL0Z1EmtKNnQUEfZyOrIT4oNn4nNiZ0=; b=XHuqUNzncBct8z2GCF9AIavipICZQ7nRWKa+FiPTjJF04Whd4ftNoUcANRVBENh3QQom1b DaKA/X+ciJWuAdf7dpcCB0fHkWgFX6Ly7yzwOVubhhOJQrAW4kaSZ6l21AMKdrbdhsBUMa ZmtadBgG/nH4ljMwy9VsQs/7n/pGrd+id1kyyBi+AlEuvG8TC/qIVmUv3dQ7fV4zRE4oKO 2EeQUtz0V5IfXIHRKC6XhLW35TdGkKTHkxzMdIfw+PwDvE1UdPAuq1aRzaQ57nVZ2hL/LB xDS4hezuKCLaFz3sh6Fx7PDFJ7GlhYi9SWUKw2ItQkXzRPbGldRbzRy7OHylKw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1680076356; a=rsa-sha256; cv=none; b=dx3EtyQQaX7SvzhX1TOhYAih2ztRJRNdeFlEhGiq3ADyNyIW7Th4RuQ7Zga/aCtaPSMwL9 Pn56S3kQ8FFPJUDwc6taD3cCiRMmRKgwUKLD4fftn+axLp7z6wrGPhPhzRyjSDjtGs/w/a CFvyWcits34t8LsOyioSlVPp4v0sFf8iKQkYUnbwvmJWROhBTR7OkF46H0vu1MuMxqMxA+ 03tiZlDEe+PBDfKGvD4+eMl0JVjciquZOfJYu1f9NcEEg16guY7YVC7I82Y+TNc0Ttndex 0wWn0bi1rVM6LcvfYCDPbRjJ1TySB8NBrtwCG5WfoQmPfge+C7q2OvUYAhvlbA== 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 4Pmf0h3HrmzN6P; Wed, 29 Mar 2023 07:52:36 +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 32T7qab3052168; Wed, 29 Mar 2023 07:52:36 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 32T7qaEZ052167; Wed, 29 Mar 2023 07:52:36 GMT (envelope-from git) Date: Wed, 29 Mar 2023 07:52:36 GMT Message-Id: <202303290752.32T7qaEZ052167@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: b94341afcb12 - main - xen/intr: rework xen_intr_resume() for in-place remapping 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: b94341afcb12dac74825ac6fb140e2819760b00d Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by royger: URL: https://cgit.FreeBSD.org/src/commit/?id=b94341afcb12dac74825ac6fb140e2819760b00d commit b94341afcb12dac74825ac6fb140e2819760b00d Author: Elliott Mitchell AuthorDate: 2021-06-01 01:34:33 +0000 Commit: Roger Pau Monné CommitDate: 2023-03-29 07:51:45 +0000 xen/intr: rework xen_intr_resume() for in-place remapping The prior implementation of xen_intr_resume() was wiping xen_intr_port_to_isrc[] and then rebuilding from the x86 interrupt table. Rework to instead wipe the channel numbers (->xi_port) and then scan the table for sources with invalid channels. This will be slower due to scanning the whole table, but this removes the dependency on the x86 interrupt code. Reviewed by: royger Differential Revision: https://reviews.freebsd.org/D30599 [royger] Split line over 80 characters. --- sys/x86/xen/xen_intr.c | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/sys/x86/xen/xen_intr.c b/sys/x86/xen/xen_intr.c index e2f23b4a5c6e..4b9b4675b5a0 100644 --- a/sys/x86/xen/xen_intr.c +++ b/sys/x86/xen/xen_intr.c @@ -729,13 +729,14 @@ xen_rebind_virq(struct xenisrc *isrc) isrc->xi_port = bind_virq.port; } -static void +static struct xenisrc * xen_intr_rebind_isrc(struct xenisrc *isrc) { #ifdef SMP u_int cpu = isrc->xi_cpu; int error; #endif + struct xenisrc *prev; switch (isrc->xi_type) { case EVTCHN_TYPE_IPI: @@ -745,9 +746,10 @@ xen_intr_rebind_isrc(struct xenisrc *isrc) xen_rebind_virq(isrc); break; default: - return; + return (NULL); } + prev = xen_intr_port_to_isrc[isrc->xi_port]; xen_intr_port_to_isrc[isrc->xi_port] = isrc; #ifdef SMP @@ -760,6 +762,8 @@ xen_intr_rebind_isrc(struct xenisrc *isrc) #endif evtchn_unmask_port(isrc->xi_port); + + return (prev); } /** @@ -769,7 +773,6 @@ static void xen_intr_resume(struct pic *unused, bool suspend_cancelled) { shared_info_t *s = HYPERVISOR_shared_info; - struct xenisrc *isrc; u_int isrc_idx; int i; @@ -789,19 +792,29 @@ xen_intr_resume(struct pic *unused, bool suspend_cancelled) for (i = 0; i < nitems(s->evtchn_mask); i++) atomic_store_rel_long(&s->evtchn_mask[i], ~0); - /* Remove port -> isrc mappings */ - memset(xen_intr_port_to_isrc, 0, sizeof(xen_intr_port_to_isrc)); + /* Clear existing port mappings */ + for (isrc_idx = 0; isrc_idx < NR_EVENT_CHANNELS; ++isrc_idx) + if (xen_intr_port_to_isrc[isrc_idx] != NULL) + xen_intr_port_to_isrc[isrc_idx]->xi_port = + INVALID_EVTCHN; - /* Free unused isrcs and rebind VIRQs and IPIs */ - for (isrc_idx = 0; isrc_idx < xen_intr_auto_vector_count; isrc_idx++) { - u_int vector; + /* Remap in-use isrcs, using xen_intr_port_to_isrc as listing */ + for (isrc_idx = 0; isrc_idx < NR_EVENT_CHANNELS; ++isrc_idx) { + struct xenisrc *cur = xen_intr_port_to_isrc[isrc_idx]; - vector = first_evtchn_irq + isrc_idx; - isrc = (struct xenisrc *)intr_lookup_source(vector); - if (isrc != NULL) { - isrc->xi_port = INVALID_EVTCHN; - xen_intr_rebind_isrc(isrc); - } + /* empty or entry already taken care of */ + if (cur == NULL || cur->xi_port == isrc_idx) + continue; + + xen_intr_port_to_isrc[isrc_idx] = NULL; + + do { + KASSERT(!is_valid_evtchn(cur->xi_port), + ("%s(): Multiple channels on single intr?", + __func__)); + + cur = xen_intr_rebind_isrc(cur); + } while (cur != NULL); } }