diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1341-Revert-drm-amdkfd-Workaround-for-debug-event-not-sig.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1341-Revert-drm-amdkfd-Workaround-for-debug-event-not-sig.patch | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1341-Revert-drm-amdkfd-Workaround-for-debug-event-not-sig.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1341-Revert-drm-amdkfd-Workaround-for-debug-event-not-sig.patch new file mode 100644 index 00000000..e6108eba --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1341-Revert-drm-amdkfd-Workaround-for-debug-event-not-sig.patch @@ -0,0 +1,213 @@ +From d0b9a0151ac56808b845877b079bdead9f325c43 Mon Sep 17 00:00:00 2001 +From: Felix Kuehling <Felix.Kuehling@amd.com> +Date: Sat, 30 Sep 2017 18:02:44 -0400 +Subject: [PATCH 1341/4131] Revert "drm/amdkfd: Workaround for debug event not + signaling" + +This reverts commit 27cef962aa8104b83048aa7fe8b3bc9df5f903e8. + +This workaround is no longer needed. Reverting it makes upstreaming +easier and will allow for more efficient event processing in the +interrupt handler (by using all 12 bits of the event ID). + +Change-Id: I65ae43c584d9af50094020e52a77e181fc59bbe5 +Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_events.c | 108 ++++---------------------------- + drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 2 - + 2 files changed, 12 insertions(+), 98 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c +index c345c50..f565530 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c +@@ -82,15 +82,9 @@ struct signal_page { + * For SQ s_sendmsg interrupts, this is limited to 8 bits. + */ + +-#define INTERRUPT_DATA_BITS 8 ++#define INTERRUPT_DATA_BITS 12 + #define SIGNAL_EVENT_ID_SLOT_SHIFT 0 + +-/* We can only create 8 debug events */ +- +-#define KFD_DEBUG_EVENT_LIMIT 8 +-#define KFD_DEBUG_EVENT_MASK 0x1F +-#define KFD_DEBUG_EVENT_SHIFT 5 +- + static uint64_t *page_slots(struct signal_page *page) + { + return page->kernel_address; +@@ -136,8 +130,6 @@ static bool allocate_signal_page(struct file *devkfd, struct kfd_process *p) + { + void *backing_store; + struct signal_page *page; +- unsigned int slot; +- int i; + + page = kzalloc(sizeof(*page), GFP_KERNEL); + if (!page) +@@ -156,14 +148,6 @@ static bool allocate_signal_page(struct file *devkfd, struct kfd_process *p) + + page->kernel_address = backing_store; + +- /* Set bits of debug events to prevent allocation */ +- for (i = 0 ; i < KFD_DEBUG_EVENT_LIMIT ; i++) { +- slot = (i << KFD_DEBUG_EVENT_SHIFT) | +- KFD_DEBUG_EVENT_MASK; +- __set_bit(slot, page->used_slot_bitmap); +- page->free_slots--; +- } +- + if (list_empty(&p->signal_event_pages)) + page->page_index = 0; + else +@@ -249,39 +233,6 @@ void kfd_free_signal_page_dgpu(struct kfd_process *p, uint64_t handle) + } + } + +-static bool allocate_debug_event_notification_slot(struct file *devkfd, +- struct kfd_process *p, +- struct signal_page **out_page, +- unsigned int *out_slot_index) +-{ +- struct signal_page *page; +- unsigned int slot; +- bool ret; +- +- if (list_empty(&p->signal_event_pages)) { +- ret = allocate_signal_page(devkfd, p); +- if (!ret) +- return ret; +- } +- +- page = list_entry((&p->signal_event_pages)->next, struct signal_page, +- event_pages); +- slot = (p->debug_event_count << KFD_DEBUG_EVENT_SHIFT) | +- KFD_DEBUG_EVENT_MASK; +- +- pr_debug("page == %p\n", page); +- pr_debug("slot == %d\n", slot); +- +- page_slots(page)[slot] = UNSIGNALED_EVENT_SLOT; +- *out_page = page; +- *out_slot_index = slot; +- +- pr_debug("Allocated debug event signal slot in page %p, slot %d\n", +- page, slot); +- +- return true; +-} +- + /* Assumes that the process's event_mutex is locked. */ + static void release_event_notification_slot(struct signal_page *page, + size_t slot_index) +@@ -393,47 +344,22 @@ static int create_signal_event(struct file *devkfd, + struct kfd_process *p, + struct kfd_event *ev) + { +- if ((ev->type == KFD_EVENT_TYPE_SIGNAL) && +- (p->signal_event_count == KFD_SIGNAL_EVENT_LIMIT)) { ++ if (p->signal_event_count == KFD_SIGNAL_EVENT_LIMIT) { + if (!p->signal_event_limit_reached) { + pr_warn("Signal event wasn't created because limit was reached\n"); + p->signal_event_limit_reached = true; + } + return -ENOMEM; +- } else if ((ev->type == KFD_EVENT_TYPE_DEBUG) && +- (p->debug_event_count == KFD_DEBUG_EVENT_LIMIT)) { +- if (!p->debug_event_limit_reached) { +- pr_warn("Debug event wasn't created because limit was reached\n"); +- p->debug_event_limit_reached = true; +- } +- return -ENOMEM; + } + +- if (ev->type == KFD_EVENT_TYPE_SIGNAL) { +- if (!allocate_event_notification_slot(devkfd, p, +- &ev->signal_page, +- &ev->signal_slot_index)) { +- pr_warn("Signal event wasn't created because out of kernel memory\n"); +- return -ENOMEM; +- } +- +- p->signal_event_count++; +- +- if ((p->signal_event_count & KFD_DEBUG_EVENT_MASK) == +- KFD_DEBUG_EVENT_MASK) +- p->signal_event_count++; +- +- } else if (ev->type == KFD_EVENT_TYPE_DEBUG) { +- if (!allocate_debug_event_notification_slot(devkfd, p, +- &ev->signal_page, +- &ev->signal_slot_index)) { +- pr_warn("Debug event wasn't created because out of kernel memory\n"); +- return -ENOMEM; +- } +- +- p->debug_event_count++; ++ if (!allocate_event_notification_slot(devkfd, p, &ev->signal_page, ++ &ev->signal_slot_index)) { ++ pr_warn("Signal event wasn't created because out of kernel memory\n"); ++ return -ENOMEM; + } + ++ p->signal_event_count++; ++ + ev->user_signal_address = + &ev->signal_page->user_address[ev->signal_slot_index]; + +@@ -468,22 +394,14 @@ void kfd_event_init_process(struct kfd_process *p) + INIT_LIST_HEAD(&p->signal_event_pages); + p->next_nonsignal_event_id = KFD_FIRST_NONSIGNAL_EVENT_ID; + p->signal_event_count = 0; +- p->debug_event_count = 0; + } + + static void destroy_event(struct kfd_process *p, struct kfd_event *ev) + { + if (ev->signal_page) { +- if (ev->type == KFD_EVENT_TYPE_SIGNAL) { +- release_event_notification_slot(ev->signal_page, +- ev->signal_slot_index); +- p->signal_event_count--; +- if ((p->signal_event_count & KFD_DEBUG_EVENT_MASK) == +- KFD_DEBUG_EVENT_MASK) +- p->signal_event_count--; +- } else if (ev->type == KFD_EVENT_TYPE_DEBUG) { +- p->debug_event_count--; +- } ++ release_event_notification_slot(ev->signal_page, ++ ev->signal_slot_index); ++ p->signal_event_count--; + } + + /* +@@ -719,9 +637,7 @@ void kfd_signal_event_interrupt(unsigned int pasid, uint32_t partial_id, + + mutex_lock(&p->event_mutex); + +- if ((valid_id_bits >= INTERRUPT_DATA_BITS) && +- ((partial_id & KFD_DEBUG_EVENT_MASK) == +- KFD_DEBUG_EVENT_MASK)) { ++ if (valid_id_bits >= INTERRUPT_DATA_BITS) { + /* Partial ID is a full ID. */ + ev = lookup_event_by_id(p, partial_id); + set_event_from_interrupt(p, ev); +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +index b63e25d..c853956 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +@@ -719,9 +719,7 @@ struct kfd_process { + struct list_head signal_event_pages; + u32 next_nonsignal_event_id; + size_t signal_event_count; +- size_t debug_event_count; + bool signal_event_limit_reached; +- bool debug_event_limit_reached; + + struct rb_root bo_interval_tree; + +-- +2.7.4 + |