Depending on the interrupt ring, the IRQ dispatch and processing functions will run in interrupt context or in a worker thread. Is there a way for the processing functions to find out which context it's running in? That may influence decisions whether to process interrupts in the same thread or schedule another worker. Regards, Felix On 2018-12-05 4:15 a.m., Christian König wrote: > Previously we only added the ring buffer memory, now add the handling as > well. > > Signed-off-by: Christian König <christian.koenig@xxxxxxx> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 33 +++++++++++++++++++++++++ > drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h | 4 ++- > 2 files changed, 36 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c > index b8e543e23166..8bfb3dab46f7 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c > @@ -176,6 +176,36 @@ irqreturn_t amdgpu_irq_handler(int irq, void *arg) > return ret; > } > > +/** > + * amdgpu_irq_handle_ih1 - kick of processing for IH1 > + * > + * @work: work structure in struct amdgpu_irq > + * > + * Kick of processing IH ring 1. > + */ > +static void amdgpu_irq_handle_ih1(struct work_struct *work) > +{ > + struct amdgpu_device *adev = container_of(work, struct amdgpu_device, > + irq.ih1_work); > + > + amdgpu_ih_process(adev, &adev->irq.ih1, amdgpu_irq_callback); > +} > + > +/** > + * amdgpu_irq_handle_ih2 - kick of processing for IH2 > + * > + * @work: work structure in struct amdgpu_irq > + * > + * Kick of processing IH ring 2. > + */ > +static void amdgpu_irq_handle_ih2(struct work_struct *work) > +{ > + struct amdgpu_device *adev = container_of(work, struct amdgpu_device, > + irq.ih2_work); > + > + amdgpu_ih_process(adev, &adev->irq.ih2, amdgpu_irq_callback); > +} > + > /** > * amdgpu_msi_ok - check whether MSI functionality is enabled > * > @@ -240,6 +270,9 @@ int amdgpu_irq_init(struct amdgpu_device *adev) > amdgpu_hotplug_work_func); > } > > + INIT_WORK(&adev->irq.ih1_work, amdgpu_irq_handle_ih1); > + INIT_WORK(&adev->irq.ih2_work, amdgpu_irq_handle_ih2); > + > adev->irq.installed = true; > r = drm_irq_install(adev->ddev, adev->ddev->pdev->irq); > if (r) { > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h > index 7e06fa64321a..c27decfda494 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h > @@ -89,7 +89,9 @@ struct amdgpu_irq { > > /* interrupt rings */ > struct amdgpu_ih_ring ih, ih1, ih2; > - const struct amdgpu_ih_funcs *ih_funcs; > + const struct amdgpu_ih_funcs *ih_funcs; > + struct work_struct ih1_work, ih2_work; > + struct amdgpu_irq_src self_irq; > > /* gen irq stuff */ > struct irq_domain *domain; /* GPU irq controller domain */ _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx