On Sat, Oct 21, 2017 at 3:23 AM, Felix Kuehling <Felix.Kuehling at amd.com> wrote: > From: Andres Rodriguez <andres.rodriguez at amd.com> > > In systems under heavy load the IH work may experience significant > scheduling delays. > > Under load + system workqueue: > Max Latency: 7.023695 ms > Avg Latency: 0.263994 ms > > Under load + high priority workqueue: > Max Latency: 1.162568 ms > Avg Latency: 0.163213 ms > > Further work is required to measure the impact of per-cpu settings on IH > performance. > > Signed-off-by: Andres Rodriguez <andres.rodriguez at amd.com> > Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com> > --- > drivers/gpu/drm/amd/amdkfd/kfd_device.c | 2 +- > drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c | 3 ++- > drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 1 + > 3 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c > index 46049f0..621a3b5 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c > @@ -403,7 +403,7 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry) > if (kfd->interrupts_active > && interrupt_is_wanted(kfd, ih_ring_entry) > && enqueue_ih_ring_entry(kfd, ih_ring_entry)) > - schedule_work(&kfd->interrupt_work); > + queue_work(kfd->ih_wq, &kfd->interrupt_work); > > spin_unlock(&kfd->interrupt_lock); > } > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c > index 9c08d46..035c351 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c > @@ -61,6 +61,7 @@ int kfd_interrupt_init(struct kfd_dev *kfd) > return r; > } > > + kfd->ih_wq = alloc_workqueue("KFD IH", WQ_HIGHPRI, 1); > spin_lock_init(&kfd->interrupt_lock); > > INIT_WORK(&kfd->interrupt_work, interrupt_wq); > @@ -95,7 +96,7 @@ void kfd_interrupt_exit(struct kfd_dev *kfd) > * work-queue items that will access interrupt_ring. New work items > * can't be created because we stopped interrupt handling above. > */ > - flush_work(&kfd->interrupt_work); > + flush_workqueue(kfd->ih_wq); > > kfifo_free(&kfd->ih_fifo); > } > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h > index e8d6c0e..bf29021 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h > @@ -184,6 +184,7 @@ struct kfd_dev { > > /* Interrupts */ > struct kfifo ih_fifo; > + struct workqueue_struct *ih_wq; > struct work_struct interrupt_work; > spinlock_t interrupt_lock; > > -- > 2.7.4 > This patch is: Acked-by: Oded Gabbay <oded.gabbay at gmail.com>