Module Name: src
Committed By: riastradh
Date: Fri Jan 19 22:22:54 UTC 2024
Modified Files:
src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_pages.c
Log Message:
i915_gem: Assert page array size.
Let's detect the bug of sg_npgs failing to match
obj->base.size/PAGE_SIZE earlier.
Related to PR kern/57833.
XXX pullup-10
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 \
src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.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_pages.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c:1.6 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c:1.7
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c:1.6 Sun Dec 19 12:00:57 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c Fri Jan 19 22:22:54 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: i915_gem_pages.c,v 1.6 2021/12/19 12:00:57 riastradh Exp $ */
+/* $NetBSD: i915_gem_pages.c,v 1.7 2024/01/19 22:22:54 riastradh Exp $ */
/*
* SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_pages.c,v 1.6 2021/12/19 12:00:57 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_pages.c,v 1.7 2024/01/19 22:22:54 riastradh Exp $");
#include "i915_drv.h"
#include "i915_gem_object.h"
@@ -42,6 +42,18 @@ void __i915_gem_object_set_pages(struct
}
#ifndef __NetBSD__
+ /*
+ * Paranoia: In NetBSD, a scatterlist is just an array of
+ * pages, not an array of segments that might be larger than
+ * pages, so the number of entries must exactly match the size
+ * of the object (which should also be page-aligned).
+ *
+ * Both vm_fault_cpu and i915_gem_object_release_mmap_offset in
+ * i915_gem_mman.c rely on this page array as such.
+ */
+ KASSERTMSG(pages->sgl->sg_npgs == obj->base.size >> PAGE_SHIFT,
+ "npgs=%zu size=%zu", pages->sgl->sg_npgs, obj->base.size);
+
obj->mm.get_page.sg_pos = pages->sgl;
obj->mm.get_page.sg_idx = 0;
#endif