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>