Documentation/netlink/specs/em.yaml | 113 ++++++++++ MAINTAINERS | 3 + include/linux/energy_model.h | 4 + include/uapi/linux/energy_model.h | 62 ++++++ kernel/power/Makefile | 5 +- kernel/power/em_netlink.c | 309 ++++++++++++++++++++++++++++ kernel/power/em_netlink.h | 39 ++++ kernel/power/em_netlink_autogen.c | 48 +++++ kernel/power/em_netlink_autogen.h | 23 +++ kernel/power/energy_model.c | 85 +++++++- 10 files changed, 689 insertions(+), 2 deletions(-) create mode 100644 Documentation/netlink/specs/em.yaml create mode 100644 include/uapi/linux/energy_model.h create mode 100644 kernel/power/em_netlink.c create mode 100644 kernel/power/em_netlink.h create mode 100644 kernel/power/em_netlink_autogen.c create mode 100644 kernel/power/em_netlink_autogen.h
Addressed all the comments from Lukasz and rebased the code to the head
of the linus tree.
There is a need to access the energy model from the userspace. One such
example is the sched_ext schedulers [1]. The userspace part of the
sched_ext schedules could feed the (post-processed) energy-model
information to the BPF part of the scheduler.
Currently, debugfs is the only way to read the energy model from userspace;
however, it lacks proper notification mechanisms when a performance domain
and its associated energy model change.
This patch set introduces a generic netlink for the energy model, as
discussed in [2]. It allows a userspace program to read the performance
domain and its energy model. It notifies the userspace program when a
performance domain is created or deleted or its energy model is updated
through a multicast interface.
Specifically, it supports two commands:
- EM_CMD_GET_PDS: Get the list of information for all performance
domains.
- EM_CMD_GET_PD_TABLE: Get the energy model table of a performance
domain.
Also, it supports three notification events:
- EM_CMD_PD_CREATED: When a performance domain is created.
- EM_CMD_PD_DELETED: When a performance domain is deleted.
- EM_CMD_PD_UPDATED: When the energy model table of a performance domain
is updated.
This can be tested using the tool, tools/net/ynl/pyynl/cli.py, for example,
with the following commands:
$> tools/net/ynl/pyynl/cli.py \
--spec Documentation/netlink/specs/em.yaml \
--do get-pds
$> tools/net/ynl/pyynl/cli.py \
--spec Documentation/netlink/specs/em.yaml \
--do get-pd-table --json '{"pd-id": 0}'
$> tools/net/ynl/pyynl/cli.py \
--spec Documentation/netlink/specs/em.yaml \
--subscribe event --sleep 10
[1] https://lwn.net/Articles/922405/
[2] https://lore.kernel.org/lkml/a82423bc-8c38-4d57-93da-c4f20011cc92@arm.com/
[3] https://lore.kernel.org/lkml/202506140306.tuIoz8rN-lkp@intel.com/#t
ChangeLog v5 -> v6:
- Fix two problems reported by the kernel test robot.
- Conditionally include the iterator/accessor code for the performance
domain when both CONFIG_ENERGY_MODEL and CONFIG_NET are set to avoid
the compilation errors (patch 5).
- Remove an unused variable, `ret`, in em_notify_pd_deleted() to avoid
a warning (patch 8).
ChangeLog v4 -> v5:
- Rebase the code to the head of the linus tree.
- Remove the redundant em_check_capacity_update() call from
em_dev_register_pd_no_update().
- Move patch 3 ("PM: EM: Add an iterator and accessor for the
performance domain") after patch 5 ("PM: EM: Add a skeleton code for
netlink notification").
- Move the declaration of for_each_em_perf_domain() and
em_perf_domain_get_by_id() from energy_model.h to em_netlink.h.
- Fix a typo in patch 7 ("PM: EM: Implement
em_nl_get_pd_table_doit()") and change the variable declaration
order in em_nl_get_pd_table_doit() following the reverse Christmas
tree order.
- Remove the empty skeleton code of em_notify_pd_created/updated() from
patch 8 ("PM: EM: Implement em_notify_pd_deleted()") and introduce
them later where they are actually implemented.
- Change the return type of em_notify_pd_created/updated/deleted()
from int to void, since we don't check it anyway.
ChangeLog v3 -> v4:
- Move patches [3-5] to the first.
- Remove the ending period (".") from all of the patch subjects.
- Rebase the code to v6.17-rc4.
ChangeLog v2 -> v3:
- Properly initialize a return variable in
em_notify_pd_created/updated() at an error path (09/10), reported by
the kernel test robot [3].
- Remove redundant initialization of a return variable in
em_notify_pd_deleted() at an error path (08/10).
ChangeLog v1 -> v2:
- Use YNL to generate boilerplate code. Overhaul the naming conventions
(command, event, notification, attribute) to follow the typical
conventions of other YNL-based netlink implementations.
- Calculate the exact message size instead of using NLMSG_GOODSIZE
when allocating a message (genlmsg_new). This avoids the reallocation
of a message.
- Remove an unnecessary function, em_netlink_exit(), and initialize the
netlink (em_netlink_init) at em_netlink.c without touching energy_model.c.
Changwoo Min (10):
PM: EM: Assign a unique ID when creating a performance domain
PM: EM: Expose the ID of a performance domain via debugfs
PM: EM: Add em.yaml and autogen files
PM: EM: Add a skeleton code for netlink notification
PM: EM: Add an iterator and accessor for the performance domain
PM: EM: Implement em_nl_get_pds_doit()
PM: EM: Implement em_nl_get_pd_table_doit()
PM: EM: Implement em_notify_pd_deleted()
PM: EM: Implement em_notify_pd_created/updated()
PM: EM: Notify an event when the performance domain changes
Documentation/netlink/specs/em.yaml | 113 ++++++++++
MAINTAINERS | 3 +
include/linux/energy_model.h | 4 +
include/uapi/linux/energy_model.h | 62 ++++++
kernel/power/Makefile | 5 +-
kernel/power/em_netlink.c | 309 ++++++++++++++++++++++++++++
kernel/power/em_netlink.h | 39 ++++
kernel/power/em_netlink_autogen.c | 48 +++++
kernel/power/em_netlink_autogen.h | 23 +++
kernel/power/energy_model.c | 85 +++++++-
10 files changed, 689 insertions(+), 2 deletions(-)
create mode 100644 Documentation/netlink/specs/em.yaml
create mode 100644 include/uapi/linux/energy_model.h
create mode 100644 kernel/power/em_netlink.c
create mode 100644 kernel/power/em_netlink.h
create mode 100644 kernel/power/em_netlink_autogen.c
create mode 100644 kernel/power/em_netlink_autogen.h
--
2.51.1.dirty
Hi Changwoo, On 10/20/25 23:09, Changwoo Min wrote: > Addressed all the comments from Lukasz and rebased the code to the head > of the linus tree. > > There is a need to access the energy model from the userspace. One such > example is the sched_ext schedulers [1]. The userspace part of the > sched_ext schedules could feed the (post-processed) energy-model > information to the BPF part of the scheduler. > [snip] > > ChangeLog v5 -> v6: > - Fix two problems reported by the kernel test robot. > - Conditionally include the iterator/accessor code for the performance > domain when both CONFIG_ENERGY_MODEL and CONFIG_NET are set to avoid > the compilation errors (patch 5). > - Remove an unused variable, `ret`, in em_notify_pd_deleted() to avoid > a warning (patch 8). > [snip] > > Changwoo Min (10): > PM: EM: Assign a unique ID when creating a performance domain > PM: EM: Expose the ID of a performance domain via debugfs > PM: EM: Add em.yaml and autogen files > PM: EM: Add a skeleton code for netlink notification > PM: EM: Add an iterator and accessor for the performance domain > PM: EM: Implement em_nl_get_pds_doit() > PM: EM: Implement em_nl_get_pd_table_doit() > PM: EM: Implement em_notify_pd_deleted() > PM: EM: Implement em_notify_pd_created/updated() > PM: EM: Notify an event when the performance domain changes > > Documentation/netlink/specs/em.yaml | 113 ++++++++++ > MAINTAINERS | 3 + > include/linux/energy_model.h | 4 + > include/uapi/linux/energy_model.h | 62 ++++++ > kernel/power/Makefile | 5 +- > kernel/power/em_netlink.c | 309 ++++++++++++++++++++++++++++ > kernel/power/em_netlink.h | 39 ++++ > kernel/power/em_netlink_autogen.c | 48 +++++ > kernel/power/em_netlink_autogen.h | 23 +++ > kernel/power/energy_model.c | 85 +++++++- > 10 files changed, 689 insertions(+), 2 deletions(-) > create mode 100644 Documentation/netlink/specs/em.yaml > create mode 100644 include/uapi/linux/energy_model.h > create mode 100644 kernel/power/em_netlink.c > create mode 100644 kernel/power/em_netlink.h > create mode 100644 kernel/power/em_netlink_autogen.c > create mode 100644 kernel/power/em_netlink_autogen.h > You could still keep my review tags for this v6. The minor issues reported by the testing robots and your fixes didn't impact that. (BTW, I suspected there might be those tricky build configurations where something might pop up) So fill free to add in all patches (like it was in v5): Reviewed-by: Lukasz Luba <lukasz.luba@arm.com> Regards, Lukasz
On Tue, Oct 21, 2025 at 12:09 AM Changwoo Min <changwoo@igalia.com> wrote:
>
> Addressed all the comments from Lukasz and rebased the code to the head
> of the linus tree.
>
> There is a need to access the energy model from the userspace. One such
> example is the sched_ext schedulers [1]. The userspace part of the
> sched_ext schedules could feed the (post-processed) energy-model
> information to the BPF part of the scheduler.
>
> Currently, debugfs is the only way to read the energy model from userspace;
> however, it lacks proper notification mechanisms when a performance domain
> and its associated energy model change.
>
> This patch set introduces a generic netlink for the energy model, as
> discussed in [2]. It allows a userspace program to read the performance
> domain and its energy model. It notifies the userspace program when a
> performance domain is created or deleted or its energy model is updated
> through a multicast interface.
>
> Specifically, it supports two commands:
> - EM_CMD_GET_PDS: Get the list of information for all performance
> domains.
> - EM_CMD_GET_PD_TABLE: Get the energy model table of a performance
> domain.
>
> Also, it supports three notification events:
> - EM_CMD_PD_CREATED: When a performance domain is created.
> - EM_CMD_PD_DELETED: When a performance domain is deleted.
> - EM_CMD_PD_UPDATED: When the energy model table of a performance domain
> is updated.
>
> This can be tested using the tool, tools/net/ynl/pyynl/cli.py, for example,
> with the following commands:
>
> $> tools/net/ynl/pyynl/cli.py \
> --spec Documentation/netlink/specs/em.yaml \
> --do get-pds
> $> tools/net/ynl/pyynl/cli.py \
> --spec Documentation/netlink/specs/em.yaml \
> --do get-pd-table --json '{"pd-id": 0}'
> $> tools/net/ynl/pyynl/cli.py \
> --spec Documentation/netlink/specs/em.yaml \
> --subscribe event --sleep 10
>
> [1] https://lwn.net/Articles/922405/
> [2] https://lore.kernel.org/lkml/a82423bc-8c38-4d57-93da-c4f20011cc92@arm.com/
> [3] https://lore.kernel.org/lkml/202506140306.tuIoz8rN-lkp@intel.com/#t
>
> ChangeLog v5 -> v6:
> - Fix two problems reported by the kernel test robot.
> - Conditionally include the iterator/accessor code for the performance
> domain when both CONFIG_ENERGY_MODEL and CONFIG_NET are set to avoid
> the compilation errors (patch 5).
> - Remove an unused variable, `ret`, in em_notify_pd_deleted() to avoid
> a warning (patch 8).
>
> ChangeLog v4 -> v5:
> - Rebase the code to the head of the linus tree.
> - Remove the redundant em_check_capacity_update() call from
> em_dev_register_pd_no_update().
> - Move patch 3 ("PM: EM: Add an iterator and accessor for the
> performance domain") after patch 5 ("PM: EM: Add a skeleton code for
> netlink notification").
> - Move the declaration of for_each_em_perf_domain() and
> em_perf_domain_get_by_id() from energy_model.h to em_netlink.h.
> - Fix a typo in patch 7 ("PM: EM: Implement
> em_nl_get_pd_table_doit()") and change the variable declaration
> order in em_nl_get_pd_table_doit() following the reverse Christmas
> tree order.
> - Remove the empty skeleton code of em_notify_pd_created/updated() from
> patch 8 ("PM: EM: Implement em_notify_pd_deleted()") and introduce
> them later where they are actually implemented.
> - Change the return type of em_notify_pd_created/updated/deleted()
> from int to void, since we don't check it anyway.
>
> ChangeLog v3 -> v4:
> - Move patches [3-5] to the first.
> - Remove the ending period (".") from all of the patch subjects.
> - Rebase the code to v6.17-rc4.
>
> ChangeLog v2 -> v3:
> - Properly initialize a return variable in
> em_notify_pd_created/updated() at an error path (09/10), reported by
> the kernel test robot [3].
> - Remove redundant initialization of a return variable in
> em_notify_pd_deleted() at an error path (08/10).
>
> ChangeLog v1 -> v2:
> - Use YNL to generate boilerplate code. Overhaul the naming conventions
> (command, event, notification, attribute) to follow the typical
> conventions of other YNL-based netlink implementations.
> - Calculate the exact message size instead of using NLMSG_GOODSIZE
> when allocating a message (genlmsg_new). This avoids the reallocation
> of a message.
> - Remove an unnecessary function, em_netlink_exit(), and initialize the
> netlink (em_netlink_init) at em_netlink.c without touching energy_model.c.
>
> Changwoo Min (10):
> PM: EM: Assign a unique ID when creating a performance domain
> PM: EM: Expose the ID of a performance domain via debugfs
> PM: EM: Add em.yaml and autogen files
> PM: EM: Add a skeleton code for netlink notification
> PM: EM: Add an iterator and accessor for the performance domain
> PM: EM: Implement em_nl_get_pds_doit()
> PM: EM: Implement em_nl_get_pd_table_doit()
> PM: EM: Implement em_notify_pd_deleted()
> PM: EM: Implement em_notify_pd_created/updated()
> PM: EM: Notify an event when the performance domain changes
>
> Documentation/netlink/specs/em.yaml | 113 ++++++++++
> MAINTAINERS | 3 +
> include/linux/energy_model.h | 4 +
> include/uapi/linux/energy_model.h | 62 ++++++
> kernel/power/Makefile | 5 +-
> kernel/power/em_netlink.c | 309 ++++++++++++++++++++++++++++
> kernel/power/em_netlink.h | 39 ++++
> kernel/power/em_netlink_autogen.c | 48 +++++
> kernel/power/em_netlink_autogen.h | 23 +++
> kernel/power/energy_model.c | 85 +++++++-
> 10 files changed, 689 insertions(+), 2 deletions(-)
> create mode 100644 Documentation/netlink/specs/em.yaml
> create mode 100644 include/uapi/linux/energy_model.h
> create mode 100644 kernel/power/em_netlink.c
> create mode 100644 kernel/power/em_netlink.h
> create mode 100644 kernel/power/em_netlink_autogen.c
> create mode 100644 kernel/power/em_netlink_autogen.h
>
> --
Is there any particular reason why you have not picked up the tags
received by the previous iteration?
© 2016 - 2025 Red Hat, Inc.