[PATCH 1/3] drm/etnaviv: remove unnecessary local irq disable

Christian Gmeiner christian.gmeiner at gmail.com
Mon Dec 17 16:04:49 UTC 2018


Am Mo., 17. Dez. 2018 um 16:36 Uhr schrieb Lucas Stach <l.stach at pengutronix.de>:
>
> The only event function that is called from IRQ context is event_free,
> which is already using atomic bitmap operations, so we can avoid taking
> the event spinlock in this function completely. As other the other
> functions still using the event spinlock are all called from normal
> process context, we can avoid disabling IRQs while holding the spinlock.
>
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>

Reviewed-by: Christian Gmeiner <christian.gmeiner at gmail.com>

> ---
>  drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 18 +++++-------------
>  1 file changed, 5 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> index 8fbe77cae810..293e248e1b29 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> @@ -976,7 +976,6 @@ int etnaviv_gpu_debugfs(struct etnaviv_gpu *gpu, struct seq_file *m)
>
>  void etnaviv_gpu_recover_hang(struct etnaviv_gpu *gpu)
>  {
> -       unsigned long flags;
>         unsigned int i = 0;
>
>         dev_err(gpu->dev, "recover hung GPU!\n");
> @@ -989,11 +988,11 @@ void etnaviv_gpu_recover_hang(struct etnaviv_gpu *gpu)
>         etnaviv_hw_reset(gpu);
>
>         /* complete all events, the GPU won't do it after the reset */
> -       spin_lock_irqsave(&gpu->event_spinlock, flags);
> +       spin_lock(&gpu->event_spinlock);
>         for_each_set_bit_from(i, gpu->event_bitmap, ETNA_NR_EVENTS)
>                 complete(&gpu->event_free);
>         bitmap_zero(gpu->event_bitmap, ETNA_NR_EVENTS);
> -       spin_unlock_irqrestore(&gpu->event_spinlock, flags);
> +       spin_unlock(&gpu->event_spinlock);
>
>         etnaviv_gpu_hw_init(gpu);
>         gpu->lastctx = NULL;
> @@ -1083,7 +1082,7 @@ static inline bool fence_after(u32 a, u32 b)
>  static int event_alloc(struct etnaviv_gpu *gpu, unsigned nr_events,
>         unsigned int *events)
>  {
> -       unsigned long flags, timeout = msecs_to_jiffies(10 * 10000);
> +       unsigned long timeout = msecs_to_jiffies(10 * 10000);
>         unsigned i, acquired = 0;
>
>         for (i = 0; i < nr_events; i++) {
> @@ -1100,7 +1099,7 @@ static int event_alloc(struct etnaviv_gpu *gpu, unsigned nr_events,
>                 timeout = ret;
>         }
>
> -       spin_lock_irqsave(&gpu->event_spinlock, flags);
> +       spin_lock(&gpu->event_spinlock);
>
>         for (i = 0; i < nr_events; i++) {
>                 int event = find_first_zero_bit(gpu->event_bitmap, ETNA_NR_EVENTS);
> @@ -1110,7 +1109,7 @@ static int event_alloc(struct etnaviv_gpu *gpu, unsigned nr_events,
>                 set_bit(event, gpu->event_bitmap);
>         }
>
> -       spin_unlock_irqrestore(&gpu->event_spinlock, flags);
> +       spin_unlock(&gpu->event_spinlock);
>
>         return 0;
>
> @@ -1123,18 +1122,11 @@ static int event_alloc(struct etnaviv_gpu *gpu, unsigned nr_events,
>
>  static void event_free(struct etnaviv_gpu *gpu, unsigned int event)
>  {
> -       unsigned long flags;
> -
> -       spin_lock_irqsave(&gpu->event_spinlock, flags);
> -
>         if (!test_bit(event, gpu->event_bitmap)) {
>                 dev_warn(gpu->dev, "event %u is already marked as free",
>                          event);
> -               spin_unlock_irqrestore(&gpu->event_spinlock, flags);
>         } else {
>                 clear_bit(event, gpu->event_bitmap);
> -               spin_unlock_irqrestore(&gpu->event_spinlock, flags);
> -
>                 complete(&gpu->event_free);
>         }
>  }
> --
> 2.19.1
>


-- 
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info


More information about the dri-devel mailing list