Re: [PATCH v5 3/3] PM / devfreq: Add required OPPs support to passive governor
On Thu, Feb 4, 2021 at 10:49 AM Viresh Kumar wrote: > > On 03-02-21, 17:24, Hsin-Yi Wang wrote: > > From: Saravana Kannan > > > > Look at the required OPPs of the "parent" device to determine the OPP that > > is required from the slave device managed by the passive governor. This > > allows having mappings between a parent device and a slave device even when > > they don't have the same number of OPPs. > > > > Signed-off-by: Saravana Kannan > > Acked-by: MyungJoo Ham > > Acked-by: Chanwoo Choi > > Signed-off-by: Hsin-Yi Wang > > --- > > drivers/devfreq/governor_passive.c | 20 +++- > > 1 file changed, 15 insertions(+), 5 deletions(-) > > > > diff --git a/drivers/devfreq/governor_passive.c > > b/drivers/devfreq/governor_passive.c > > index 63332e4a65ae8..8d92b1964f9c3 100644 > > --- a/drivers/devfreq/governor_passive.c > > +++ b/drivers/devfreq/governor_passive.c > > @@ -19,7 +19,7 @@ static int devfreq_passive_get_target_freq(struct devfreq > > *devfreq, > > = (struct devfreq_passive_data *)devfreq->data; > > struct devfreq *parent_devfreq = (struct devfreq *)p_data->parent; > > unsigned long child_freq = ULONG_MAX; > > - struct dev_pm_opp *opp; > > + struct dev_pm_opp *opp = NULL, *p_opp = NULL; > > I would initialize p_opp to ERR_PTR(-ENODEV) to avoid using > IS_ERR_OR_NULL. There is no need to initialize opp as well. > > > int i, count, ret = 0; > > > > /* > > @@ -56,13 +56,20 @@ static int devfreq_passive_get_target_freq(struct > > devfreq *devfreq, > >* list of parent device. Because in this case, *freq is temporary > >* value which is decided by ondemand governor. > >*/ > > - opp = devfreq_recommended_opp(parent_devfreq->dev.parent, freq, 0); > > - if (IS_ERR(opp)) { > > - ret = PTR_ERR(opp); > > + p_opp = devfreq_recommended_opp(parent_devfreq->dev.parent, freq, 0); > > + if (IS_ERR(p_opp)) { > > + ret = PTR_ERR(p_opp); > > goto out; > > Perhaps just return from here, the goto is useless here. > > > } > > > > - dev_pm_opp_put(opp); > > + if (devfreq->opp_table && parent_devfreq->opp_table) > > + opp = dev_pm_opp_xlate_required_opp(parent_devfreq->opp_table, > > + devfreq->opp_table, > > p_opp); > > + if (opp) { > > This needs to be part of the above if block itself, else the opp will > always be NULL, isn't it ? > > > + *freq = dev_pm_opp_get_freq(opp); > > + dev_pm_opp_put(opp); > > + goto out; > > + } > > > > /* > >* Get the OPP table's index of decided freqeuncy by governor > > @@ -89,6 +96,9 @@ static int devfreq_passive_get_target_freq(struct devfreq > > *devfreq, > > *freq = child_freq; > > > > out: > > + if (!IS_ERR_OR_NULL(opp)) > > you should be checking for p_opp here, isn't it ? And perhaps we don't > need this check as well as p_opp can't be invalid here. > > > + dev_pm_opp_put(p_opp); > > + > > return ret; > > } > > > > -- > > 2.30.0.365.g02bc693789-goog > Thanks for the review. I'll fix them and send next version > -- > viresh
Re: [PATCH v5 3/3] PM / devfreq: Add required OPPs support to passive governor
On 03-02-21, 17:24, Hsin-Yi Wang wrote: > From: Saravana Kannan > > Look at the required OPPs of the "parent" device to determine the OPP that > is required from the slave device managed by the passive governor. This > allows having mappings between a parent device and a slave device even when > they don't have the same number of OPPs. > > Signed-off-by: Saravana Kannan > Acked-by: MyungJoo Ham > Acked-by: Chanwoo Choi > Signed-off-by: Hsin-Yi Wang > --- > drivers/devfreq/governor_passive.c | 20 +++- > 1 file changed, 15 insertions(+), 5 deletions(-) > > diff --git a/drivers/devfreq/governor_passive.c > b/drivers/devfreq/governor_passive.c > index 63332e4a65ae8..8d92b1964f9c3 100644 > --- a/drivers/devfreq/governor_passive.c > +++ b/drivers/devfreq/governor_passive.c > @@ -19,7 +19,7 @@ static int devfreq_passive_get_target_freq(struct devfreq > *devfreq, > = (struct devfreq_passive_data *)devfreq->data; > struct devfreq *parent_devfreq = (struct devfreq *)p_data->parent; > unsigned long child_freq = ULONG_MAX; > - struct dev_pm_opp *opp; > + struct dev_pm_opp *opp = NULL, *p_opp = NULL; I would initialize p_opp to ERR_PTR(-ENODEV) to avoid using IS_ERR_OR_NULL. There is no need to initialize opp as well. > int i, count, ret = 0; > > /* > @@ -56,13 +56,20 @@ static int devfreq_passive_get_target_freq(struct devfreq > *devfreq, >* list of parent device. Because in this case, *freq is temporary >* value which is decided by ondemand governor. >*/ > - opp = devfreq_recommended_opp(parent_devfreq->dev.parent, freq, 0); > - if (IS_ERR(opp)) { > - ret = PTR_ERR(opp); > + p_opp = devfreq_recommended_opp(parent_devfreq->dev.parent, freq, 0); > + if (IS_ERR(p_opp)) { > + ret = PTR_ERR(p_opp); > goto out; Perhaps just return from here, the goto is useless here. > } > > - dev_pm_opp_put(opp); > + if (devfreq->opp_table && parent_devfreq->opp_table) > + opp = dev_pm_opp_xlate_required_opp(parent_devfreq->opp_table, > + devfreq->opp_table, p_opp); > + if (opp) { This needs to be part of the above if block itself, else the opp will always be NULL, isn't it ? > + *freq = dev_pm_opp_get_freq(opp); > + dev_pm_opp_put(opp); > + goto out; > + } > > /* >* Get the OPP table's index of decided freqeuncy by governor > @@ -89,6 +96,9 @@ static int devfreq_passive_get_target_freq(struct devfreq > *devfreq, > *freq = child_freq; > > out: > + if (!IS_ERR_OR_NULL(opp)) you should be checking for p_opp here, isn't it ? And perhaps we don't need this check as well as p_opp can't be invalid here. > + dev_pm_opp_put(p_opp); > + > return ret; > } > > -- > 2.30.0.365.g02bc693789-goog -- viresh
[PATCH v5 3/3] PM / devfreq: Add required OPPs support to passive governor
From: Saravana Kannan Look at the required OPPs of the "parent" device to determine the OPP that is required from the slave device managed by the passive governor. This allows having mappings between a parent device and a slave device even when they don't have the same number of OPPs. Signed-off-by: Saravana Kannan Acked-by: MyungJoo Ham Acked-by: Chanwoo Choi Signed-off-by: Hsin-Yi Wang --- drivers/devfreq/governor_passive.c | 20 +++- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c index 63332e4a65ae8..8d92b1964f9c3 100644 --- a/drivers/devfreq/governor_passive.c +++ b/drivers/devfreq/governor_passive.c @@ -19,7 +19,7 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq, = (struct devfreq_passive_data *)devfreq->data; struct devfreq *parent_devfreq = (struct devfreq *)p_data->parent; unsigned long child_freq = ULONG_MAX; - struct dev_pm_opp *opp; + struct dev_pm_opp *opp = NULL, *p_opp = NULL; int i, count, ret = 0; /* @@ -56,13 +56,20 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq, * list of parent device. Because in this case, *freq is temporary * value which is decided by ondemand governor. */ - opp = devfreq_recommended_opp(parent_devfreq->dev.parent, freq, 0); - if (IS_ERR(opp)) { - ret = PTR_ERR(opp); + p_opp = devfreq_recommended_opp(parent_devfreq->dev.parent, freq, 0); + if (IS_ERR(p_opp)) { + ret = PTR_ERR(p_opp); goto out; } - dev_pm_opp_put(opp); + if (devfreq->opp_table && parent_devfreq->opp_table) + opp = dev_pm_opp_xlate_required_opp(parent_devfreq->opp_table, + devfreq->opp_table, p_opp); + if (opp) { + *freq = dev_pm_opp_get_freq(opp); + dev_pm_opp_put(opp); + goto out; + } /* * Get the OPP table's index of decided freqeuncy by governor @@ -89,6 +96,9 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq, *freq = child_freq; out: + if (!IS_ERR_OR_NULL(opp)) + dev_pm_opp_put(p_opp); + return ret; } -- 2.30.0.365.g02bc693789-goog