From 335fdef2159e425a6d998a64164980ce6b11f5aa Mon Sep 17 00:00:00 2001 From: Eric Naim Date: Mon, 7 Apr 2025 22:17:29 +0800 Subject: [PATCH 7/8] nvidia-uvm: Convert make_device_exclusive_range() to make_device_exclusive() Signed-off-by: Eric Naim --- kernel-open/nvidia-uvm/uvm_hmm.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/kernel-open/nvidia-uvm/uvm_hmm.c b/kernel-open/nvidia-uvm/uvm_hmm.c index ee87c2ad..739130db 100644 --- a/kernel-open/nvidia-uvm/uvm_hmm.c +++ b/kernel-open/nvidia-uvm/uvm_hmm.c @@ -2445,7 +2445,8 @@ static NV_STATUS hmm_block_atomic_fault_locked(uvm_processor_id_t processor_id, uvm_va_block_region_t region = service_context->region; struct page **pages = service_context->block_context->hmm.pages; struct vm_area_struct *vma = service_context->block_context->hmm.vma; - int npages; + struct page *page; + struct folio *folio; uvm_page_index_t page_index; uvm_make_resident_cause_t cause; NV_STATUS status; @@ -2490,22 +2491,30 @@ static NV_STATUS hmm_block_atomic_fault_locked(uvm_processor_id_t processor_id, uvm_mutex_unlock(&va_block->lock); - npages = make_device_exclusive_range(service_context->block_context->mm, - uvm_va_block_cpu_page_address(va_block, region.first), - uvm_va_block_cpu_page_address(va_block, region.outer - 1) + PAGE_SIZE, - pages + region.first, - &g_uvm_global); + unsigned long start = uvm_va_block_cpu_page_address(va_block, region.first); + page = make_device_exclusive(service_context->block_context->mm, start, + &g_uvm_global, &folio); uvm_mutex_lock(&va_block->lock); - if (npages < 0) { - status = (npages == -EBUSY) ? NV_WARN_MORE_PROCESSING_REQUIRED : errno_to_nv_status(npages); + if (IS_ERR(page)) { + long err = PTR_ERR(page); + status = (err == -EBUSY) ? NV_WARN_MORE_PROCESSING_REQUIRED : errno_to_nv_status(err); goto done; } - while ((size_t)npages < uvm_va_block_region_num_pages(region)) + /* + * This code is most likely WRONG, but it *should* be relatively safe + * because of the error above + */ + size_t npages = (uvm_va_block_cpu_page_address(va_block, region.outer - 1) + PAGE_SIZE - + start) >> PAGE_SHIFT; + while (npages < uvm_va_block_region_num_pages(region)) pages[region.first + npages++] = NULL; + folio_unlock(folio); + folio_put(folio); + if (hmm_range_fault_retry(va_block)) { status = NV_WARN_MORE_PROCESSING_REQUIRED; goto release; -- 2.49.0.391.g4bbb303af6