From 335fdef2159e425a6d998a64164980ce6b11f5aa Mon Sep 17 00:00:00 2001
From: Eric Naim <dnaim@cachyos.org>
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 <dnaim@cachyos.org>
---
 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

