|
23 | 23 |
|
24 | 24 | #include "uvm_rm_mem.h" |
25 | 25 | #include "uvm_gpu.h" |
| 26 | +#include "uvm_gpu_isr.h" |
26 | 27 | #include "uvm_global.h" |
27 | 28 | #include "uvm_kvmalloc.h" |
28 | 29 | #include "uvm_linux.h" |
@@ -298,8 +299,11 @@ void uvm_rm_mem_unmap_cpu(uvm_rm_mem_t *rm_mem) |
298 | 299 | if (!uvm_rm_mem_mapped_on_cpu(rm_mem)) |
299 | 300 | return; |
300 | 301 |
|
301 | | - uvm_rm_locked_call_void(nvUvmInterfaceMemoryCpuUnMap(rm_mem->gpu_owner->rm_address_space, |
302 | | - uvm_rm_mem_get_cpu_va(rm_mem))); |
| 302 | + // Skip RM call if GPU has been surprise removed. Calling RM with stale |
| 303 | + // handles will result in NV_ERR_INVALID_OBJECT_HANDLE errors. |
| 304 | + if (uvm_parent_gpu_is_accessible(rm_mem->gpu_owner->parent)) |
| 305 | + uvm_rm_locked_call_void(nvUvmInterfaceMemoryCpuUnMap(rm_mem->gpu_owner->rm_address_space, |
| 306 | + uvm_rm_mem_get_cpu_va(rm_mem))); |
303 | 307 |
|
304 | 308 | rm_mem_clear_cpu_va(rm_mem); |
305 | 309 | } |
@@ -355,7 +359,12 @@ static void rm_mem_unmap_gpu(uvm_rm_mem_t *rm_mem, uvm_gpu_t *gpu) |
355 | 359 | rm_mem_unmap_gpu_proxy(rm_mem, gpu); |
356 | 360 |
|
357 | 361 | va = uvm_rm_mem_get_gpu_uvm_va(rm_mem, gpu); |
358 | | - uvm_rm_locked_call_void(nvUvmInterfaceMemoryFree(gpu->rm_address_space, va)); |
| 362 | + |
| 363 | + // Skip RM call if GPU has been surprise removed. Calling RM with stale |
| 364 | + // handles will result in NV_ERR_INVALID_OBJECT_HANDLE errors. |
| 365 | + if (uvm_parent_gpu_is_accessible(gpu->parent)) |
| 366 | + uvm_rm_locked_call_void(nvUvmInterfaceMemoryFree(gpu->rm_address_space, va)); |
| 367 | + |
359 | 368 | rm_mem_clear_gpu_va(rm_mem, gpu); |
360 | 369 | } |
361 | 370 |
|
|
0 commit comments