[PATCH 13/25] drm/amdkfd: Remove unaligned memory access

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Feb 7, 2018 at 3:32 AM, Felix Kuehling <Felix.Kuehling at amd.com> wrote:
> From: Harish Kasiviswanathan <Harish.Kasiviswanathan at amd.com>
>
> Unaligned atomic operations can cause problems on some CPU
> architectures. Use simpler bitmask operations instead. Atomic bit
> manipulations are not necessary since dqm->lock is held during these
> operations.
>
> Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan at amd.com>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
>  .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c  | 25 ++++++++--------------
>  1 file changed, 9 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> index 47d493e..1a28dc2 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> @@ -118,9 +118,8 @@ static int allocate_vmid(struct device_queue_manager *dqm,
>         if (dqm->vmid_bitmap == 0)
>                 return -ENOMEM;
>
> -       bit = find_first_bit((unsigned long *)&dqm->vmid_bitmap,
> -                               dqm->dev->vm_info.vmid_num_kfd);
> -       clear_bit(bit, (unsigned long *)&dqm->vmid_bitmap);
> +       bit = ffs(dqm->vmid_bitmap) - 1;
> +       dqm->vmid_bitmap &= ~(1 << bit);
>
>         allocated_vmid = bit + dqm->dev->vm_info.first_vmid_kfd;
>         pr_debug("vmid allocation %d\n", allocated_vmid);
> @@ -142,7 +141,7 @@ static void deallocate_vmid(struct device_queue_manager *dqm,
>         /* Release the vmid mapping */
>         set_pasid_vmid_mapping(dqm, 0, qpd->vmid);
>
> -       set_bit(bit, (unsigned long *)&dqm->vmid_bitmap);
> +       dqm->vmid_bitmap |= (1 << bit);
>         qpd->vmid = 0;
>         q->properties.vmid = 0;
>  }
> @@ -223,12 +222,8 @@ static int allocate_hqd(struct device_queue_manager *dqm, struct queue *q)
>                         continue;
>
>                 if (dqm->allocated_queues[pipe] != 0) {
> -                       bit = find_first_bit(
> -                               (unsigned long *)&dqm->allocated_queues[pipe],
> -                               get_queues_per_pipe(dqm));
> -
> -                       clear_bit(bit,
> -                               (unsigned long *)&dqm->allocated_queues[pipe]);
> +                       bit = ffs(dqm->allocated_queues[pipe]) - 1;
> +                       dqm->allocated_queues[pipe] &= ~(1 << bit);
>                         q->pipe = pipe;
>                         q->queue = bit;
>                         set = true;
> @@ -249,7 +244,7 @@ static int allocate_hqd(struct device_queue_manager *dqm, struct queue *q)
>  static inline void deallocate_hqd(struct device_queue_manager *dqm,
>                                 struct queue *q)
>  {
> -       set_bit(q->queue, (unsigned long *)&dqm->allocated_queues[q->pipe]);
> +       dqm->allocated_queues[q->pipe] |= (1 << q->queue);
>  }
>
>  static int create_compute_queue_nocpsch(struct device_queue_manager *dqm,
> @@ -589,10 +584,8 @@ static int allocate_sdma_queue(struct device_queue_manager *dqm,
>         if (dqm->sdma_bitmap == 0)
>                 return -ENOMEM;
>
> -       bit = find_first_bit((unsigned long *)&dqm->sdma_bitmap,
> -                               CIK_SDMA_QUEUES);
> -
> -       clear_bit(bit, (unsigned long *)&dqm->sdma_bitmap);
> +       bit = ffs(dqm->sdma_bitmap) - 1;
> +       dqm->sdma_bitmap &= ~(1 << bit);
>         *sdma_queue_id = bit;
>
>         return 0;
> @@ -603,7 +596,7 @@ static void deallocate_sdma_queue(struct device_queue_manager *dqm,
>  {
>         if (sdma_queue_id >= CIK_SDMA_QUEUES)
>                 return;
> -       set_bit(sdma_queue_id, (unsigned long *)&dqm->sdma_bitmap);
> +       dqm->sdma_bitmap |= (1 << sdma_queue_id);
>  }
>
>  static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm,
> --
> 2.7.4
>

This patch is:
Acked-by: Oded Gabbay <oded.gabbay at gmail.com>


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux