From nobody Mon Feb 9 17:23:02 2026 Received: from fanzine2.igalia.com (fanzine2.igalia.com [213.97.179.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3DC531A3179; Thu, 25 Dec 2025 04:01:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.97.179.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766635312; cv=none; b=i7/oo5iWZF16ofK4uYbKy7tfvoN1IFRxVgcBn8nkRprJabbgIVC9/ik6VY1JCKmaCzVGwvdUHpDtlLrivQu4pHgfz46OYgp1DIRW02cTU0KrwQSqd73YbslNQPSbQL2q6XAseAm8ZaBgKwyHdY9pnjXGg23xxc4MekNGuvL9RKo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766635312; c=relaxed/simple; bh=a0iq1sd1jBM9Q1ibIFRv0NxghMqTfNf4aPuL2PGlptU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k6vMNCW8AU5Hg0+L0RVM1Atx6eMWzd+G1hUHaceUn3OUYtQhvNt1GDqkaSPD/3DzdNGrY84wkhYn+lujKPiDyXxLEJLOy5TJDXY82YZOegtAApppJjxDbuaRAyeTch4fZrMSBgzBUb8HDeBc6FZM58I2ri3ARKM+X2tMXOyxp94= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=igalia.com; spf=pass smtp.mailfrom=igalia.com; dkim=pass (2048-bit key) header.d=igalia.com header.i=@igalia.com header.b=bOd3Boiv; arc=none smtp.client-ip=213.97.179.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=igalia.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=igalia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=igalia.com header.i=@igalia.com header.b="bOd3Boiv" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=lwltwGqxiKq/BS1zwHOtRLooQae3Ubuni+ZvF375urk=; b=bOd3BoivYefmQg185t+3yXn/tN KUk4ZkQer5Ngpw36nT7mKkD2t+Wi8ZD1KJJwE6RruOnhpaak65VEO5f+wwld9uu1F/vzI70BxcwUR bR4BkB4AYtVkJr/mfw+LJR49JoI4NFiQ8ROcYqfES8aupTychHZ6DXHGEIkMCHlJyBA0mIsZOG9uK 913nxQ9+px99h/gbH3G6Qi0pQictX7fhrTQM7HGe8qjJvP5Btu5IgmUKOEaMCHVjF4RdfqMjV+mMO MyMO3DmD03lypMU9Gu40kOKw+uLXc0MG4evVpfqzFlc6yKww6TSXUewxp5cggfxMf3PBsFFvkm81M Y0XtYhXg==; Received: from [58.29.143.236] (helo=localhost) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1vYcXj-00GLlf-1l; Thu, 25 Dec 2025 05:01:40 +0100 From: Changwoo Min To: lukasz.luba@arm.com, rafael@kernel.org, donald.hunter@gmail.com, kuba@kernel.org, davem@davemloft.net, edumazet@google.com, pabeni@redhat.com, horms@kernel.org, lenb@kernel.org, pavel@kernel.org, changwoo@igalia.com Cc: kernel-dev@igalia.com, linux-pm@vger.kernel.org, netdev@vger.kernel.org, sched-ext@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH for 6.19 4/4] PM: EM: Add dump to get-perf-domains in the EM YNL spec Date: Thu, 25 Dec 2025 13:01:04 +0900 Message-ID: <20251225040104.982704-5-changwoo@igalia.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251225040104.982704-1-changwoo@igalia.com> References: <20251225040104.982704-1-changwoo@igalia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add dump to get-perf-domains, so that a user can fetch either information about a specific performance domain with do or information about all performance domains with dump. The YNL spec, autogenerated files, and the do implementation are updated, and the dump implementation is added. Suggested-by: Donald Hunter Signed-off-by: Changwoo Min --- .../netlink/specs/dev-energymodel.yaml | 12 ++++ include/uapi/linux/dev_energymodel.h | 3 +- kernel/power/em_netlink.c | 58 +++++++++++++++++-- kernel/power/em_netlink_autogen.c | 16 ++++- kernel/power/em_netlink_autogen.h | 2 + 5 files changed, 82 insertions(+), 9 deletions(-) diff --git a/Documentation/netlink/specs/dev-energymodel.yaml b/Documentati= on/netlink/specs/dev-energymodel.yaml index af8b8f72f722..1843e68faacf 100644 --- a/Documentation/netlink/specs/dev-energymodel.yaml +++ b/Documentation/netlink/specs/dev-energymodel.yaml @@ -47,6 +47,11 @@ attribute-sets: doc: >- Information on all the performance domains. attributes: + - + name: perf-domain-id + type: u32 + doc: >- + A unique ID number for each performance domain. - name: perf-domain type: nest @@ -136,6 +141,13 @@ operations: attribute-set: perf-domains doc: Get the list of information for all performance domains. do: + request: + attributes: + - perf-domain-id + reply: + attributes: + - perf-domain + dump: reply: attributes: - perf-domain diff --git a/include/uapi/linux/dev_energymodel.h b/include/uapi/linux/dev_= energymodel.h index 3399967e1f93..e8e133b5a797 100644 --- a/include/uapi/linux/dev_energymodel.h +++ b/include/uapi/linux/dev_energymodel.h @@ -37,7 +37,8 @@ enum dev_energymodel_perf_domain_flags { }; =20 enum { - DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN =3D 1, + DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN_ID =3D 1, + DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN, =20 __DEV_ENERGYMODEL_A_PERF_DOMAINS_MAX, DEV_ENERGYMODEL_A_PERF_DOMAINS_MAX =3D (__DEV_ENERGYMODEL_A_PERF_DOMAINS_= MAX - 1) diff --git a/kernel/power/em_netlink.c b/kernel/power/em_netlink.c index b6edb018c65a..9412f1666007 100644 --- a/kernel/power/em_netlink.c +++ b/kernel/power/em_netlink.c @@ -18,6 +18,13 @@ #include "em_netlink_autogen.h" =20 /*************************** Command encoding ****************************= ****/ +struct dump_ctx { + int idx; + int start; + struct sk_buff *skb; + struct netlink_callback *cb; +}; + static int __em_nl_get_pd_size(struct em_perf_domain *pd, void *data) { int nr_cpus, msg_sz, cpus_sz; @@ -76,16 +83,44 @@ static int __em_nl_get_pd(struct em_perf_domain *pd, vo= id *data) return -EMSGSIZE; } =20 +static int __em_nl_get_pd_for_dump(struct em_perf_domain *pd, void *data) +{ + const struct genl_info *info; + struct dump_ctx *ctx =3D data; + void *hdr; + int ret; + + if (ctx->idx++ < ctx->start) + return 0; + + info =3D genl_info_dump(ctx->cb); + hdr =3D genlmsg_iput(ctx->skb, info); + if (!hdr) { + genlmsg_cancel(ctx->skb, hdr); + return -EMSGSIZE; + } + + ret =3D __em_nl_get_pd(pd, ctx->skb); + genlmsg_end(ctx->skb, hdr); + return ret; +} + int dev_energymodel_nl_get_perf_domains_doit(struct sk_buff *skb, struct genl_info *info) { + int id, ret =3D -EMSGSIZE, msg_sz =3D 0; + int cmd =3D info->genlhdr->cmd; + struct em_perf_domain *pd; struct sk_buff *msg; void *hdr; - int cmd =3D info->genlhdr->cmd; - int ret =3D -EMSGSIZE, msg_sz =3D 0; =20 - for_each_em_perf_domain(__em_nl_get_pd_size, &msg_sz); + if (!info->attrs[DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN_ID]) + return -EINVAL; + + id =3D nla_get_u32(info->attrs[DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN= _ID]); + pd =3D em_perf_domain_get_by_id(id); =20 + __em_nl_get_pd_size(pd, &msg_sz); msg =3D genlmsg_new(msg_sz, GFP_KERNEL); if (!msg) return -ENOMEM; @@ -94,10 +129,9 @@ int dev_energymodel_nl_get_perf_domains_doit(struct sk_= buff *skb, if (!hdr) goto out_free_msg; =20 - ret =3D for_each_em_perf_domain(__em_nl_get_pd, msg); + ret =3D __em_nl_get_pd(pd, msg); if (ret) goto out_cancel_msg; - genlmsg_end(msg, hdr); =20 return genlmsg_reply(msg, info); @@ -106,10 +140,22 @@ int dev_energymodel_nl_get_perf_domains_doit(struct s= k_buff *skb, genlmsg_cancel(msg, hdr); out_free_msg: nlmsg_free(msg); - return ret; } =20 +int dev_energymodel_nl_get_perf_domains_dumpit(struct sk_buff *skb, + struct netlink_callback *cb) +{ + struct dump_ctx ctx =3D { + .idx =3D 0, + .start =3D cb->args[0], + .skb =3D skb, + .cb =3D cb, + }; + + return for_each_em_perf_domain(__em_nl_get_pd_for_dump, &ctx); +} + static struct em_perf_domain *__em_nl_get_pd_table_id(struct nlattr **attr= s) { struct em_perf_domain *pd; diff --git a/kernel/power/em_netlink_autogen.c b/kernel/power/em_netlink_au= togen.c index 44acef0e7df2..16a59200c6a4 100644 --- a/kernel/power/em_netlink_autogen.c +++ b/kernel/power/em_netlink_autogen.c @@ -11,6 +11,11 @@ =20 #include =20 +/* DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS - do */ +static const struct nla_policy dev_energymodel_get_perf_domains_nl_policy[= DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN_ID + 1] =3D { + [DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN_ID] =3D { .type =3D NLA_U32, = }, +}; + /* DEV_ENERGYMODEL_CMD_GET_PERF_TABLE - do */ static const struct nla_policy dev_energymodel_get_perf_table_nl_policy[DE= V_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID + 1] =3D { [DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID] =3D { .type =3D NLA_U32, }, @@ -18,10 +23,17 @@ static const struct nla_policy dev_energymodel_get_perf= _table_nl_policy[DEV_ENER =20 /* Ops table for dev_energymodel */ static const struct genl_split_ops dev_energymodel_nl_ops[] =3D { + { + .cmd =3D DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS, + .doit =3D dev_energymodel_nl_get_perf_domains_doit, + .policy =3D dev_energymodel_get_perf_domains_nl_policy, + .maxattr =3D DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN_ID, + .flags =3D GENL_CMD_CAP_DO, + }, { .cmd =3D DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS, - .doit =3D dev_energymodel_nl_get_perf_domains_doit, - .flags =3D GENL_CMD_CAP_DO, + .dumpit =3D dev_energymodel_nl_get_perf_domains_dumpit, + .flags =3D GENL_CMD_CAP_DUMP, }, { .cmd =3D DEV_ENERGYMODEL_CMD_GET_PERF_TABLE, diff --git a/kernel/power/em_netlink_autogen.h b/kernel/power/em_netlink_au= togen.h index f7e4bddcbd53..5caf2f7e18a5 100644 --- a/kernel/power/em_netlink_autogen.h +++ b/kernel/power/em_netlink_autogen.h @@ -14,6 +14,8 @@ =20 int dev_energymodel_nl_get_perf_domains_doit(struct sk_buff *skb, struct genl_info *info); +int dev_energymodel_nl_get_perf_domains_dumpit(struct sk_buff *skb, + struct netlink_callback *cb); int dev_energymodel_nl_get_perf_table_doit(struct sk_buff *skb, struct genl_info *info); =20 --=20 2.52.0