From nobody Wed Feb 05 15:27:08 2025 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 4Yp3xp07Rzz5mvRc; Wed, 05 Feb 2025 15:27:10 +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 4Yp3xn20zdz3lgZ; Wed, 05 Feb 2025 15:27:09 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738769229; 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=KePrYzewHOMidu+GloDOh9loLP6qGEiIelANjD0At5I=; b=XcZb9jVOXtDMp9Q/ftuZ0aidszQc26GElOw8ij3v1M0Oxpl0TkjXAozcSlQsYvoxK1TS5G K38TMAeR6AU8X8MGbTD11C0cBj0wx+AyQ09Vp7tB4TsyDU8k01K8K4FclV5dvnoBCVoPA6 Bji/0tmjjG50IbU+iA+op05llK1X8PMcTLjybWusjJN3MI5fsGfcKLcKIwc57Kd+rqoGvC wf/P6zyIigNUayXB5ab+1nKNJLLV9T1E5A3sHG0Ikzmrz+GEXogIJ4TTFLIBoE1pWVTXXa tIhYoQFZnkm/CxEUIn+7ld8Ds2jqpqiKPTw3D3kQ5Ayfl+uidsA9bQzd3npo0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738769229; 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=KePrYzewHOMidu+GloDOh9loLP6qGEiIelANjD0At5I=; b=JGxaiabnFoBxtMZ0dmneVaCKnKOwy+9zCdiJ4jPzi+j5UScoiKMbzwA2ndeFgAlkBow6Hd OFt1mRvkwwP9CCo2k9VomZXGeHYbvgcwUsor93nfAtscDb+/f3QYrte+hvGAhPiXaRar4Z K+dRLUgpLsLqnOgH97l3AIlqgQqZoJXSvCSeEdCa1hPLK2w/QX5cVY3puWhE3LSFXhMLb6 LI6/3QtsQ87+Qyt+pSV6rWG8qWx/RzUDJlFyYEZpfGRfUa9qo/pCQjb1Y02LpySIIt3gre s9Rju1kGrhbffhFFPXjNnhmxIVVEOQpmxND12Wh3KatKWQNM5TTLn/T5RjQgMA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1738769229; a=rsa-sha256; cv=none; b=lRSSs7lHOrlJpI8dOgqJuf8evCRFnJwYivXmnuft22DWrZEjb/2hCyl5Q6JWeovxmAEkLP DPST7uVq++KuyYcQVKSfZjq6vqi8wWY53h7kNj97gzLooXlXwYAMQjbWX8xc7UG57fEbyQ A9UDrJhx5NlDgfpvA4PFLQ6fARgEEfFMQFcA5xgV/6RLpSFk1abmbemMIaXpB29J82P+qO GvcIWl2d5WPjToVBdJ0RtF4txtN77u5Zf6xu2rvql3O3/cQxOeaqJG+qvKlv/bOvHNDAjN FyHKDVrsqaO0zNoLZPM7eOJgd8uWSVkVd72ehp6gnocMCBXP+TxMsmjjkG5JXw== 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 4Yp3xn0qKKzxYZ; Wed, 05 Feb 2025 15:27:09 +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 515FR8rX081353; Wed, 5 Feb 2025 15:27:08 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 515FR8ou081350; Wed, 5 Feb 2025 15:27:08 GMT (envelope-from git) Date: Wed, 5 Feb 2025 15:27:08 GMT Message-Id: <202502051527.515FR8ou081350@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Gallatin Subject: git: 194bb58b80c1 - main - x86: Fixes for nmi/pmi interrupt sharing 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: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: gallatin X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 194bb58b80c184b8230edef0ed7f292b4bf706b0 Auto-Submitted: auto-generated The branch main has been updated by gallatin: URL: https://cgit.FreeBSD.org/src/commit/?id=194bb58b80c184b8230edef0ed7f292b4bf706b0 commit 194bb58b80c184b8230edef0ed7f292b4bf706b0 Author: Andrew Gallatin AuthorDate: 2025-02-04 22:04:57 +0000 Commit: Andrew Gallatin CommitDate: 2025-02-05 15:26:27 +0000 x86: Fixes for nmi/pmi interrupt sharing - Fix a bug where the semantics of refcount_release() were reversed. This would lead to the nmi interrupt being prematurely masked in the local apic, leading to an out-of-tree profiling tool only getting results the first time it was run. - Stop executing nmi handlers after one claims the interrupt. The core2 hwpmc handler seems to be especially heavy, and running it in addition to vtune's handler caused roughly 50% of the nmi interrupts to be lost (and caused vtune to give worse results). Reviewed by: bojan Sponsored by: Netflix --- sys/x86/x86/cpu_machdep.c | 11 ++++++++--- sys/x86/x86/local_apic.c | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/sys/x86/x86/cpu_machdep.c b/sys/x86/x86/cpu_machdep.c index 4df652f1f2a8..5b4abfe71642 100644 --- a/sys/x86/x86/cpu_machdep.c +++ b/sys/x86/x86/cpu_machdep.c @@ -65,6 +65,7 @@ #include #include #include +#include #include #include #include @@ -955,6 +956,7 @@ nmi_handle_intr(struct trapframe *frame) { int (*func)(struct trapframe *); struct nmi_handler *hp; + int rv; bool handled; #ifdef SMP @@ -965,13 +967,16 @@ nmi_handle_intr(struct trapframe *frame) handled = false; hp = (struct nmi_handler *)atomic_load_acq_ptr( (uintptr_t *)&nmi_handlers_head); - while (hp != NULL) { + while (!handled && hp != NULL) { func = hp->func; if (func != NULL) { atomic_add_int(&hp->running, 1); - if (func(frame) != 0) - handled = true; + rv = func(frame); atomic_subtract_int(&hp->running, 1); + if (rv != 0) { + handled = true; + break; + } } hp = (struct nmi_handler *)atomic_load_acq_ptr( (uintptr_t *)&hp->next); diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c index 86cbe9a050dc..db9a1eb757de 100644 --- a/sys/x86/x86/local_apic.c +++ b/sys/x86/x86/local_apic.c @@ -895,7 +895,7 @@ lapic_disable_pcint(void) maxlvt = (lapic_read32(LAPIC_VERSION) & APIC_VER_MAXLVT) >> MAXLVTSHIFT; if (maxlvt < APIC_LVT_PMC) return; - if (refcount_release(&pcint_refcnt)) + if (!refcount_release(&pcint_refcnt)) return; lvts[APIC_LVT_PMC].lvt_masked = 1;