Merge tag 'drm-intel-gt-next-2026-03-12' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-next

Driver Changes:

Fixes/improvements/new stuff:

- Fix potential overflow of shmem scatterlist length (Janusz Krzysztofik)

Miscellaneous:

- Keep mock file open during unfaultable migrate with fill [selftests] (Krzysztof Karas)
- Test for imported buffers with drm_gem_is_imported() (Thomas Zimmermann)
- Fix corrupted copyright symbols in selftest files [guc] (Konstantin Khorenko)

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Tvrtko Ursulin <tursulin@igalia.com>
Link: https://patch.msgid.link/abKBHNFsBQCv2h3e@linux
This commit is contained in:
Dave Airlie 2026-03-16 09:10:13 +10:00
commit 38cb89a6c9
7 changed files with 70 additions and 30 deletions

View File

@ -372,12 +372,12 @@ void __i915_gem_object_pages_fini(struct drm_i915_gem_object *obj)
* and ttm_bo_cleanup_memtype_use() shouldn't be invoked for
* dma-buf, so it's safe to take the lock.
*/
if (obj->base.import_attach)
if (drm_gem_is_imported(&obj->base))
i915_gem_object_lock(obj, NULL);
__i915_gem_object_put_pages(obj);
if (obj->base.import_attach)
if (drm_gem_is_imported(&obj->base))
i915_gem_object_unlock(obj);
GEM_BUG_ON(i915_gem_object_has_pages(obj));
@ -391,7 +391,7 @@ void __i915_gem_free_object(struct drm_i915_gem_object *obj)
bitmap_free(obj->bit_17);
if (obj->base.import_attach)
if (drm_gem_is_imported(&obj->base))
drm_prime_gem_destroy(&obj->base, NULL);
drm_gem_free_mmap_offset(&obj->base);

View File

@ -153,8 +153,12 @@ int shmem_sg_alloc_table(struct drm_i915_private *i915, struct sg_table *st,
}
} while (1);
nr_pages = min_t(unsigned long,
folio_nr_pages(folio), page_count - i);
nr_pages = min_array(((unsigned long[]) {
folio_nr_pages(folio),
page_count - i,
max_segment / PAGE_SIZE,
}), 3);
if (!i ||
sg->length >= max_segment ||
folio_pfn(folio) != next_pfn) {
@ -164,7 +168,9 @@ int shmem_sg_alloc_table(struct drm_i915_private *i915, struct sg_table *st,
st->nents++;
sg_set_folio(sg, folio, nr_pages * PAGE_SIZE, 0);
} else {
/* XXX: could overflow? */
nr_pages = min_t(unsigned long, nr_pages,
(max_segment - sg->length) / PAGE_SIZE);
sg->length += nr_pages * PAGE_SIZE;
}
next_pfn = folio_pfn(folio) + nr_pages;

View File

@ -1159,6 +1159,7 @@ static int __igt_mmap_migrate(struct intel_memory_region **placements,
struct drm_i915_gem_object *obj;
struct i915_request *rq = NULL;
struct vm_area_struct *area;
struct file *mock_file;
unsigned long addr;
LIST_HEAD(objects);
u64 offset;
@ -1178,16 +1179,25 @@ static int __igt_mmap_migrate(struct intel_memory_region **placements,
goto out_put;
/*
* This will eventually create a GEM context, due to opening dummy drm
* file, which needs a tiny amount of mappable device memory for the top
* level paging structures(and perhaps scratch), so make sure we
* allocate early, to avoid tears.
* Pretend to open("/dev/dri/card0"), which will eventually create a GEM
* context along with multiple GEM objects (for paging structures and
* scratch) that are placed in mappable portion of GPU memory.
* Calling fput() on the file places objects' cleanup routines in delayed
* worqueues, which execute after unspecified amount of time.
* Keep the file open until migration and page fault checks are done to
* make sure object cleanup is not executed after igt_fill_mappable()
* finishes and before migration is attempted - that would leave a gap
* large enough for the migration to succeed, when we'd expect it to fail.
*/
addr = igt_mmap_offset(i915, offset, obj->base.size,
PROT_WRITE, MAP_SHARED);
mock_file = mock_drm_getfile(i915->drm.primary, O_RDWR);
if (IS_ERR(mock_file))
return PTR_ERR(mock_file);
addr = igt_mmap_offset_with_file(i915, offset, obj->base.size,
PROT_WRITE, MAP_SHARED, mock_file);
if (IS_ERR_VALUE(addr)) {
err = addr;
goto out_put;
goto out_fput;
}
mmap_read_lock(current->mm);
@ -1294,6 +1304,9 @@ static int __igt_mmap_migrate(struct intel_memory_region **placements,
out_addr:
vm_munmap(addr, obj->base.size);
out_fput:
fput(mock_file);
out_put:
i915_gem_object_put(obj);
igt_close_objects(i915, &objects);

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
/*
* Copyright <EFBFBD><EFBFBD> 2021 Intel Corporation
* Copyright © 2021 Intel Corporation
*/
#include "gt/intel_gt_print.h"

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
/*
* Copyright <EFBFBD><EFBFBD> 2019 Intel Corporation
* Copyright © 2019 Intel Corporation
*/
#include "gt/intel_gt_print.h"

View File

@ -9,14 +9,14 @@
#include "i915_drv.h"
#include "igt_mmap.h"
unsigned long igt_mmap_offset(struct drm_i915_private *i915,
u64 offset,
unsigned long size,
unsigned long prot,
unsigned long flags)
unsigned long igt_mmap_offset_with_file(struct drm_i915_private *i915,
u64 offset,
unsigned long size,
unsigned long prot,
unsigned long flags,
struct file *file)
{
struct drm_vma_offset_node *node;
struct file *file;
unsigned long addr;
int err;
@ -31,22 +31,35 @@ unsigned long igt_mmap_offset(struct drm_i915_private *i915,
return -ENOENT;
}
/* Pretend to open("/dev/dri/card0") */
file = mock_drm_getfile(i915->drm.primary, O_RDWR);
if (IS_ERR(file))
return PTR_ERR(file);
err = drm_vma_node_allow(node, file->private_data);
if (err) {
addr = err;
goto out_file;
return err;
}
addr = vm_mmap(file, 0, drm_vma_node_size(node) << PAGE_SHIFT,
prot, flags, drm_vma_node_offset_addr(node));
drm_vma_node_revoke(node, file->private_data);
out_file:
fput(file);
return addr;
}
unsigned long igt_mmap_offset(struct drm_i915_private *i915,
u64 offset,
unsigned long size,
unsigned long prot,
unsigned long flags)
{
struct file *file;
unsigned long addr;
/* Pretend to open("/dev/dri/card0") */
file = mock_drm_getfile(i915->drm.primary, O_RDWR);
if (IS_ERR(file))
return PTR_ERR(file);
addr = igt_mmap_offset_with_file(i915, offset, size, prot, flags, file);
fput(file);
return addr;
}

View File

@ -11,6 +11,7 @@
struct drm_i915_private;
struct drm_vma_offset_node;
struct file;
unsigned long igt_mmap_offset(struct drm_i915_private *i915,
u64 offset,
@ -18,4 +19,11 @@ unsigned long igt_mmap_offset(struct drm_i915_private *i915,
unsigned long prot,
unsigned long flags);
unsigned long igt_mmap_offset_with_file(struct drm_i915_private *i915,
u64 offset,
unsigned long size,
unsigned long prot,
unsigned long flags,
struct file *file);
#endif /* IGT_MMAP_H */