Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 01:39:57 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_execbuffer.c

Log Message:
Hack it up: disable no-fault fast paths, fix fd API, ifdef out stuff.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_execbuffer.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_execbuffer.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_execbuffer.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_execbuffer.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_execbuffer.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_execbuffer.c	Sun Dec 19 01:39:57 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_execbuffer.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_execbuffer.c,v 1.3 2021/12/19 01:39:57 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_execbuffer.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_execbuffer.c,v 1.3 2021/12/19 01:39:57 riastradh Exp $");
 
 #include <linux/intel-iommu.h>
 #include <linux/dma-resv.h>
@@ -951,7 +951,11 @@ static void reloc_cache_reset(struct rel
 		struct i915_ggtt *ggtt = cache_to_ggtt(cache);
 
 		intel_gt_flush_ggtt_writes(ggtt->vm.gt);
+#ifdef __NetBSD__
+		io_mapping_unmap_atomic(&ggtt->iomap, vaddr);
+#else
 		io_mapping_unmap_atomic((void __iomem *)vaddr);
+#endif
 
 		if (drm_mm_node_allocated(&cache->node)) {
 			ggtt->vm.clear_range(&ggtt->vm,
@@ -1011,7 +1015,12 @@ static void *reloc_iomap(struct drm_i915
 
 	if (cache->vaddr) {
 		intel_gt_flush_ggtt_writes(ggtt->vm.gt);
+#ifdef __NetBSD__
+		io_mapping_unmap_atomic(&ggtt->iomap,
+		    unmask_page(cache->vaddr));
+#else
 		io_mapping_unmap_atomic((void __force __iomem *) unmask_page(cache->vaddr));
+#endif
 	} else {
 		struct i915_vma *vma;
 		int err;
@@ -1435,8 +1444,10 @@ static int eb_relocate_vma(struct i915_e
 
 	urelocs = u64_to_user_ptr(entry->relocs_ptr);
 	remain = entry->relocation_count;
+#ifndef _LP64		/* XXX why, gcc, do you make it hard to be safe */
 	if (unlikely(remain > N_RELOC(ULONG_MAX)))
 		return -EINVAL;
+#endif
 
 	/*
 	 * We must check that the entire relocation array is safe
@@ -1460,9 +1471,13 @@ static int eb_relocate_vma(struct i915_e
 		 * we would try to acquire the struct mutex again. Obviously
 		 * this is bad and so lockdep complains vehemently.
 		 */
+#ifdef __NetBSD__		/* XXX copy fastpath */
+		copied = 1;
+#else
 		pagefault_disable();
 		copied = __copy_from_user_inatomic(r, urelocs, count * sizeof(r[0]));
 		pagefault_enable();
+#endif
 		if (unlikely(copied)) {
 			remain = -EFAULT;
 			goto out;
@@ -1670,10 +1685,17 @@ static noinline int eb_relocate_slow(str
 	int err = 0;
 
 repeat:
+#ifdef __NetBSD__
+	if (sigispending(curlwp, 0)) {
+		err = -ERESTARTSYS;
+		goto out;
+	}
+#else
 	if (signal_pending(current)) {
 		err = -ERESTARTSYS;
 		goto out;
 	}
+#endif
 
 	/* We may process another execbuffer during the unlock... */
 	eb_reset_vmas(eb);
@@ -1724,9 +1746,13 @@ repeat:
 
 	list_for_each_entry(vma, &eb->relocs, reloc_link) {
 		if (!have_copy) {
+#ifdef __NetBSD__
+			err = -EFAULT;
+#else
 			pagefault_disable();
 			err = eb_relocate_vma(eb, vma);
 			pagefault_enable();
+#endif
 			if (err)
 				goto repeat;
 		} else {
@@ -2573,6 +2599,9 @@ i915_gem_do_execbuffer(struct drm_device
 	struct dma_fence *exec_fence = NULL;
 	struct sync_file *out_fence = NULL;
 	int out_fence_fd = -1;
+#ifdef __NetBSD__
+	struct file *fp = NULL;
+#endif
 	int err;
 
 	BUILD_BUG_ON(__EXEC_INTERNAL_FLAGS & ~__I915_EXEC_ILLEGAL_FLAGS);
@@ -2635,11 +2664,17 @@ i915_gem_do_execbuffer(struct drm_device
 	}
 
 	if (args->flags & I915_EXEC_FENCE_OUT) {
+#ifdef __NetBSD__
+		err = -fd_allocfile(&fp, &out_fence_fd);
+		if (err)
+			goto err_in_fence;
+#else
 		out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
 		if (out_fence_fd < 0) {
 			err = out_fence_fd;
 			goto err_exec_fence;
 		}
+#endif
 	}
 
 	err = eb_create(&eb);
@@ -2748,7 +2783,11 @@ i915_gem_do_execbuffer(struct drm_device
 	}
 
 	if (out_fence_fd != -1) {
+#ifdef __NetBSD__
+		out_fence = sync_file_create(&eb.request->fence, fp);
+#else
 		out_fence = sync_file_create(&eb.request->fence);
+#endif
 		if (!out_fence) {
 			err = -ENOMEM;
 			goto err_request;
@@ -2783,7 +2822,13 @@ err_request:
 			args->rsvd2 |= (u64)out_fence_fd << 32;
 			out_fence_fd = -1;
 		} else {
+#ifdef __NetBSD__
+			fd_abort(curproc, fp, out_fence_fd);
+			out_fence_fd = -1;
+			fp = NULL;
+#else
 			fput(out_fence->file);
+#endif
 		}
 	}
 	i915_request_put(eb.request);
@@ -2807,7 +2852,11 @@ err_destroy:
 	eb_destroy(&eb);
 err_out_fence:
 	if (out_fence_fd != -1)
+#ifdef __NetBSD__
+		fd_abort(curproc, fp, out_fence_fd);
+#else
 		put_unused_fd(out_fence_fd);
+#endif
 err_exec_fence:
 	dma_fence_put(exec_fence);
 err_in_fence:

Reply via email to