Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

accel/ivpu: Add fdinfo support for memory statistics

Implement DRM fdinfo interface to expose memory usage statistics
for NPU device file descriptors. Exclude unpinned and imported
buffers from resident memory calculations to provide accurate
memory usage reporting.

Reviewed-by: Jeff Hugo <jeff.hugo@oss.qualcomm.com>
Signed-off-by: Karol Wachowski <karol.wachowski@linux.intel.com>
Link: https://patch.msgid.link/20251106101052.1050348-2-karol.wachowski@linux.intel.com

+23
+6
drivers/accel/ivpu/ivpu_drv.c
··· 455 455 static const struct file_operations ivpu_fops = { 456 456 .owner = THIS_MODULE, 457 457 DRM_ACCEL_FOPS, 458 + #if CONFIG_PROC_FS 459 + .show_fdinfo = drm_show_fdinfo, 460 + #endif 458 461 }; 459 462 460 463 static const struct drm_driver driver = { ··· 472 469 .ioctls = ivpu_drm_ioctls, 473 470 .num_ioctls = ARRAY_SIZE(ivpu_drm_ioctls), 474 471 .fops = &ivpu_fops, 472 + #if CONFIG_PROC_FS 473 + .show_fdinfo = drm_show_memory_stats, 474 + #endif 475 475 476 476 .name = DRIVER_NAME, 477 477 .desc = DRIVER_DESC,
+12
drivers/accel/ivpu/ivpu_gem.c
··· 333 333 drm_gem_shmem_free(&bo->base); 334 334 } 335 335 336 + static enum drm_gem_object_status ivpu_gem_status(struct drm_gem_object *obj) 337 + { 338 + struct ivpu_bo *bo = to_ivpu_bo(obj); 339 + enum drm_gem_object_status status = 0; 340 + 341 + if (ivpu_bo_is_resident(bo)) 342 + status |= DRM_GEM_OBJECT_RESIDENT; 343 + 344 + return status; 345 + } 346 + 336 347 static const struct drm_gem_object_funcs ivpu_gem_funcs = { 337 348 .free = ivpu_gem_bo_free, 338 349 .open = ivpu_gem_bo_open, ··· 354 343 .vmap = drm_gem_shmem_object_vmap, 355 344 .vunmap = drm_gem_shmem_object_vunmap, 356 345 .mmap = drm_gem_shmem_object_mmap, 346 + .status = ivpu_gem_status, 357 347 .vm_ops = &drm_gem_shmem_vm_ops, 358 348 }; 359 349
+5
drivers/accel/ivpu/ivpu_gem.h
··· 82 82 return bo->flags & DRM_IVPU_BO_READ_ONLY; 83 83 } 84 84 85 + static inline bool ivpu_bo_is_resident(struct ivpu_bo *bo) 86 + { 87 + return !!bo->base.pages; 88 + } 89 + 85 90 static inline void *ivpu_to_cpu_addr(struct ivpu_bo *bo, u32 vpu_addr) 86 91 { 87 92 if (vpu_addr < bo->vpu_addr)