mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
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:
commit
38cb89a6c9
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright <EFBFBD><EFBFBD> 2021 Intel Corporation
|
||||
* Copyright © 2021 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "gt/intel_gt_print.h"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright <EFBFBD><EFBFBD> 2019 Intel Corporation
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "gt/intel_gt_print.h"
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user