Lines Matching +full:signal +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0 OR MIT
3 * Copyright 2014-2022 Advanced Micro Devices, Inc.
27 #include <linux/sched/signal.h>
44 bool event_age_enabled; /* set to true when last_event_age is non-zero */
48 * Each signal event needs a 64-bit signal slot where the signaler will write
52 * Individual signal events use their event_id as slot index.
62 return page->kernel_address; in page_slots()
83 page->kernel_address = backing_store; in allocate_signal_page()
84 page->need_to_free_pages = true; in allocate_signal_page()
85 pr_debug("Allocated new event signal page at %p, for process %p\n", in allocate_signal_page()
99 int id; in allocate_event_notification_slot() local
101 if (!p->signal_page) { in allocate_event_notification_slot()
102 p->signal_page = allocate_signal_page(p); in allocate_event_notification_slot()
103 if (!p->signal_page) in allocate_event_notification_slot()
104 return -ENOMEM; in allocate_event_notification_slot()
106 p->signal_mapped_size = 256*8; in allocate_event_notification_slot()
110 id = idr_alloc(&p->event_idr, ev, *restore_id, *restore_id + 1, in allocate_event_notification_slot()
114 * Compatibility with old user mode: Only use signal slots in allocate_event_notification_slot()
119 id = idr_alloc(&p->event_idr, ev, 0, p->signal_mapped_size / 8, in allocate_event_notification_slot()
122 if (id < 0) in allocate_event_notification_slot()
123 return id; in allocate_event_notification_slot()
125 ev->event_id = id; in allocate_event_notification_slot()
126 page_slots(p->signal_page)[id] = UNSIGNALED_EVENT_SLOT; in allocate_event_notification_slot()
132 * Assumes that p->event_mutex or rcu_readlock is held and of course that p is
135 static struct kfd_event *lookup_event_by_id(struct kfd_process *p, uint32_t id) in lookup_event_by_id() argument
137 return idr_find(&p->event_idr, id); in lookup_event_by_id()
141 * lookup_signaled_event_by_partial_id - Lookup signaled event from partial ID
143 * @id: ID to look up
144 * @bits: Number of valid bits in @id
146 * Finds the first signaled event with a matching partial ID. If no
148 * caller should assume that the partial ID is invalid and do an
151 * If multiple events with the same partial ID signal at the same
158 struct kfd_process *p, uint32_t id, uint32_t bits) in lookup_signaled_event_by_partial_id() argument
162 if (!p->signal_page || id >= KFD_SIGNAL_EVENT_LIMIT) in lookup_signaled_event_by_partial_id()
165 /* Fast path for the common case that @id is not a partial ID in lookup_signaled_event_by_partial_id()
169 if (page_slots(p->signal_page)[id] == UNSIGNALED_EVENT_SLOT) in lookup_signaled_event_by_partial_id()
172 return idr_find(&p->event_idr, id); in lookup_signaled_event_by_partial_id()
178 for (ev = NULL; id < KFD_SIGNAL_EVENT_LIMIT && !ev; id += 1U << bits) { in lookup_signaled_event_by_partial_id()
179 if (page_slots(p->signal_page)[id] == UNSIGNALED_EVENT_SLOT) in lookup_signaled_event_by_partial_id()
182 ev = idr_find(&p->event_idr, id); in lookup_signaled_event_by_partial_id()
193 if (p->signal_mapped_size && in create_signal_event()
194 p->signal_event_count == p->signal_mapped_size / 8) { in create_signal_event()
195 if (!p->signal_event_limit_reached) { in create_signal_event()
196 pr_debug("Signal event wasn't created because limit was reached\n"); in create_signal_event()
197 p->signal_event_limit_reached = true; in create_signal_event()
199 return -ENOSPC; in create_signal_event()
204 pr_warn("Signal event wasn't created because out of kernel memory\n"); in create_signal_event()
208 p->signal_event_count++; in create_signal_event()
210 ev->user_signal_address = &p->signal_page->user_address[ev->event_id]; in create_signal_event()
211 pr_debug("Signal event number %zu created with id %d, address %p\n", in create_signal_event()
212 p->signal_event_count, ev->event_id, in create_signal_event()
213 ev->user_signal_address); in create_signal_event()
220 int id; in create_other_event() local
223 id = idr_alloc(&p->event_idr, ev, *restore_id, *restore_id + 1, in create_other_event()
227 * intentional integer overflow to -1 without a compiler in create_other_event()
231 id = idr_alloc(&p->event_idr, ev, KFD_FIRST_NONSIGNAL_EVENT_ID, in create_other_event()
235 if (id < 0) in create_other_event()
236 return id; in create_other_event()
237 ev->event_id = id; in create_other_event()
244 int id; in kfd_event_init_process() local
246 mutex_init(&p->event_mutex); in kfd_event_init_process()
247 idr_init(&p->event_idr); in kfd_event_init_process()
248 p->signal_page = NULL; in kfd_event_init_process()
249 p->signal_event_count = 1; in kfd_event_init_process()
250 /* Allocate event ID 0. It is used for a fast path to ignore bogus events in kfd_event_init_process()
251 * that are sent by the CP without a context ID in kfd_event_init_process()
253 id = idr_alloc(&p->event_idr, NULL, 0, 1, GFP_KERNEL); in kfd_event_init_process()
254 if (id < 0) { in kfd_event_init_process()
255 idr_destroy(&p->event_idr); in kfd_event_init_process()
256 mutex_destroy(&p->event_mutex); in kfd_event_init_process()
257 return id; in kfd_event_init_process()
267 spin_lock(&ev->lock); in destroy_event()
268 list_for_each_entry(waiter, &ev->wq.head, wait.entry) in destroy_event()
269 WRITE_ONCE(waiter->event, NULL); in destroy_event()
270 wake_up_all(&ev->wq); in destroy_event()
271 spin_unlock(&ev->lock); in destroy_event()
273 if (ev->type == KFD_EVENT_TYPE_SIGNAL || in destroy_event()
274 ev->type == KFD_EVENT_TYPE_DEBUG) in destroy_event()
275 p->signal_event_count--; in destroy_event()
277 idr_remove(&p->event_idr, ev->event_id); in destroy_event()
284 uint32_t id; in destroy_events() local
286 idr_for_each_entry(&p->event_idr, ev, id) in destroy_events()
289 idr_destroy(&p->event_idr); in destroy_events()
290 mutex_destroy(&p->event_mutex); in destroy_events()
299 struct kfd_signal_page *page = p->signal_page; in shutdown_signal_page()
302 if (page->need_to_free_pages) in shutdown_signal_page()
303 free_pages((unsigned long)page->kernel_address, in shutdown_signal_page()
317 return ev->type == KFD_EVENT_TYPE_SIGNAL || in event_can_be_gpu_signaled()
318 ev->type == KFD_EVENT_TYPE_DEBUG; in event_can_be_gpu_signaled()
323 return ev->type == KFD_EVENT_TYPE_SIGNAL; in event_can_be_cpu_signaled()
331 if (p->signal_page) in kfd_event_page_set()
332 return -EBUSY; in kfd_event_page_set()
336 return -ENOMEM; in kfd_event_page_set()
342 page->kernel_address = kernel_address; in kfd_event_page_set()
344 p->signal_page = page; in kfd_event_page_set()
345 p->signal_mapped_size = size; in kfd_event_page_set()
346 p->signal_handle = user_handle; in kfd_event_page_set()
358 if (p->signal_page) { in kfd_kmap_event_page()
360 return -EINVAL; in kfd_kmap_event_page()
365 pr_err("Getting device by id failed in %s\n", __func__); in kfd_kmap_event_page()
366 return -EINVAL; in kfd_kmap_event_page()
368 kfd = pdd->dev; in kfd_kmap_event_page()
378 return -EINVAL; in kfd_kmap_event_page()
405 return -ENOMEM; in kfd_event_create()
407 ev->type = event_type; in kfd_event_create()
408 ev->auto_reset = auto_reset; in kfd_event_create()
409 ev->signaled = false; in kfd_event_create()
411 spin_lock_init(&ev->lock); in kfd_event_create()
412 init_waitqueue_head(&ev->wq); in kfd_event_create()
416 mutex_lock(&p->event_mutex); in kfd_event_create()
424 *event_slot_index = ev->event_id; in kfd_event_create()
433 *event_id = ev->event_id; in kfd_event_create()
434 *event_trigger_data = ev->event_id; in kfd_event_create()
435 ev->event_age = 1; in kfd_event_create()
440 mutex_unlock(&p->event_mutex); in kfd_event_create()
457 return -ENOMEM; in kfd_criu_restore_event()
461 ret = -ENOMEM; in kfd_criu_restore_event()
466 ret = -EINVAL; in kfd_criu_restore_event()
472 ret = -EFAULT; in kfd_criu_restore_event()
477 if (ev_priv->user_handle) { in kfd_criu_restore_event()
478 ret = kfd_kmap_event_page(p, ev_priv->user_handle); in kfd_criu_restore_event()
483 ev->type = ev_priv->type; in kfd_criu_restore_event()
484 ev->auto_reset = ev_priv->auto_reset; in kfd_criu_restore_event()
485 ev->signaled = ev_priv->signaled; in kfd_criu_restore_event()
487 spin_lock_init(&ev->lock); in kfd_criu_restore_event()
488 init_waitqueue_head(&ev->wq); in kfd_criu_restore_event()
490 mutex_lock(&p->event_mutex); in kfd_criu_restore_event()
491 switch (ev->type) { in kfd_criu_restore_event()
494 ret = create_signal_event(devkfd, p, ev, &ev_priv->event_id); in kfd_criu_restore_event()
497 memcpy(&ev->memory_exception_data, in kfd_criu_restore_event()
498 &ev_priv->memory_exception_data, in kfd_criu_restore_event()
501 ret = create_other_event(p, ev, &ev_priv->event_id); in kfd_criu_restore_event()
504 memcpy(&ev->hw_exception_data, in kfd_criu_restore_event()
505 &ev_priv->hw_exception_data, in kfd_criu_restore_event()
508 ret = create_other_event(p, ev, &ev_priv->event_id); in kfd_criu_restore_event()
511 mutex_unlock(&p->event_mutex); in kfd_criu_restore_event()
539 return -ENOMEM; in kfd_criu_checkpoint_events()
542 idr_for_each_entry(&p->event_idr, ev, ev_id) { in kfd_criu_checkpoint_events()
551 ev_priv->object_type = KFD_CRIU_OBJECT_TYPE_EVENT; in kfd_criu_checkpoint_events()
554 if (i == 0 && p->signal_page) in kfd_criu_checkpoint_events()
555 ev_priv->user_handle = p->signal_handle; in kfd_criu_checkpoint_events()
557 ev_priv->event_id = ev->event_id; in kfd_criu_checkpoint_events()
558 ev_priv->auto_reset = ev->auto_reset; in kfd_criu_checkpoint_events()
559 ev_priv->type = ev->type; in kfd_criu_checkpoint_events()
560 ev_priv->signaled = ev->signaled; in kfd_criu_checkpoint_events()
562 if (ev_priv->type == KFD_EVENT_TYPE_MEMORY) in kfd_criu_checkpoint_events()
563 memcpy(&ev_priv->memory_exception_data, in kfd_criu_checkpoint_events()
564 &ev->memory_exception_data, in kfd_criu_checkpoint_events()
566 else if (ev_priv->type == KFD_EVENT_TYPE_HW_EXCEPTION) in kfd_criu_checkpoint_events()
567 memcpy(&ev_priv->hw_exception_data, in kfd_criu_checkpoint_events()
568 &ev->hw_exception_data, in kfd_criu_checkpoint_events()
571 pr_debug("Checkpointed event[%d] id = 0x%08x auto_reset = %x type = %x signaled = %x\n", in kfd_criu_checkpoint_events()
573 ev_priv->event_id, in kfd_criu_checkpoint_events()
574 ev_priv->auto_reset, in kfd_criu_checkpoint_events()
575 ev_priv->type, in kfd_criu_checkpoint_events()
576 ev_priv->signaled); in kfd_criu_checkpoint_events()
584 ret = -EFAULT; in kfd_criu_checkpoint_events()
596 uint32_t id; in kfd_get_num_events() local
599 idr_for_each_entry(&p->event_idr, ev, id) in kfd_get_num_events()
611 mutex_lock(&p->event_mutex); in kfd_event_destroy()
618 ret = -EINVAL; in kfd_event_destroy()
620 mutex_unlock(&p->event_mutex); in kfd_event_destroy()
628 /* Auto reset if the list is non-empty and we're waking in set_event()
630 * protected by the ev->lock, which is also held when in set_event()
633 ev->signaled = !ev->auto_reset || !waitqueue_active(&ev->wq); in set_event()
634 if (!(++ev->event_age)) { in set_event()
636 ev->event_age = 2; in set_event()
640 list_for_each_entry(waiter, &ev->wq.head, wait.entry) in set_event()
641 WRITE_ONCE(waiter->activated, true); in set_event()
643 wake_up_all(&ev->wq); in set_event()
656 ret = -EINVAL; in kfd_set_event()
659 spin_lock(&ev->lock); in kfd_set_event()
664 ret = -EINVAL; in kfd_set_event()
666 spin_unlock(&ev->lock); in kfd_set_event()
674 ev->signaled = false; in reset_event()
687 ret = -EINVAL; in kfd_reset_event()
690 spin_lock(&ev->lock); in kfd_reset_event()
695 ret = -EINVAL; in kfd_reset_event()
697 spin_unlock(&ev->lock); in kfd_reset_event()
706 WRITE_ONCE(page_slots(p->signal_page)[ev->event_id], UNSIGNALED_EVENT_SLOT); in acknowledge_signal()
714 spin_lock(&ev->lock); in set_event_from_interrupt()
716 spin_unlock(&ev->lock); in set_event_from_interrupt()
742 } else if (p->signal_page) { in kfd_signal_event_interrupt()
744 * Partial ID lookup failed. Assume that the event ID in kfd_signal_event_interrupt()
748 uint64_t *slots = page_slots(p->signal_page); in kfd_signal_event_interrupt()
749 uint32_t id; in kfd_signal_event_interrupt() local
752 * If id is valid but slot is not signaled, GPU may signal the same event twice in kfd_signal_event_interrupt()
753 * before driver have chance to process the first interrupt, then signal slot is in kfd_signal_event_interrupt()
754 * auto-reset after set_event wakeup the user space, just drop the second event as in kfd_signal_event_interrupt()
762 pr_debug_ratelimited("Partial ID invalid: %u (%u valid bits)\n", in kfd_signal_event_interrupt()
765 if (p->signal_event_count < KFD_SIGNAL_EVENT_LIMIT / 64) { in kfd_signal_event_interrupt()
769 idr_for_each_entry(&p->event_idr, ev, id) { in kfd_signal_event_interrupt()
770 if (id >= KFD_SIGNAL_EVENT_LIMIT) in kfd_signal_event_interrupt()
773 if (READ_ONCE(slots[id]) != UNSIGNALED_EVENT_SLOT) in kfd_signal_event_interrupt()
778 * iterate over the signal slots and lookup in kfd_signal_event_interrupt()
781 for (id = 1; id < KFD_SIGNAL_EVENT_LIMIT; id++) in kfd_signal_event_interrupt()
782 if (READ_ONCE(slots[id]) != UNSIGNALED_EVENT_SLOT) { in kfd_signal_event_interrupt()
783 ev = lookup_event_by_id(p, id); in kfd_signal_event_interrupt()
814 struct kfd_event *ev = lookup_event_by_id(p, event_data->event_id); in init_event_waiter()
817 return -EINVAL; in init_event_waiter()
819 spin_lock(&ev->lock); in init_event_waiter()
820 waiter->event = ev; in init_event_waiter()
821 waiter->activated = ev->signaled; in init_event_waiter()
822 ev->signaled = ev->signaled && !ev->auto_reset; in init_event_waiter()
825 if (waiter->event->type == KFD_EVENT_TYPE_SIGNAL && in init_event_waiter()
826 event_data->signal_event_data.last_event_age) { in init_event_waiter()
827 waiter->event_age_enabled = true; in init_event_waiter()
828 if (ev->event_age != event_data->signal_event_data.last_event_age) in init_event_waiter()
829 waiter->activated = true; in init_event_waiter()
832 if (!waiter->activated) in init_event_waiter()
833 add_wait_queue(&ev->wq, &waiter->wait); in init_event_waiter()
834 spin_unlock(&ev->lock); in init_event_waiter()
839 /* test_event_condition - Test condition of events being waited for
887 event = waiter->event; in copy_signaled_event_data()
889 return -EINVAL; /* event was destroyed */ in copy_signaled_event_data()
890 if (waiter->activated) { in copy_signaled_event_data()
891 if (event->type == KFD_EVENT_TYPE_MEMORY) { in copy_signaled_event_data()
893 src = &event->memory_exception_data; in copy_signaled_event_data()
895 } else if (event->type == KFD_EVENT_TYPE_HW_EXCEPTION) { in copy_signaled_event_data()
897 src = &event->hw_exception_data; in copy_signaled_event_data()
899 } else if (event->type == KFD_EVENT_TYPE_SIGNAL && in copy_signaled_event_data()
900 waiter->event_age_enabled) { in copy_signaled_event_data()
902 src = &event->event_age; in copy_signaled_event_data()
906 return -EFAULT; in copy_signaled_event_data()
922 * msecs_to_jiffies interprets all values above 2^31-1 as infinite, in user_timeout_to_jiffies()
938 spin_lock(&waiters[i].event->lock); in free_waiters()
939 remove_wait_queue(&waiters[i].event->wq, in free_waiters()
942 waiters[i].event && waiters[i].event->auto_reset) in free_waiters()
944 spin_unlock(&waiters[i].event->lock); in free_waiters()
965 ret = -ENOMEM; in kfd_wait_on_events()
969 /* Use p->event_mutex here to protect against concurrent creation and in kfd_wait_on_events()
972 mutex_lock(&p->event_mutex); in kfd_wait_on_events()
979 ret = -EFAULT; in kfd_wait_on_events()
1001 mutex_unlock(&p->event_mutex); in kfd_wait_on_events()
1005 ret = -EINTR; in kfd_wait_on_events()
1010 ret = -ERESTARTSYS; in kfd_wait_on_events()
1014 max(0l, timeout-1)); in kfd_wait_on_events()
1019 * checking wake-up conditions. A concurrent wake-up in kfd_wait_on_events()
1022 * sleep and we'll get a chance to re-check the in kfd_wait_on_events()
1041 mutex_lock(&p->event_mutex); in kfd_wait_on_events()
1047 * still exists. Therefore this must be under the p->event_mutex in kfd_wait_on_events()
1055 free_waiters(num_events, event_waiters, ret == -ERESTARTSYS); in kfd_wait_on_events()
1056 mutex_unlock(&p->event_mutex); in kfd_wait_on_events()
1061 ret = -EIO; in kfd_wait_on_events()
1074 get_order(vma->vm_end - vma->vm_start)) { in kfd_event_mmap()
1076 return -EINVAL; in kfd_event_mmap()
1079 page = p->signal_page; in kfd_event_mmap()
1081 /* Probably KFD bug, but mmap is user-accessible. */ in kfd_event_mmap()
1082 pr_debug("Signal page could not be found\n"); in kfd_event_mmap()
1083 return -EINVAL; in kfd_event_mmap()
1086 pfn = __pa(page->kernel_address); in kfd_event_mmap()
1092 pr_debug("Mapping signal page\n"); in kfd_event_mmap()
1093 pr_debug(" start user address == 0x%08lx\n", vma->vm_start); in kfd_event_mmap()
1094 pr_debug(" end user address == 0x%08lx\n", vma->vm_end); in kfd_event_mmap()
1096 pr_debug(" vm_flags == 0x%08lX\n", vma->vm_flags); in kfd_event_mmap()
1098 vma->vm_end - vma->vm_start); in kfd_event_mmap()
1100 page->user_address = (uint64_t __user *)vma->vm_start; in kfd_event_mmap()
1103 ret = remap_pfn_range(vma, vma->vm_start, pfn, in kfd_event_mmap()
1104 vma->vm_end - vma->vm_start, vma->vm_page_prot); in kfd_event_mmap()
1106 p->signal_mapped_size = vma->vm_end - vma->vm_start; in kfd_event_mmap()
1119 uint32_t id; in lookup_events_by_type_and_signal() local
1126 id = KFD_FIRST_NONSIGNAL_EVENT_ID; in lookup_events_by_type_and_signal()
1127 idr_for_each_entry_continue(&p->event_idr, ev, id) in lookup_events_by_type_and_signal()
1128 if (ev->type == type) { in lookup_events_by_type_and_signal()
1131 "Event found: id %X type %d", in lookup_events_by_type_and_signal()
1132 ev->event_id, ev->type); in lookup_events_by_type_and_signal()
1133 spin_lock(&ev->lock); in lookup_events_by_type_and_signal()
1135 if (ev->type == KFD_EVENT_TYPE_MEMORY && ev_data) in lookup_events_by_type_and_signal()
1136 ev->memory_exception_data = *ev_data; in lookup_events_by_type_and_signal()
1137 spin_unlock(&ev->lock); in lookup_events_by_type_and_signal()
1143 p->lead_thread->pid, p->pasid); in lookup_events_by_type_and_signal()
1144 send_sig(SIGSEGV, p->lead_thread, 0); in lookup_events_by_type_and_signal()
1152 p->lead_thread->pid, p->pasid); in lookup_events_by_type_and_signal()
1153 send_sig(SIGTERM, p->lead_thread, 0); in lookup_events_by_type_and_signal()
1157 p->lead_thread->pid, p->pasid); in lookup_events_by_type_and_signal()
1185 uint32_t id; in kfd_signal_vm_fault_event() local
1193 user_gpu_id = kfd_process_get_user_gpu_id(p, dev->id); in kfd_signal_vm_fault_event()
1194 if (unlikely(user_gpu_id == -EINVAL)) { in kfd_signal_vm_fault_event()
1195 WARN_ONCE(1, "Could not get user_gpu_id from dev->id:%x\n", dev->id); in kfd_signal_vm_fault_event()
1207 memory_exception_data.va = (info->page_addr) << in kfd_signal_vm_fault_event()
1210 info->prot_valid ? 1 : 0; in kfd_signal_vm_fault_event()
1212 info->prot_exec ? 1 : 0; in kfd_signal_vm_fault_event()
1214 info->prot_write ? 1 : 0; in kfd_signal_vm_fault_event()
1221 id = KFD_FIRST_NONSIGNAL_EVENT_ID; in kfd_signal_vm_fault_event()
1222 idr_for_each_entry_continue(&p->event_idr, ev, id) in kfd_signal_vm_fault_event()
1223 if (ev->type == KFD_EVENT_TYPE_MEMORY) { in kfd_signal_vm_fault_event()
1224 spin_lock(&ev->lock); in kfd_signal_vm_fault_event()
1225 ev->memory_exception_data = data ? *data : in kfd_signal_vm_fault_event()
1228 spin_unlock(&ev->lock); in kfd_signal_vm_fault_event()
1242 uint32_t id, idx; in kfd_signal_reset_event() local
1243 int reset_cause = atomic_read(&dev->sram_ecc_flag) ? in kfd_signal_reset_event()
1258 int user_gpu_id = kfd_process_get_user_gpu_id(p, dev->id); in kfd_signal_reset_event()
1261 if (unlikely(user_gpu_id == -EINVAL)) { in kfd_signal_reset_event()
1262 WARN_ONCE(1, "Could not get user_gpu_id from dev->id:%x\n", dev->id); in kfd_signal_reset_event()
1267 WARN_ONCE(1, "Could not get device data from pasid:0x%x\n", p->pasid); in kfd_signal_reset_event()
1271 if (dev->dqm->detect_hang_count && !pdd->has_reset_queue) in kfd_signal_reset_event()
1274 if (dev->dqm->detect_hang_count) { in kfd_signal_reset_event()
1277 ti = amdgpu_vm_get_task_info_pasid(dev->adev, p->pasid); in kfd_signal_reset_event()
1279 dev_err(dev->adev->dev, in kfd_signal_reset_event()
1281 ti->process_name, ti->tgid, ti->task_name, ti->pid); in kfd_signal_reset_event()
1288 id = KFD_FIRST_NONSIGNAL_EVENT_ID; in kfd_signal_reset_event()
1289 idr_for_each_entry_continue(&p->event_idr, ev, id) { in kfd_signal_reset_event()
1290 if (ev->type == KFD_EVENT_TYPE_HW_EXCEPTION) { in kfd_signal_reset_event()
1291 spin_lock(&ev->lock); in kfd_signal_reset_event()
1292 ev->hw_exception_data = hw_exception_data; in kfd_signal_reset_event()
1293 ev->hw_exception_data.gpu_id = user_gpu_id; in kfd_signal_reset_event()
1295 spin_unlock(&ev->lock); in kfd_signal_reset_event()
1297 if (ev->type == KFD_EVENT_TYPE_MEMORY && in kfd_signal_reset_event()
1299 spin_lock(&ev->lock); in kfd_signal_reset_event()
1300 ev->memory_exception_data = memory_exception_data; in kfd_signal_reset_event()
1301 ev->memory_exception_data.gpu_id = user_gpu_id; in kfd_signal_reset_event()
1303 spin_unlock(&ev->lock); in kfd_signal_reset_event()
1318 uint32_t id = KFD_FIRST_NONSIGNAL_EVENT_ID; in kfd_signal_poison_consumed_event() local
1322 dev_warn(dev->adev->dev, "Not find process with pasid:%d\n", pasid); in kfd_signal_poison_consumed_event()
1326 user_gpu_id = kfd_process_get_user_gpu_id(p, dev->id); in kfd_signal_poison_consumed_event()
1327 if (unlikely(user_gpu_id == -EINVAL)) { in kfd_signal_poison_consumed_event()
1328 WARN_ONCE(1, "Could not get user_gpu_id from dev->id:%x\n", dev->id); in kfd_signal_poison_consumed_event()
1344 idr_for_each_entry_continue(&p->event_idr, ev, id) { in kfd_signal_poison_consumed_event()
1345 if (ev->type == KFD_EVENT_TYPE_HW_EXCEPTION) { in kfd_signal_poison_consumed_event()
1346 spin_lock(&ev->lock); in kfd_signal_poison_consumed_event()
1347 ev->hw_exception_data = hw_exception_data; in kfd_signal_poison_consumed_event()
1349 spin_unlock(&ev->lock); in kfd_signal_poison_consumed_event()
1352 if (ev->type == KFD_EVENT_TYPE_MEMORY) { in kfd_signal_poison_consumed_event()
1353 spin_lock(&ev->lock); in kfd_signal_poison_consumed_event()
1354 ev->memory_exception_data = memory_exception_data; in kfd_signal_poison_consumed_event()
1356 spin_unlock(&ev->lock); in kfd_signal_poison_consumed_event()
1360 dev_warn(dev->adev->dev, "Send SIGBUS to process %s(pasid:%d)\n", in kfd_signal_poison_consumed_event()
1361 p->lead_thread->comm, pasid); in kfd_signal_poison_consumed_event()
1364 /* user application will handle SIGBUS signal */ in kfd_signal_poison_consumed_event()
1365 send_sig(SIGBUS, p->lead_thread, 0); in kfd_signal_poison_consumed_event()