Module Name: src Committed By: riastradh Date: Sun Jun 23 00:53:16 UTC 2024
Modified Files: src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_mman.c Log Message: i915: Reduce diff in fault routine. - Omit needless i915_gem_object_pin/unpin_pages cycle in i915_gem_fault. This is already done by vm_fault_cpu and vm_fault_gtt. - Omit needless EINTR interception. This is now already handled by i915_error_to_vmf_fault. No functional change intended, except that the transient pin count will be one lower than before during the fault routine. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 \ 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.23 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.23 Tue Jun 4 21:42:40 2024 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c Sun Jun 23 00:53:16 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_mman.c,v 1.23 2024/06/04 21:42:40 riastradh Exp $ */ +/* $NetBSD: i915_gem_mman.c,v 1.24 2024/06/23 00:53:16 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.23 2024/06/04 21:42:40 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.24 2024/06/23 00:53:16 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,11 +269,19 @@ 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: @@ -284,10 +292,13 @@ 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 @@ -313,7 +324,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 -EFAULT; + return EINVAL; /* SIGBUS */ #else return VM_FAULT_SIGBUS; #endif @@ -420,7 +431,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 -EFAULT; + return EINVAL; /* SIGBUS */ #else return VM_FAULT_SIGBUS; #endif @@ -565,7 +576,6 @@ 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)); @@ -585,22 +595,15 @@ 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: - /* XXX errno Linux->NetBSD */ - error = -vm_fault_cpu(ufi, mmo, vaddr, pps, npages, centeridx, + 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: @@ -608,19 +611,7 @@ 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; }