From nobody Mon Jun 8 14:35:27 2026 Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.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 0BCEB19F11B for ; Thu, 28 May 2026 15:32:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779982374; cv=none; b=K65MOyVxfVZar1r3ELN6OfuxHZebu48MWnewTRucbMPCKKrbBlvdhKUwKQMINgt5cNeldbucyTmbGPiOhgIsIHD5G/qllcnbrbqlEYXRYPMVWS9leI+8XxSIXJ6Lh9BTSUiScDkBC6bEyMtAkJp8B0GQAZ3/+NmrZaVCzPf9S+0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779982374; c=relaxed/simple; bh=CAW3syDKKim3+pEQ7wMxF8KtuVzPR1nXCGH2CuOXEHQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=N+LGCawpofnH82PCzCUngFYeFhDKAaR+QQ7EfqXhOpSnoMY3ai5lkKlFaFHH9x2qL3mi5uy6cOgN2IzRw2fKvuuL8F6EU/xkbOLWXHdELtZBkHXmhwAxRUFXf0vJ+SSWgBtuHe1nW1mtT2Z4P1JuaR16h499ay1QU3VCTBlcCiY= 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=Z1m4TV4z; arc=none smtp.client-ip=209.85.208.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="Z1m4TV4z" Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-68b90fc6a1dso655739a12.1 for ; Thu, 28 May 2026 08:32:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779982372; x=1780587172; 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=bu1VHF115W9s3boPLAXFQHBS6iEnbQcNg2EXl5Ejckk=; b=Z1m4TV4zFVh4FBwVMllyoljddC0Y7uaEs7gbg233nDmp1W4FbkeAGoJHfAuwfjwXaO oyD8WZV0FUJJA9ysFLQcbTkOYEx41c0icLXliAIVflyFmwfSGVf5lKTEI02PVeEata7e HHFeG/QelfzyNAqMDipwlznYhanGAVJKumW1Ubq0pPRzieIaIOxrF1CAScvP/xN+pFrw QHfkD/NaKMYb6JWDZyQAyppRkfineYCThkc9Qhm5vdj1Su2yMje+urlsMl0cdVnMZFVO 0UcUBIWa66bWbGNmn1fvomHllRmqSULTNpsjYdEfDSRFZebn7obwdp9eyuIRLZM9+RsP 4WXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779982372; x=1780587172; 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=bu1VHF115W9s3boPLAXFQHBS6iEnbQcNg2EXl5Ejckk=; b=krNGp94oIsV2awNA2tAtRS4kJmAjUXqM5QBt2gYQOtaYzat405m9IURPzh6ji70j9S nW2dLc1Knz0H05w7nZu+DcUVU5PHhG6mAKN8ZmvlkaK/ukZJIYi7RQbXqlmObtE54v0a qNvItIemGsbDnLvod7QvjisOgqAztd5BpB8N0qXpMff0LXVsNigV3KGzZ5wsGbO1hOHZ 2GQ8dEbD1tkxgVC4ZFQr1yfIZuIf9QZeM1EOALhtseFu1D7cvXlIgVbiki8XA17Godpt 1INZyBDGR2w/Hk5p54TdQ1yat/PxXcjGOX1/DvLCwOp25ggwwkrkUyRubh38gWBXDfX7 0EyQ== X-Forwarded-Encrypted: i=1; AFNElJ8PwiJxYCTY0ccq3q/wJgYFxbnb1kbVWntBIGrf33TBzAhyHeYDhUALENufWGDmDgr3srBdZynxQLj94lc=@vger.kernel.org X-Gm-Message-State: AOJu0YxgP8qUrXm3X7a92YwGbr/qcfLR3nAYX04loot12h1SVJ7snEbB EzKa3s7Rc9UBR+2D9GHSxLE6aluRgs61DYJIxMrMJMQxnPSpxHvtAOb7 X-Gm-Gg: Acq92OGExlcJBdbVHVs0qXjlhggOnx4OpKpMva9L1X7kfvhUATqitwrtUUmKykpiJ7H mf0iBQ2wROvobUL5rUyWx9NJFKGD3s5FzQ4KI5RZzQ+hYLoviFhfXqEiDgg7c+gNV3gV29p2HYH tC2x8Vy0ZbUXG0bF+jfABA22Sh8qRNcGZEPQQCnxFVFadaja1BNLshCHQWYYjb+qbgEM5gNwIj8 CZhnyreCi1PVqgV0VFYh9Svp/aF77AYySHL1lELnD/DhrCnDekwE5WD6cWZGITViOAf2bwNDWEi JLidlDmbp9QoZRL3tv1IvBBMApI2y/BbKGDTlpoWPpwnkZZGpI3v2P/QJEL2cytcTU+2FA2oKdn WA5pVsd9XCSiNqoyTfACCW50sQ+AQb8r1o4DlruPse8HSqoWETGBjpiN5gBh9cri/FWlnKxZxGM fJfZ0jXVLjF7NHiJYP73XGaZ8EsdjTCE2aq6sSz6/yEokvRGTE7BqJjq6zivUGr/QtiHaFXr+E3 drn5sI2ZHPHxYDW X-Received: by 2002:a05:6402:2038:b0:678:a5d1:ca74 with SMTP id 4fb4d7f45d1cf-68b5a0b1b5cmr911530a12.16.1779982372267; Thu, 28 May 2026 08:32:52 -0700 (PDT) Received: from powerpenguini-l140cu (staticline-31-183-186-11.toya.net.pl. [31.183.186.11]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-68b96fd79a4sm311495a12.7.2026.05.28.08.32.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 May 2026 08:32:50 -0700 (PDT) From: =?UTF-8?q?Mateusz=20Ja=C5=9Bkiewicz?= To: Shuah Khan Cc: Thomas Renninger , "John B. Wyatt IV" , John Kacur , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, =?UTF-8?q?Mateusz=20Ja=C5=9Bkiewicz?= Subject: [PATCH v4] cpupower: Implement powercap enabled setters Date: Thu, 28 May 2026 17:32:48 +0200 Message-ID: <20260528153248.4114324-1-jaskiewiczteo@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <5ff19049-a83a-4ef9-9cae-b97438fb3e77@linuxfoundation.org> References: <5ff19049-a83a-4ef9-9cae-b97438fb3e77@linuxfoundation.org> 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 v4: - Compare the snprintf() return value against SYSFS_PATH_MAX to avoid the signedness warning without adding a typecast. 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..cbbfc4736 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 SYSFS_PATH_MAX) + return -1; + + return sysfs_set_enabled(path, mode); } =20 =20 --=20 2.54.0