Commit 7928339c authored by Changwoo Min's avatar Changwoo Min Committed by Rafael J. Wysocki
Browse files

PM: EM: Add an iterator and accessor for the performance domain



Add an iterator function (for_each_em_perf_domain) that iterates all the
performance domains in the global list. A passed callback function (cb) is
called for each performance domain.

Additionally, add a lookup function (em_perf_domain_get_by_id) that
searches for a performance domain by matching the ID in the global list.

Signed-off-by: default avatarChangwoo Min <changwoo@igalia.com>
Reviewed-by: default avatarLukasz Luba <lukasz.luba@arm.com>
Link: https://patch.msgid.link/20251020220914.320832-6-changwoo@igalia.com


Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent e4ed8d26
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -10,7 +10,21 @@
#define _EM_NETLINK_H

#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_NET)
int for_each_em_perf_domain(int (*cb)(struct em_perf_domain*, void *),
			    void *data);
struct em_perf_domain *em_perf_domain_get_by_id(int id);
#else
static inline
int for_each_em_perf_domain(int (*cb)(struct em_perf_domain*, void *),
			    void *data)
{
	return -EINVAL;
}
static inline
struct em_perf_domain *em_perf_domain_get_by_id(int id)
{
	return NULL;
}
#endif

#endif /* _EM_NETLINK_H */
+38 −0
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
#include <linux/sched/topology.h>
#include <linux/slab.h>

#include "em_netlink.h"

/*
 * Mutex serializing the registrations of performance domains and letting
 * callbacks defined by drivers sleep.
@@ -998,3 +1000,39 @@ void em_rebuild_sched_domains(void)
	 */
	schedule_work(&rebuild_sd_work);
}

#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_NET)
int for_each_em_perf_domain(int (*cb)(struct em_perf_domain*, void *),
			    void *data)
{
	struct em_perf_domain *pd;

	lockdep_assert_not_held(&em_pd_mutex);
	guard(mutex)(&em_pd_list_mutex);

	list_for_each_entry(pd, &em_pd_list, node) {
		int ret;

		ret = cb(pd, data);
		if (ret)
			return ret;
	}

	return 0;
}

struct em_perf_domain *em_perf_domain_get_by_id(int id)
{
	struct em_perf_domain *pd;

	lockdep_assert_not_held(&em_pd_mutex);
	guard(mutex)(&em_pd_list_mutex);

	list_for_each_entry(pd, &em_pd_list, node) {
		if (pd->id == id)
			return pd;
	}

	return NULL;
}
#endif