Re: [PATCH v5 3/3] PM / devfreq: Add required OPPs support to passive governor

2021-02-03 Thread Hsin-Yi Wang
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

2021-02-03 Thread Viresh Kumar
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

2021-02-03 Thread Hsin-Yi Wang
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