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;
}