Module Name: src Committed By: riastradh Date: Sun Jun 23 13:01:44 UTC 2024
Modified Files: src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_mman.c Log Message: Revert "i915: Reduce diff in fault routine." Evidently this had more side effects than I thought: warning: ../../../../external/bsd/drm2/dist/drm/i915/intel_uncore.c:1197: Unclaimed read from register 0x61204 ... {drm:netbsd:wait_panel_status+0x74} *ERROR* PPS state mismatch ... warning: ../../../../external/bsd/drm2/dist/drm/i915/display/intel_dp.c:1175: eDP powered off while attempting aux channel communication. ... warning: ../../../../external/bsd/drm2/dist/drm/i915/display/intel_dp.c:5616: Missing case (((&(dev_priv)->__info)->gen) == 9) So let's roll it back until I have a better understanding of what changed. Between making the change and writing the commit message, I forgot that the change affected the errno values returned by the fault routine, which may affect how uvm handles the fault failure -- whether to retry, wait for memory and retry, or fail, or what. Perhaps that explains the issue. To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.25 \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.24 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.25 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.24 Sun Jun 23 00:53:16 2024 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c Sun Jun 23 13:01:44 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_mman.c,v 1.24 2024/06/23 00:53:16 riastradh Exp $ */ +/* $NetBSD: i915_gem_mman.c,v 1.25 2024/06/23 13:01:44 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.24 2024/06/23 00:53:16 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.25 2024/06/23 13:01:44 riastradh Exp $"); #include <linux/anon_inodes.h> #include <linux/mman.h> @@ -252,14 +252,14 @@ compute_partial_view(const struct drm_i9 */ int pmap_enter_default(pmap_t, vaddr_t, paddr_t, vm_prot_t, unsigned); #define pmap_enter pmap_enter_default -#endif -#ifdef __NetBSD__ static int i915_error_to_vmf_fault(int err) +{ + return err; +} #else static vm_fault_t i915_error_to_vmf_fault(int err) -#endif { switch (err) { default: @@ -269,19 +269,11 @@ static vm_fault_t i915_error_to_vmf_faul case -EFAULT: /* purged object */ case -ENODEV: /* bad object, how did you get here! */ case -ENXIO: /* unable to access backing store (on device) */ -#ifdef __NetBSD__ - return EINVAL; /* SIGBUS */ -#else return VM_FAULT_SIGBUS; -#endif case -ENOSPC: /* shmemfs allocation failure */ case -ENOMEM: /* our allocation failure */ -#ifdef __NetBSD__ - return ENOMEM; -#else return VM_FAULT_OOM; -#endif case 0: case -EAGAIN: @@ -292,13 +284,10 @@ static vm_fault_t i915_error_to_vmf_faul * EBUSY is ok: this just means that another thread * already did the job. */ -#ifdef __NetBSD__ - return 0; /* retry access in userland */ -#else return VM_FAULT_NOPAGE; -#endif } } +#endif #ifdef __NetBSD__ static int @@ -324,7 +313,7 @@ static vm_fault_t vm_fault_cpu(struct vm /* Sanity check that we allow writing into this object */ if (unlikely(i915_gem_object_is_readonly(obj) && write)) #ifdef __NetBSD__ - return EINVAL; /* SIGBUS */ + return -EFAULT; #else return VM_FAULT_SIGBUS; #endif @@ -431,7 +420,7 @@ static vm_fault_t vm_fault_gtt(struct vm /* Sanity check that we allow writing into this object */ if (i915_gem_object_is_readonly(obj) && write) #ifdef __NetBSD__ - return EINVAL; /* SIGBUS */ + return -EFAULT; #else return VM_FAULT_SIGBUS; #endif @@ -576,6 +565,7 @@ i915_gem_fault(struct uvm_faultinfo *ufi struct i915_mmap_offset *mmo = container_of(uobj, struct i915_mmap_offset, uobj); struct drm_i915_gem_object *obj = mmo->obj; + bool pinned = false; int error; KASSERT(rw_lock_held(obj->base.filp->vmobjlock)); @@ -595,15 +585,22 @@ i915_gem_fault(struct uvm_faultinfo *ufi */ rw_exit(obj->base.filp->vmobjlock); + /* XXX errno Linux->NetBSD */ + error = -i915_gem_object_pin_pages(obj); + if (error) + goto out; + pinned = true; + switch (mmo->mmap_type) { case I915_MMAP_TYPE_WC: case I915_MMAP_TYPE_WB: case I915_MMAP_TYPE_UC: - error = vm_fault_cpu(ufi, mmo, vaddr, pps, npages, centeridx, + /* XXX errno Linux->NetBSD */ + error = -vm_fault_cpu(ufi, mmo, vaddr, pps, npages, centeridx, flags); break; case I915_MMAP_TYPE_GTT: - error = vm_fault_gtt(ufi, mmo, vaddr, pps, npages, centeridx, + error = -vm_fault_gtt(ufi, mmo, vaddr, pps, npages, centeridx, flags); break; default: @@ -611,7 +608,19 @@ i915_gem_fault(struct uvm_faultinfo *ufi mmo->mmap_type); } +out: if (pinned) + i915_gem_object_unpin_pages(obj); uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, NULL); + + /* + * Remap EINTR to success, so that we return to userland. + * On the way out, we'll deliver the signal, and if the signal + * is not fatal then the user code which faulted will most likely + * fault again, and we'll come back here for another try. + */ + if (error == EINTR) + error = 0; + return error; }