]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/amdkfd: fix vmfault signalling with additional data.
authorJonathan Kim <jonathan.kim@amd.com>
Wed, 7 Jun 2023 07:56:27 +0000 (03:56 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 16:44:44 +0000 (12:44 -0400)
Exception handling for vmfaults should be raised with additional data.

Reported-by: Mukul Joshi <mukul.joshi@amd.com>
Signed-off-by: Jonathan Kim <jonathan.kim@amd.com>
Reviewed-by: Mukul Joshi <mukul.joshi@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_events.c

index 0a5e7b172a648cb5677dc7ce4f2dd38bc63db0e1..ddca23ee4193ef9b88d0a5c24ce8c9fc97198293 100644 (file)
@@ -1240,19 +1240,24 @@ void kfd_signal_vm_fault_event(struct kfd_node *dev, u32 pasid,
                return;
        }
 
-       memset(&memory_exception_data, 0, sizeof(memory_exception_data));
-       memory_exception_data.gpu_id = user_gpu_id;
-       memory_exception_data.failure.imprecise = true;
-       /* Set failure reason */
-       if (info) {
-               memory_exception_data.va = (info->page_addr) << PAGE_SHIFT;
-               memory_exception_data.failure.NotPresent =
-                       info->prot_valid ? 1 : 0;
-               memory_exception_data.failure.NoExecute =
-                       info->prot_exec ? 1 : 0;
-               memory_exception_data.failure.ReadOnly =
-                       info->prot_write ? 1 : 0;
-               memory_exception_data.failure.imprecise = 0;
+       /* SoC15 chips and onwards will pass in data from now on. */
+       if (!data) {
+               memset(&memory_exception_data, 0, sizeof(memory_exception_data));
+               memory_exception_data.gpu_id = user_gpu_id;
+               memory_exception_data.failure.imprecise = true;
+
+               /* Set failure reason */
+               if (info) {
+                       memory_exception_data.va = (info->page_addr) <<
+                                                               PAGE_SHIFT;
+                       memory_exception_data.failure.NotPresent =
+                               info->prot_valid ? 1 : 0;
+                       memory_exception_data.failure.NoExecute =
+                               info->prot_exec ? 1 : 0;
+                       memory_exception_data.failure.ReadOnly =
+                               info->prot_write ? 1 : 0;
+                       memory_exception_data.failure.imprecise = 0;
+               }
        }
 
        rcu_read_lock();
@@ -1261,7 +1266,8 @@ void kfd_signal_vm_fault_event(struct kfd_node *dev, u32 pasid,
        idr_for_each_entry_continue(&p->event_idr, ev, id)
                if (ev->type == KFD_EVENT_TYPE_MEMORY) {
                        spin_lock(&ev->lock);
-                       ev->memory_exception_data = memory_exception_data;
+                       ev->memory_exception_data = data ? *data :
+                                                       memory_exception_data;
                        set_event(ev);
                        spin_unlock(&ev->lock);
                }