[PATCH v6 00/10] PM: EM: Add netlink support for the energy model

Changwoo Min posted 10 patches 1 month, 3 weeks ago
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
[PATCH v6 00/10] PM: EM: Add netlink support for the energy model
Posted by Changwoo Min 1 month, 3 weeks ago
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
Re: [PATCH v6 00/10] PM: EM: Add netlink support for the energy model
Posted by Lukasz Luba 1 month, 3 weeks ago
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
Re: [PATCH v6 00/10] PM: EM: Add netlink support for the energy model
Posted by Rafael J. Wysocki 1 month, 3 weeks ago
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?