Skip to content

Commit

Permalink
drm/etnaviv: Record GPU visible size of GEM BO separately
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sui Jingfeng authored and Lucas Stach committed Oct 28, 2024
1 parent e1f3220 commit b5f1eed
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 6 deletions.
11 changes: 5 additions & 6 deletions drivers/gpu/drm/etnaviv/etnaviv_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -544,7 +544,7 @@ static const struct drm_gem_object_funcs etnaviv_gem_object_funcs = {
.vm_ops = &vm_ops,
};

static int etnaviv_gem_new_impl(struct drm_device *dev, u32 flags,
static int etnaviv_gem_new_impl(struct drm_device *dev, u32 size, u32 flags,
const struct etnaviv_gem_ops *ops, struct drm_gem_object **obj)
{
struct etnaviv_gem_object *etnaviv_obj;
Expand All @@ -571,6 +571,7 @@ static int etnaviv_gem_new_impl(struct drm_device *dev, u32 flags,
if (!etnaviv_obj)
return -ENOMEM;

etnaviv_obj->size = ALIGN(size, SZ_4K);
etnaviv_obj->flags = flags;
etnaviv_obj->ops = ops;

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

size = PAGE_ALIGN(size);

ret = etnaviv_gem_new_impl(dev, flags, &etnaviv_gem_shmem_ops, &obj);
ret = etnaviv_gem_new_impl(dev, size, flags, &etnaviv_gem_shmem_ops, &obj);
if (ret)
goto fail;

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

ret = drm_gem_object_init(dev, obj, size);
ret = drm_gem_object_init(dev, obj, PAGE_ALIGN(size));
if (ret)
goto fail;

Expand Down Expand Up @@ -628,7 +627,7 @@ int etnaviv_gem_new_private(struct drm_device *dev, size_t size, u32 flags,
struct drm_gem_object *obj;
int ret;

ret = etnaviv_gem_new_impl(dev, flags, ops, &obj);
ret = etnaviv_gem_new_impl(dev, size, flags, ops, &obj);
if (ret)
return ret;

Expand Down
5 changes: 5 additions & 0 deletions drivers/gpu/drm/etnaviv/etnaviv_gem.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ struct etnaviv_gem_object {
const struct etnaviv_gem_ops *ops;
struct mutex lock;

/*
* The actual size that is visible to the GPU, not necessarily
* PAGE_SIZE aligned, but should be aligned to GPU page size.
*/
u32 size;
u32 flags;

struct list_head gem_node;
Expand Down

0 comments on commit b5f1eed

Please sign in to comment.