From nobody Mon Jun 8 18:55:26 2026 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 36B723CFF59 for ; Wed, 27 May 2026 08:12:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779869559; cv=none; b=cJnlmKiqjuHBp+u3Tm59uMeJz//u/ktKMrj3ik8gRwHAydrRr1mHubpyK4zQOfwFSvH9PowC3AN2MxDcsYJTgnLCd/6pcBSll7XamUY77dpxpDaSn7+UdRznk407LZSmCGABRPlYl4Vh5HZqVHdQQO5JgMklgcXHY3EclVTaMs8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779869559; c=relaxed/simple; bh=W4q88dV9VxTrbQWDOtogmMurOVzPT5extR6wwZoZJuU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DwiWHVV9x0mHBofEXLRC5aVh0BcikJQcCN+1ir1BxEz8haKaqW+ENVi7JE4yOqAfliS/bqXkzTX4768gMgR48vz4zEQOnUKiibXjAT8MGozrkiwkbDQGB6N92sjASBFFOSZOWozYq0avy5FQtILg5pIQZ/z60ORXBFfXtO+HRfc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=fCYKk20r; arc=none smtp.client-ip=209.85.218.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="fCYKk20r" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-bd21ffaca79so2105301066b.0 for ; Wed, 27 May 2026 01:12:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779869556; x=1780474356; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Z8I5cb9EDSN0CWGopKBTwtEF+OyzEohAwWcJqwzO5iQ=; b=fCYKk20rOkIbx3xx5euPaMOIuDjbk0NwitT1KXLXPdxPA4EWSk3dgCsMymqCviKbWT 6hEqF5ZViUjfjCdf0ogz27zJsWRcXXkDHVwDl2a0ivPtyx9hW+8zvHpcSgDgSx9aiEbm WjbR7OwRNErUgERC41i/pN6XGk6Eg+zwRVSjUkoW3nZNN5tswqZwc12us8FFnJLFjnJe wQIgYb6XY6rR2eOYg5MIVFiuf0G1Rx33F9C4k3KwaLbyqvz6s3qPUnRAJqRJtCE7k/jw urwkGg6IoMP7rSoYWjKwzmO7fiotxYqV9b77en55ddg/OsPqu+Tu36gKH0OWusnqZI1R 9x9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779869556; x=1780474356; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Z8I5cb9EDSN0CWGopKBTwtEF+OyzEohAwWcJqwzO5iQ=; b=NybJtn+vGwuks3MWCQFF18YGtsxpSw6lozaPcxtHr+J3a5+thJXJ2BYhG0WtmUCNZn dQ5/y/uUU5BbGkpc9S1DpjltVWyB4CaiuYXIqMbUb7tPptz/08bXHLqGo642TCjVhGKO 6Y7rnjN1wim5TnMm6k0YRFOzDlTFCgLykqz6D5vMEk2caJCh8ikkqM6aQY4+vAce+Bx0 Lbs1gV6Qu/bBXRLHSie0KIjcqBO+A5ELM8lMCUpMFzLFk54/KB688UAvgCvzXTO26EuE bhs+pdQYU8yP4Ash/GCz8rai7cHQ2o0ns9EsYW4MadPMAorLbuS4q3wVFfuSNjLr14t5 QTfA== X-Forwarded-Encrypted: i=1; AFNElJ+oHc9ateBF1szP4rkSpTmm1rkU+Gd8TTP770nRzZUmgLn9qrImqF5Yiw7rq0Rvxmm+NhwnpnCwV/ISTGI=@vger.kernel.org X-Gm-Message-State: AOJu0YyUYwfL/JBxse35iiwRzm29c9/Q30a5LgipDG53PApDibnBs+00 U71VV6dSCBzNhSKyJ0Ur5xRxNzcz8ZAJyif/Ro2PfkxNQK2Ie/j1Y9hMxNSf20hj1Gk= X-Gm-Gg: Acq92OETT36zHKkp/Zj/VdLy//zfxJ1GwsBI2EUJuzgksezyjKRAGGlMbdHYSVwvWAf ZifCYQbUMjUI5ey3qLEY6nXC249ENrOxJ0zTlaYrK6QiPaJIx4hbBYcVFni4yJF2dod6DXSWM/j lu9g72WvAQzKalj8z6V1b630lBZaskBTdVWvlRkxa1BBh1GwZolqKzRTn/hw9j4Ax97DDMcPiUl toNJXa3GeBWXPWWBKXnia+LTaUMauTaHl93ApJZnjcNC56vNuhQMK03TKpr3fE7kSVZIwCaeb4N euKECidUTacK0Oi3DgXcu/+aSE/72A23lgyhQ+qVtfPX7i15OsQruFBdRVp7rEKtPg9yYn8CAs9 w+3cwep6bipA8xQ2wIrE7DGzkhLZc4dKP5Cdoe3JNJdn6LFiioD0KH2CbGbgry9pHuY0m1UyOIi 8suXONTHSpbirASawkXFmKtI0uNqdujTfvp3FbeS97S6atvTRysOZZAfx3xmbYgySaWrWh X-Received: by 2002:a17:907:d0c:b0:bd5:1ad4:cd73 with SMTP id a640c23a62f3a-bdbff5847aamr1432093266b.2.1779869556249; Wed, 27 May 2026 01:12:36 -0700 (PDT) Received: from powerpenguini-l140cu.emea.dell.com ([132.237.167.248]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-bddc2c4e3d5sm597838466b.15.2026.05.27.01.12.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 May 2026 01:12:35 -0700 (PDT) From: =?UTF-8?q?Mateusz=20Ja=C5=9Bkiewicz?= To: Thomas Renninger , Shuah Khan , "John B. Wyatt IV" , John Kacur Cc: =?UTF-8?q?Mateusz=20Ja=C5=9Bkiewicz?= , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3] cpupower: Implement powercap enabled setters Date: Wed, 27 May 2026 10:12:33 +0200 Message-ID: <20260527081233.4060762-1-jaskiewiczteo@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable powercap_set_enabled() and powercap_zone_set_enabled() are part of the public libcpupower API, but both currently return success without updating sysfs. Write the requested value to the matching enabled attribute so callers can actually enable or disable the powercap control type or zone, and report write failures back to the caller. Signed-off-by: Mateusz Ja=C5=9Bkiewicz --- Changes in v3: - Move the patch changelog below the Signed-off-by trailer so the sign-off is kept when the patch is applied. Changes in v2: - Check current enabled value before writing. - Use fd < 0 style for open() failures. - Print sysfs open/write failures with perror(). - Drop the sizeof(path) typecast. tools/power/cpupower/lib/powercap.c | 58 +++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/tools/power/cpupower/lib/powercap.c b/tools/power/cpupower/lib= /powercap.c index 94a0c69e5..80af65287 100644 --- a/tools/power/cpupower/lib/powercap.c +++ b/tools/power/cpupower/lib/powercap.c @@ -21,7 +21,7 @@ static unsigned int sysfs_read_file(const char *path, cha= r *buf, size_t buflen) ssize_t numread; =20 fd =3D open(path, O_RDONLY); - if (fd =3D=3D -1) + if (fd < 0) return 0; =20 numread =3D read(fd, buf, buflen - 1); @@ -36,7 +36,7 @@ static unsigned int sysfs_read_file(const char *path, cha= r *buf, size_t buflen) return (unsigned int) numread; } =20 -static int sysfs_get_enabled(char *path, int *mode) +static int sysfs_get_enabled(const char *path, int *mode) { int fd; char yes_no; @@ -45,7 +45,7 @@ static int sysfs_get_enabled(char *path, int *mode) *mode =3D 0; =20 fd =3D open(path, O_RDONLY); - if (fd =3D=3D -1) { + if (fd < 0) { ret =3D -1; goto out; } @@ -70,6 +70,36 @@ static int sysfs_get_enabled(char *path, int *mode) return ret; } =20 +static int sysfs_set_enabled(const char *path, int mode) +{ + char yes_no; + int fd; + int current_mode; + ssize_t ret; + + if (mode !=3D 0 && mode !=3D 1) + return -1; + + if (sysfs_get_enabled(path, ¤t_mode) =3D=3D 0 && + current_mode =3D=3D mode) + return 0; + + yes_no =3D mode ? '1' : '0'; + fd =3D open(path, O_WRONLY); + if (fd < 0) { + perror(path); + return -1; + } + ret =3D write(fd, &yes_no, 1); + if (ret !=3D 1) { + if (ret < 0) + perror(path); + close(fd); + return -1; + } + return close(fd); +} + int powercap_get_enabled(int *mode) { char path[SYSFS_PATH_MAX] =3D PATH_TO_POWERCAP "/intel-rapl/enabled"; @@ -77,17 +107,13 @@ int powercap_get_enabled(int *mode) return sysfs_get_enabled(path, mode); } =20 -/* - * TODO: implement function. Returns dummy 0 for now. - */ int powercap_set_enabled(int mode) { - return 0; + return sysfs_set_enabled(PATH_TO_RAPL "/enabled", mode); } - /* * Hardcoded, because rapl is the only powercap implementation -- * this needs to get more generic if more powercap implementations + * this needs to get more generic if more powercap implementations * should show up */ int powercap_get_driver(char *driver, int buflen) @@ -180,8 +206,18 @@ int powercap_zone_get_enabled(struct powercap_zone *zo= ne, int *mode) =20 int powercap_zone_set_enabled(struct powercap_zone *zone, int mode) { - /* To be done if needed */ - return 0; + char path[SYSFS_PATH_MAX]; + int ret; + + if (!zone) + return -1; + + ret =3D snprintf(path, sizeof(path), "%s/%s/enabled", + PATH_TO_POWERCAP, zone->sys_name); + if (ret < 0 || ret >=3D sizeof(path)) + return -1; + + return sysfs_set_enabled(path, mode); } =20 =20 --=20 2.54.0