Re: [PATCH] drm/etnaviv: rework perfmon query infrastructure

From: Christian Gmeiner
Date: Fri Feb 28 2020 - 05:39:20 EST


Hi Lucas,

Am Mi., 26. Feb. 2020 um 16:19 Uhr schrieb Lucas Stach <l.stach@xxxxxxxxxxxxxx>:
>
> Hi Christian,
>
> sorry for taking so long to get around to this.
>

No problem...

> On Mo, 2020-01-06 at 11:43 +0100, Christian Gmeiner wrote:
> > Report the correct perfmon domains and signals depending
> > on the supported feature flags.
> >
> > Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>
> > Fixes: 9e2c2e273012 ("drm/etnaviv: add infrastructure to query perf counter")
> > Cc: stable@xxxxxxxxxxxxxxx
> > Signed-off-by: Christian Gmeiner <christian.gmeiner@xxxxxxxxx>
> > ---
> > drivers/gpu/drm/etnaviv/etnaviv_perfmon.c | 57 ++++++++++++++++++++---
> > 1 file changed, 50 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c b/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c
> > index 8adbf2861bff..7ae8f347ca06 100644
> > --- a/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c
> > +++ b/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c
> > @@ -32,6 +32,7 @@ struct etnaviv_pm_domain {
> > };
> >
> > struct etnaviv_pm_domain_meta {
> > + unsigned int feature;
> > const struct etnaviv_pm_domain *domains;
> > u32 nr_domains;
> > };
> > @@ -410,36 +411,78 @@ static const struct etnaviv_pm_domain doms_vg[] = {
> >
> > static const struct etnaviv_pm_domain_meta doms_meta[] = {
> > {
> > + .feature = chipFeatures_PIPE_3D,
> > .nr_domains = ARRAY_SIZE(doms_3d),
> > .domains = &doms_3d[0]
> > },
> > {
> > + .feature = chipFeatures_PIPE_2D,
> > .nr_domains = ARRAY_SIZE(doms_2d),
> > .domains = &doms_2d[0]
> > },
> > {
> > + .feature = chipFeatures_PIPE_VG,
> > .nr_domains = ARRAY_SIZE(doms_vg),
> > .domains = &doms_vg[0]
> > }
> > };
> >
> > +static unsigned int num_pm_domains(const struct etnaviv_gpu *gpu)
> > +{
> > + unsigned int num = 0, i;
> > +
> > + for (i = 0; i < ARRAY_SIZE(doms_meta); i++) {
> > + const struct etnaviv_pm_domain_meta *meta = &doms_meta[i];
> > +
> > + if (gpu->identity.features & meta->feature)
> > + num += meta->nr_domains;
> > + }
> > +
> > + return num;
> > +}
> > +
> > +static const struct etnaviv_pm_domain *pm_domain(const struct etnaviv_gpu *gpu,
> > + unsigned int index)
> > +{
> > + const struct etnaviv_pm_domain *domain = NULL;
> > + unsigned int offset = 0, i;
> > +
> > + for (i = 0; i < ARRAY_SIZE(doms_meta); i++) {
> > + const struct etnaviv_pm_domain_meta *meta = &doms_meta[i];
> > +
> > + if (!(gpu->identity.features & meta->feature))
> > + continue;
> > +
> > + if (meta->nr_domains < (index - offset)) {
> > + offset += meta->nr_domains;
> > + continue;
> > + }
> > +
> > + domain = meta->domains + (index - offset);
> > + }
> > +
> > + BUG_ON(!domain);
>
> This is a no-go. BUG_ON is reserved for only the most severe kernel
> bugs where you can't possibly continue without risking a corruption of
> non-volatile state. This isn't the case here, please instead just make
> the callers handle a NULL return gracefully.
>

Fixed it in V2.

--
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info/privacypolicy