|
@@ -661,6 +661,7 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
|
|
|
{
|
|
{
|
|
|
uint32_t patched_ihre[KFD_MAX_RING_ENTRY_SIZE];
|
|
uint32_t patched_ihre[KFD_MAX_RING_ENTRY_SIZE];
|
|
|
bool is_patched = false;
|
|
bool is_patched = false;
|
|
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
|
|
if (!kfd->init_complete)
|
|
if (!kfd->init_complete)
|
|
|
return;
|
|
return;
|
|
@@ -670,7 +671,7 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- spin_lock(&kfd->interrupt_lock);
|
|
|
|
|
|
|
+ spin_lock_irqsave(&kfd->interrupt_lock, flags);
|
|
|
|
|
|
|
|
if (kfd->interrupts_active
|
|
if (kfd->interrupts_active
|
|
|
&& interrupt_is_wanted(kfd, ih_ring_entry,
|
|
&& interrupt_is_wanted(kfd, ih_ring_entry,
|
|
@@ -679,7 +680,7 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
|
|
|
is_patched ? patched_ihre : ih_ring_entry))
|
|
is_patched ? patched_ihre : ih_ring_entry))
|
|
|
queue_work(kfd->ih_wq, &kfd->interrupt_work);
|
|
queue_work(kfd->ih_wq, &kfd->interrupt_work);
|
|
|
|
|
|
|
|
- spin_unlock(&kfd->interrupt_lock);
|
|
|
|
|
|
|
+ spin_unlock_irqrestore(&kfd->interrupt_lock, flags);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int kgd2kfd_quiesce_mm(struct mm_struct *mm)
|
|
int kgd2kfd_quiesce_mm(struct mm_struct *mm)
|