Skip to content

Commit b5f1eed

Browse files
suijingfenglynxeye-dev
authored andcommitted
drm/etnaviv: Record GPU visible size of GEM BO separately
The GPU visible size of a GEM BO is not necessarily PAGE_SIZE aligned, which happens when CPU page size is not equal to GPU page size. Extra precious resources such as GPU page tables and GPU TLBs may being paid because of this but never get used. Track the size of GPU visible part of GEM BO separately, ensure no GPUVA range wasting by aligning that size to GPU page size. Signed-off-by: Sui Jingfeng <sui.jingfeng@linux.dev> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
1 parent e1f3220 commit b5f1eed

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

drivers/gpu/drm/etnaviv/etnaviv_gem.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ static const struct drm_gem_object_funcs etnaviv_gem_object_funcs = {
544544
.vm_ops = &vm_ops,
545545
};
546546

547-
static int etnaviv_gem_new_impl(struct drm_device *dev, u32 flags,
547+
static int etnaviv_gem_new_impl(struct drm_device *dev, u32 size, u32 flags,
548548
const struct etnaviv_gem_ops *ops, struct drm_gem_object **obj)
549549
{
550550
struct etnaviv_gem_object *etnaviv_obj;
@@ -571,6 +571,7 @@ static int etnaviv_gem_new_impl(struct drm_device *dev, u32 flags,
571571
if (!etnaviv_obj)
572572
return -ENOMEM;
573573

574+
etnaviv_obj->size = ALIGN(size, SZ_4K);
574575
etnaviv_obj->flags = flags;
575576
etnaviv_obj->ops = ops;
576577

@@ -591,15 +592,13 @@ int etnaviv_gem_new_handle(struct drm_device *dev, struct drm_file *file,
591592
struct drm_gem_object *obj = NULL;
592593
int ret;
593594

594-
size = PAGE_ALIGN(size);
595-
596-
ret = etnaviv_gem_new_impl(dev, flags, &etnaviv_gem_shmem_ops, &obj);
595+
ret = etnaviv_gem_new_impl(dev, size, flags, &etnaviv_gem_shmem_ops, &obj);
597596
if (ret)
598597
goto fail;
599598

600599
lockdep_set_class(&to_etnaviv_bo(obj)->lock, &etnaviv_shm_lock_class);
601600

602-
ret = drm_gem_object_init(dev, obj, size);
601+
ret = drm_gem_object_init(dev, obj, PAGE_ALIGN(size));
603602
if (ret)
604603
goto fail;
605604

@@ -628,7 +627,7 @@ int etnaviv_gem_new_private(struct drm_device *dev, size_t size, u32 flags,
628627
struct drm_gem_object *obj;
629628
int ret;
630629

631-
ret = etnaviv_gem_new_impl(dev, flags, ops, &obj);
630+
ret = etnaviv_gem_new_impl(dev, size, flags, ops, &obj);
632631
if (ret)
633632
return ret;
634633

drivers/gpu/drm/etnaviv/etnaviv_gem.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ struct etnaviv_gem_object {
3636
const struct etnaviv_gem_ops *ops;
3737
struct mutex lock;
3838

39+
/*
40+
* The actual size that is visible to the GPU, not necessarily
41+
* PAGE_SIZE aligned, but should be aligned to GPU page size.
42+
*/
43+
u32 size;
3944
u32 flags;
4045

4146
struct list_head gem_node;

0 commit comments

Comments
 (0)