On Mon, Aug 5, 2019 at 8:33 AM Georgi Djakov <georgi.djakov@xxxxxxxxxx> wrote: > > Introduce an optional callback in interconnect provider drivers. It can be > used for implementing actions, that need to be executed before the actual > aggregation of the bandwidth requests has started. > > The benefit of this for now is that it will significantly simplify the code > in provider drivers. > > Suggested-by: Evan Green <evgreen@xxxxxxxxxxxx> > Signed-off-by: Georgi Djakov <georgi.djakov@xxxxxxxxxx> Thanks Georgi, I like it! We should confirm that it actually does allow David to remove the sum_avg_cached and max_peak_cached shadow arrays. > --- > drivers/interconnect/core.c | 3 +++ > include/linux/interconnect-provider.h | 3 +++ > 2 files changed, 6 insertions(+) > > diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c > index 251354bb7fdc..7b971228df38 100644 > --- a/drivers/interconnect/core.c > +++ b/drivers/interconnect/core.c > @@ -205,6 +205,9 @@ static int aggregate_requests(struct icc_node *node) > node->avg_bw = 0; > node->peak_bw = 0; > > + if (p->pre_aggregate) > + p->pre_aggregate(node); > + > hlist_for_each_entry(r, &node->req_list, req_node) > p->aggregate(node, r->tag, r->avg_bw, r->peak_bw, > &node->avg_bw, &node->peak_bw); > diff --git a/include/linux/interconnect-provider.h b/include/linux/interconnect-provider.h > index 4ee19fd41568..fd42bd19302d 100644 > --- a/include/linux/interconnect-provider.h > +++ b/include/linux/interconnect-provider.h > @@ -36,6 +36,8 @@ struct icc_node *of_icc_xlate_onecell(struct of_phandle_args *spec, > * @nodes: internal list of the interconnect provider nodes > * @set: pointer to device specific set operation function > * @aggregate: pointer to device specific aggregate operation function > + * @pre_aggregate: pointer to device specific function that is called > + * before the aggregation begins (optional) > * @xlate: provider-specific callback for mapping nodes from phandle arguments > * @dev: the device this interconnect provider belongs to > * @users: count of active users > @@ -47,6 +49,7 @@ struct icc_provider { > int (*set)(struct icc_node *src, struct icc_node *dst); > int (*aggregate)(struct icc_node *node, u32 tag, u32 avg_bw, > u32 peak_bw, u32 *agg_avg, u32 *agg_peak); > + int (*pre_aggregate)(struct icc_node *node); > struct icc_node* (*xlate)(struct of_phandle_args *spec, void *data); > struct device *dev; > int users;