lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAH9NwWcW-kq_GzhsfZboLKfGZj6=40Qi6Pf8-WoO4J6VOqzgoQ@mail.gmail.com>
Date:   Fri, 21 Feb 2020 09:28:06 +0100
From:   Christian Gmeiner <christian.gmeiner@...il.com>
To:     LKML <linux-kernel@...r.kernel.org>
Cc:     Dan Carpenter <dan.carpenter@...cle.com>, stable@...r.kernel.org,
        Lucas Stach <l.stach@...gutronix.de>,
        Russell King <linux+etnaviv@...linux.org.uk>,
        David Airlie <airlied@...ux.ie>,
        Daniel Vetter <daniel@...ll.ch>,
        The etnaviv authors <etnaviv@...ts.freedesktop.org>,
        DRI mailing list <dri-devel@...ts.freedesktop.org>
Subject: Re: [PATCH] drm/etnaviv: rework perfmon query infrastructure

Am Mo., 6. Jan. 2020 um 11:43 Uhr schrieb Christian Gmeiner
<christian.gmeiner@...il.com>:
>
> Report the correct perfmon domains and signals depending
> on the supported feature flags.
>
> Reported-by: Dan Carpenter <dan.carpenter@...cle.com>
> Fixes: 9e2c2e273012 ("drm/etnaviv: add infrastructure to query perf counter")
> Cc: stable@...r.kernel.org
> Signed-off-by: Christian Gmeiner <christian.gmeiner@...il.com>
> ---
>  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);
> +
> +       return domain;
> +}
> +
>  int etnaviv_pm_query_dom(struct etnaviv_gpu *gpu,
>         struct drm_etnaviv_pm_domain *domain)
>  {
> -       const struct etnaviv_pm_domain_meta *meta = &doms_meta[domain->pipe];
> +       const unsigned int nr_domains = num_pm_domains(gpu);
>         const struct etnaviv_pm_domain *dom;
>
> -       if (domain->iter >= meta->nr_domains)
> +       if (domain->iter >= nr_domains)
>                 return -EINVAL;
>
> -       dom = meta->domains + domain->iter;
> +       dom = pm_domain(gpu, domain->iter);
>
>         domain->id = domain->iter;
>         domain->nr_signals = dom->nr_signals;
>         strncpy(domain->name, dom->name, sizeof(domain->name));
>
>         domain->iter++;
> -       if (domain->iter == meta->nr_domains)
> +       if (domain->iter == nr_domains)
>                 domain->iter = 0xff;
>
>         return 0;
> @@ -448,14 +491,14 @@ int etnaviv_pm_query_dom(struct etnaviv_gpu *gpu,
>  int etnaviv_pm_query_sig(struct etnaviv_gpu *gpu,
>         struct drm_etnaviv_pm_signal *signal)
>  {
> -       const struct etnaviv_pm_domain_meta *meta = &doms_meta[signal->pipe];
> +       const unsigned int nr_domains = num_pm_domains(gpu);
>         const struct etnaviv_pm_domain *dom;
>         const struct etnaviv_pm_signal *sig;
>
> -       if (signal->domain >= meta->nr_domains)
> +       if (signal->domain >= nr_domains)
>                 return -EINVAL;
>
> -       dom = meta->domains + signal->domain;
> +       dom = pm_domain(gpu, signal->domain);
>
>         if (signal->iter >= dom->nr_signals)
>                 return -EINVAL;
> --
> 2.24.1
>

ping

-- 
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info/privacypolicy

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ