Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdkfd: Improve signal event slow path

If event slot is not signaled, kfd_signal_event_interrupt goes to slow
path to scan all event slots to find the signaled event, this is needed
for old ASICs that don't have the event ID or the event IDs are
incorrect in the IH payload.

There is case that GPU signal the same event twice, then driver process
the first event interrupt, set_event and event slot is auto-reset, then
for the second event interrupt, KFD goes to slow path as event is not
signaled, just drop the second event interrupt because the application
only need wakeup once.

Signed-off-by: Philip Yang <Philip.Yang@amd.com>
Reviewed-by: Felix Kuehling <felix.kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Philip Yang and committed by
Alex Deucher
de844846 34db5a32

+11
+11
drivers/gpu/drm/amd/amdkfd/kfd_events.c
··· 748 748 uint64_t *slots = page_slots(p->signal_page); 749 749 uint32_t id; 750 750 751 + /* 752 + * If id is valid but slot is not signaled, GPU may signal the same event twice 753 + * before driver have chance to process the first interrupt, then signal slot is 754 + * auto-reset after set_event wakeup the user space, just drop the second event as 755 + * the application only need wakeup once. 756 + */ 757 + if ((valid_id_bits > 31 || (1U << valid_id_bits) >= KFD_SIGNAL_EVENT_LIMIT) && 758 + partial_id < KFD_SIGNAL_EVENT_LIMIT && slots[partial_id] == UNSIGNALED_EVENT_SLOT) 759 + goto out_unlock; 760 + 751 761 if (valid_id_bits) 752 762 pr_debug_ratelimited("Partial ID invalid: %u (%u valid bits)\n", 753 763 partial_id, valid_id_bits); ··· 786 776 } 787 777 } 788 778 779 + out_unlock: 789 780 rcu_read_unlock(); 790 781 kfd_unref_process(p); 791 782 }