From nobody Fri Jan 16 14:39:10 2026 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 4dt2YB35Dkz6NMcd for ; Fri, 16 Jan 2026 14:39: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 "R13" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dt2YB0q3Pz3JXK for ; Fri, 16 Jan 2026 14:39:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1768574350; 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=pLZzizQr0xVjcmuPrwNWSvtFWuBkfRdvhmKOT5EciXo=; b=Y6fwxwQOWmpax0JbiejQn2Jzeec8oWH80vO/bnGl82DTrG7UbsVLQKYncWzNXrVYjN7/Kn mHKvBYqDa96Tw3j8t+1BrelKprOG3WzdMd4VHcpsNJem44bQuR3QJh8e3gH+R6zZ2ze3G8 MOyCr+Ew24tw64UwoUqkhFANAIws8hSioE9Bx2oz1rjn46QHegrsmIuCMudinlSj64Kprj B0iVTqYpOu8qDYA8md1WkrOZtvhdfRTiZon82BtujJ+6Rz5o6/dqtxVFXhqe4fffSl/Z3G 5dJQ5xr3VaSMT8Ps0VCryi8w9v8826GwyMZR2iTBYT0VdMbJQCZzDxiEqwL/YQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1768574350; 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=pLZzizQr0xVjcmuPrwNWSvtFWuBkfRdvhmKOT5EciXo=; b=LtNAnJ4bdt6+b1YY93G8n7Pyyhxq0Zs9gaVwf14som+k1XqAy5DEHVGphiUvCRZIV2AVTR AcHVGSBI/hXjHjS+1xOzT4uAYMwaOKaHMUK531pWh27Fo1BZmUTb7BXs86KrtA1/hQA/pY VK7RCPDMGjlqELeuBsn9aZZhOMghi5mmIgX6/Cnm1tI+dVNWGfwrwcoFFzUPjVnfJSZVsx 7N5jHBuXLNq+ke9YQ60mAPMXXTp933Zkh81GNpx9Z7TTIXuC4Gb+oNziEDsDwHvasJkb4v iCmczI4I7DiPKCowK8uAxofmuh1BUZ6NdTwpzELL+8JwPECrMJm5P4ePVEzerQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1768574350; a=rsa-sha256; cv=none; b=HVOIlR/ycjGyFzQdlJ5jpJSUsqKcVpQRY/n8bbY45Z4GjC33bZY5uozk4X7SWnLNo5iEWp 8r8M0VuN64sqOiWIgoC6jNRlLbznmGiGdvBkuiN3/u2DNLT2vF4o+4uUaQ3sGG5Jpb01O/ gAWVQZJPWOI4zDXrDeYi0Y2c+fdJQNBscS5wd4VOWsvnhRxqEO6m9Nd1UXBOMiwNdZUCi/ 6ecCDE3hINnx6sVbvg+ehUsrkpn0au1o+TuIcNJZvclSgQUMz4BqO5uVl765KufdqkovEE varj6rqHjdKT42V94GCBXFBKLQA9zhhiHo+SoyQ/k4Wup0IaZUdHoxttTqyO3g== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4dt2YB0JQpz2kS for ; Fri, 16 Jan 2026 14:39:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id d0f2 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 16 Jan 2026 14:39:10 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: ShengYi Hung Subject: git: 87c4d6555b41 - main - hwpstate_amd: Use ipi instead of sched_bind + thread_lock 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: aokblast X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 87c4d6555b41a509ff1eeb24e2fa90f3f59483a7 Auto-Submitted: auto-generated Date: Fri, 16 Jan 2026 14:39:10 +0000 Message-Id: <696a4d8e.d0f2.571985ff@gitrepo.freebsd.org> The branch main has been updated by aokblast: URL: https://cgit.FreeBSD.org/src/commit/?id=87c4d6555b41a509ff1eeb24e2fa90f3f59483a7 commit 87c4d6555b41a509ff1eeb24e2fa90f3f59483a7 Author: ShengYi Hung AuthorDate: 2026-01-04 15:10:59 +0000 Commit: ShengYi Hung CommitDate: 2026-01-16 14:38:15 +0000 hwpstate_amd: Use ipi instead of sched_bind + thread_lock Reviewed by: olce Approved by: markj (mentor) MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D54505 --- sys/x86/cpufreq/hwpstate_amd.c | 146 ++++++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 67 deletions(-) diff --git a/sys/x86/cpufreq/hwpstate_amd.c b/sys/x86/cpufreq/hwpstate_amd.c index ce0e0f6dd47a..5676d8ce7dae 100644 --- a/sys/x86/cpufreq/hwpstate_amd.c +++ b/sys/x86/cpufreq/hwpstate_amd.c @@ -198,6 +198,26 @@ static device_method_t hwpstate_methods[] = { {0, 0} }; +struct amdhwp_dump_sysctl_handler_request { + uint64_t enable; + uint64_t caps; + uint64_t req; + int res; +}; + +static void +amdhwp_dump_sysctl_handler_cb(void *args) +{ + struct amdhwp_dump_sysctl_handler_request *req = + (struct amdhwp_dump_sysctl_handler_request *)args; + + req->res = rdmsr_safe(MSR_AMD_CPPC_ENABLE, &req->enable); + if (req->res == 0) + req->res = rdmsr_safe(MSR_AMD_CPPC_CAPS_1, &req->caps); + if (req->res == 0) + req->res = rdmsr_safe(MSR_AMD_CPPC_REQUEST, &req->req); +} + static int amdhwp_dump_sysctl_handler(SYSCTL_HANDLER_ARGS) { @@ -205,6 +225,7 @@ amdhwp_dump_sysctl_handler(SYSCTL_HANDLER_ARGS) struct pcpu *pc; struct sbuf *sb; struct hwpstate_softc *sc; + struct amdhwp_dump_sysctl_handler_request request; uint64_t data; int ret; @@ -217,20 +238,19 @@ amdhwp_dump_sysctl_handler(SYSCTL_HANDLER_ARGS) sb = sbuf_new(NULL, NULL, 1024, SBUF_FIXEDLEN | SBUF_INCLUDENUL); sbuf_putc(sb, '\n'); - thread_lock(curthread); - sched_bind(curthread, pc->pc_cpuid); - thread_unlock(curthread); + smp_rendezvous_cpu(pc->pc_cpuid, smp_no_rendezvous_barrier, + amdhwp_dump_sysctl_handler_cb, smp_no_rendezvous_barrier, &request); + ret = request.res; + if (ret) + goto out; - rdmsr_safe(MSR_AMD_CPPC_ENABLE, &data); + data = request.enable; sbuf_printf(sb, "CPU%d: HWP %sabled\n", pc->pc_cpuid, ((data & 1) ? "En" : "Dis")); - - if (data == 0) { - ret = 0; + if (data == 0) goto out; - } - rdmsr_safe(MSR_AMD_CPPC_CAPS_1, &data); + data = request.caps; sbuf_printf(sb, "\tHighest Performance: %03ju\n", BITS_VALUE(AMD_CPPC_CAPS_1_HIGH_PERF_BITS, data)); sbuf_printf(sb, "\tGuaranteed Performance: %03ju\n", @@ -241,8 +261,7 @@ amdhwp_dump_sysctl_handler(SYSCTL_HANDLER_ARGS) BITS_VALUE(AMD_CPPC_CAPS_1_LOW_PERF_BITS, data)); sbuf_putc(sb, '\n'); - rdmsr_safe(MSR_AMD_CPPC_REQUEST, &data); - + data = request.req; #define pkg_print(name, offset) \ do { \ sbuf_printf(sb, "\t%s: %03u\n", name, \ @@ -258,11 +277,8 @@ amdhwp_dump_sysctl_handler(SYSCTL_HANDLER_ARGS) sbuf_putc(sb, '\n'); out: - thread_lock(curthread); - sched_unbind(curthread); - thread_unlock(curthread); - - ret = sbuf_finish(sb); + if (ret == 0) + ret = sbuf_finish(sb); if (ret == 0) ret = SYSCTL_OUT(req, sbuf_data(sb), sbuf_len(sb)); sbuf_delete(sb); @@ -270,44 +286,29 @@ out: return (ret); } -static bool -sysctl_epp_select_per_core(const device_t hwp_device, uint32_t val) +static void +sysctl_epp_select_per_core(device_t hwp_device, uint32_t val) { struct hwpstate_softc *sc; - bool success = true; - int ret, cpuid; - cpuid = cpu_get_pcpu(hwp_device)->pc_cpuid; - thread_lock(curthread); - sched_bind(curthread, cpuid); - thread_unlock(curthread); sc = device_get_softc(hwp_device); if (BITS_VALUE(AMD_CPPC_REQUEST_ENERGY_PERF_BITS, sc->req) == val) - goto end; + return; SET_BITS_VALUE(sc->req, AMD_CPPC_REQUEST_ENERGY_PERF_BITS, val); - ret = wrmsr_safe(MSR_AMD_CPPC_REQUEST, sc->req); - if (ret != 0) { - success = false; - device_printf(hwp_device, "Failed to set EPP to %u", val); - goto end; - } - -end: - thread_lock(curthread); - sched_unbind(curthread); - thread_unlock(curthread); - - return (success); + x86_msr_op(MSR_AMD_CPPC_REQUEST, + MSR_OP_RENDEZVOUS_ONE | MSR_OP_WRITE | + MSR_OP_CPUID(cpu_get_pcpu(hwp_device)->pc_cpuid), + sc->req, NULL); } static int sysctl_epp_select(SYSCTL_HANDLER_ARGS) { device_t dev, hwp_dev; + devclass_t dc; struct hwpstate_softc *sc; const uint32_t max_energy_perf = BITS_VALUE(AMD_CPPC_REQUEST_ENERGY_PERF_BITS, (uint64_t)-1); - devclass_t dc; uint32_t val; int ret = 0; int cpu; @@ -577,44 +578,45 @@ hwpstate_identify(driver_t *driver, device_t parent) device_printf(parent, "hwpstate: add child failed\n"); } -static int -amd_set_autonomous_hwp(struct hwpstate_softc *sc) +struct amd_set_autonomous_hwp_request { + device_t dev; + int res; +}; + +static void +amd_set_autonomous_hwp_cb(void *args) { - struct pcpu *pc; + struct hwpstate_softc *sc; + struct amd_set_autonomous_hwp_request *req = + (struct amd_set_autonomous_hwp_request *)args; device_t dev; uint64_t caps; int ret; - dev = sc->dev; - pc = cpu_get_pcpu(dev); - if (pc == NULL) - return (ENXIO); - - thread_lock(curthread); - sched_bind(curthread, pc->pc_cpuid); - thread_unlock(curthread); - + dev = req->dev; + sc = device_get_softc(dev); ret = wrmsr_safe(MSR_AMD_CPPC_ENABLE, 1); if (ret != 0) { device_printf(dev, "Failed to enable cppc for cpu%d (%d)\n", - pc->pc_cpuid, ret); - goto out; + curcpu, ret); + req->res = ret; } ret = rdmsr_safe(MSR_AMD_CPPC_REQUEST, &sc->req); if (ret != 0) { device_printf(dev, - "Failed to read CPPC request MSR for cpu%d (%d)\n", - pc->pc_cpuid, ret); - goto out; + "Failed to read CPPC request MSR for cpu%d (%d)\n", curcpu, + ret); + req->res = ret; } ret = rdmsr_safe(MSR_AMD_CPPC_CAPS_1, &caps); if (ret != 0) { device_printf(dev, "Failed to read HWP capabilities MSR for cpu%d (%d)\n", - pc->pc_cpuid, ret); - goto out; + curcpu, ret); + req->res = ret; + return; } /* @@ -632,17 +634,27 @@ amd_set_autonomous_hwp(struct hwpstate_softc *sc) ret = wrmsr_safe(MSR_AMD_CPPC_REQUEST, sc->req); if (ret) { - device_printf(dev, - "Failed to setup autonomous HWP for cpu%d\n", - pc->pc_cpuid); - goto out; + device_printf(dev, "Failed to setup autonomous HWP for cpu%d\n", + curcpu); + req->res = ret; + return; } -out: - thread_lock(curthread); - sched_unbind(curthread); - thread_unlock(curthread); + req->res = 0; +} - return (ret); +static int +amd_set_autonomous_hwp(struct hwpstate_softc *sc) +{ + struct amd_set_autonomous_hwp_request req; + device_t dev; + + dev = sc->dev; + req.dev = dev; + smp_rendezvous_cpu(cpu_get_pcpu(dev)->pc_cpuid, + smp_no_rendezvous_barrier, amd_set_autonomous_hwp_cb, + smp_no_rendezvous_barrier, &req); + + return (req.res); } static int