...
...
3
DRM GEM objects, and also implementing the ability to label BO's from UM
3
DRM GEM objects, and also implementing the ability to label BO's from UM
4
through a new IOCTL.
4
through a new IOCTL.
5
5
6
The new debugfs file shows a list of driver DRM GEM objects in tabular mode.
6
The new debugfs file shows a list of driver DRM GEM objects in tabular mode.
7
To visualise it, cat sudo cat /sys/kernel/debug/dri/*.gpu/gems.
7
To visualise it, cat sudo cat /sys/kernel/debug/dri/*.gpu/gems.
8
To test this functionality from UM, please refer to this Mesa patch series:
9
https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34224
8
10
9
Previous discussion mail archive:
11
Discussion of previous revision of this patch series can be found at:
10
https://lore.kernel.org/dri-devel/20250316215139.3940623-1-adrian.larumbe@collabora.com/
12
https://lore.kernel.org/dri-devel/20250327140845.105962-1-adrian.larumbe@collabora.com/
11
13
12
Changelog:
14
Changelog:
13
v2:
15
14
- Consolidated some debugfs and labelling struct members into nested structs
16
v4:
15
- Added helpers for handling the debugfs gems linked list
17
- Labelled all kernel BO's, not just heap chunks.
16
- Fixed ioctl naming scheme in the uapi header file
18
- Refactored DebugGFs GEMs list handling functions
17
- Added label length limit and param consistency checks in BO labelling ioctl
19
- Added debugfs GEMS node mask to tell different kinds of BO's
18
20
19
Adrián Larumbe (4):
21
Adrián Larumbe (4):
20
drm/panthor: Introduce BO labeling
22
drm/panthor: Introduce BO labeling
21
drm/panthor: Add driver IOCTL for setting BO labels
23
drm/panthor: Add driver IOCTL for setting BO labels
24
drm/panthor: Label all kernel BO's
22
drm/panthor: show device-wide list of DRM GEM objects over DebugFS
25
drm/panthor: show device-wide list of DRM GEM objects over DebugFS
23
drm/panthor: Display heap chunk entries in DebugFS GEMS file
24
26
25
drivers/gpu/drm/panthor/panthor_device.c | 5 +
27
drivers/gpu/drm/panthor/panthor_device.c | 5 +
26
drivers/gpu/drm/panthor/panthor_device.h | 11 ++
28
drivers/gpu/drm/panthor/panthor_device.h | 11 ++
27
drivers/gpu/drm/panthor/panthor_drv.c | 63 ++++++++++
29
drivers/gpu/drm/panthor/panthor_drv.c | 66 ++++++++
28
drivers/gpu/drm/panthor/panthor_gem.c | 154 +++++++++++++++++++++++
30
drivers/gpu/drm/panthor/panthor_fw.c | 8 +-
29
drivers/gpu/drm/panthor/panthor_gem.h | 48 +++++++
31
drivers/gpu/drm/panthor/panthor_gem.c | 190 ++++++++++++++++++++++-
30
drivers/gpu/drm/panthor/panthor_heap.c | 3 +
32
drivers/gpu/drm/panthor/panthor_gem.h | 56 ++++++-
33
drivers/gpu/drm/panthor/panthor_heap.c | 6 +-
34
drivers/gpu/drm/panthor/panthor_sched.c | 9 +-
31
include/uapi/drm/panthor_drm.h | 19 +++
35
include/uapi/drm/panthor_drm.h | 19 +++
32
7 files changed, 303 insertions(+)
36
9 files changed, 360 insertions(+), 10 deletions(-)
33
37
34
--
38
--
35
2.48.1
39
2.48.1
diff view generated by jsdifflib
...
...
5
needed at object destruction time, but allocating it is the responsibility
5
needed at object destruction time, but allocating it is the responsibility
6
of callers.
6
of callers.
7
7
8
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
8
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
9
---
9
---
10
drivers/gpu/drm/panthor/panthor_gem.c | 24 ++++++++++++++++++++++++
10
drivers/gpu/drm/panthor/panthor_gem.c | 38 +++++++++++++++++++++++++++
11
drivers/gpu/drm/panthor/panthor_gem.h | 17 +++++++++++++++++
11
drivers/gpu/drm/panthor/panthor_gem.h | 17 ++++++++++++
12
2 files changed, 41 insertions(+)
12
2 files changed, 55 insertions(+)
13
13
14
diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c
14
diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/drivers/gpu/drm/panthor/panthor_gem.c
16
--- a/drivers/gpu/drm/panthor/panthor_gem.c
17
+++ b/drivers/gpu/drm/panthor/panthor_gem.c
17
+++ b/drivers/gpu/drm/panthor/panthor_gem.c
18
@@ -XXX,XX +XXX,XX @@ static void panthor_gem_free_object(struct drm_gem_object *obj)
18
@@ -XXX,XX +XXX,XX @@ static void panthor_gem_free_object(struct drm_gem_object *obj)
19
    struct panthor_gem_object *bo = to_panthor_bo(obj);
19
    struct panthor_gem_object *bo = to_panthor_bo(obj);
20
    struct drm_gem_object *vm_root_gem = bo->exclusive_vm_root_gem;
20
    struct drm_gem_object *vm_root_gem = bo->exclusive_vm_root_gem;
21
21
22
+    kfree(bo->label.str);
22
+    /*
23
+     * Label might have been allocated with kstrdup_const(),
24
+     * we need to take that into account when freeing the memory
25
+     */
26
+    kfree_const(bo->label.str);
27
+
23
+    mutex_destroy(&bo->label.lock);
28
+    mutex_destroy(&bo->label.lock);
24
+
29
+
25
    drm_gem_free_mmap_offset(&bo->base.base);
30
    drm_gem_free_mmap_offset(&bo->base.base);
26
    mutex_destroy(&bo->gpuva_list_lock);
31
    mutex_destroy(&bo->gpuva_list_lock);
27
    drm_gem_shmem_free(&bo->base);
32
    drm_gem_shmem_free(&bo->base);
...
...
53
+}
58
+}
54
+
59
+
55
+void
60
+void
56
+panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label)
61
+panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label)
57
+{
62
+{
58
+    panthor_gem_bo_set_label(bo->obj, kstrdup_const(label, GFP_KERNEL));
63
+    const char *str;
64
+
65
+    str = kstrdup_const(label, GFP_KERNEL);
66
+    if (!str) {
67
+        /* Failing to allocate memory for a label isn't a fatal condition */
68
+        drm_warn(bo->obj->dev, "Not enough memory to allocate BO label");
69
+        return;
70
+    }
71
+
72
+    panthor_gem_bo_set_label(bo->obj, kstrdup_const(str, GFP_KERNEL));
59
+}
73
+}
60
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
74
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
61
index XXXXXXX..XXXXXXX 100644
75
index XXXXXXX..XXXXXXX 100644
62
--- a/drivers/gpu/drm/panthor/panthor_gem.h
76
--- a/drivers/gpu/drm/panthor/panthor_gem.h
63
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
77
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
...
...
diff view generated by jsdifflib
1
Allow UM to label a BO for which it possesses a DRM handle.
1
Allow UM to label a BO for which it possesses a DRM handle.
2
2
3
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
3
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
4
---
4
---
5
drivers/gpu/drm/panthor/panthor_drv.c | 37 +++++++++++++++++++++++++++
5
drivers/gpu/drm/panthor/panthor_drv.c | 40 +++++++++++++++++++++++++++
6
include/uapi/drm/panthor_drm.h | 19 ++++++++++++++
6
drivers/gpu/drm/panthor/panthor_gem.h | 2 ++
7
2 files changed, 56 insertions(+)
7
include/uapi/drm/panthor_drm.h | 19 +++++++++++++
8
3 files changed, 61 insertions(+)
8
9
9
diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c
10
diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c
10
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
11
--- a/drivers/gpu/drm/panthor/panthor_drv.c
12
--- a/drivers/gpu/drm/panthor/panthor_drv.c
12
+++ b/drivers/gpu/drm/panthor/panthor_drv.c
13
+++ b/drivers/gpu/drm/panthor/panthor_drv.c
...
...
18
+                 struct drm_file *file)
19
+                 struct drm_file *file)
19
+{
20
+{
20
+    struct drm_panthor_bo_set_label *args = data;
21
+    struct drm_panthor_bo_set_label *args = data;
21
+    struct drm_gem_object *obj;
22
+    struct drm_gem_object *obj;
22
+    const char *label;
23
+    const char *label;
23
+    unsigned long len;
24
+    int ret = 0;
24
+    int ret = 0;
25
+
25
+
26
+    obj = drm_gem_object_lookup(file, args->handle);
26
+    obj = drm_gem_object_lookup(file, args->handle);
27
+    if (!obj)
27
+    if (!obj)
28
+        return -ENOENT;
28
+        return -ENOENT;
29
+
29
+
30
+    if (args->size && args->label) {
30
+    if (args->size && args->label) {
31
+        len = (args->size < PAGE_SIZE) ? args->size : PAGE_SIZE;
31
+        if (args->size > PANTHOR_BO_LABEL_MAXLEN) {
32
+        label = strndup_user(u64_to_user_ptr(args->label), len);
32
+            ret = -E2BIG;
33
+            goto err_label;
34
+        }
35
+
36
+        label = strndup_user(u64_to_user_ptr(args->label), args->size);
33
+        if (IS_ERR(label)) {
37
+        if (IS_ERR(label)) {
34
+            ret = PTR_ERR(label);
38
+            ret = PTR_ERR(label);
35
+            goto err_label;
39
+            goto err_label;
36
+        }
40
+        }
37
+    } else if (args->size && !args->label) {
41
+    } else if (args->size && !args->label) {
...
...
66
* - 1.3 - adds DRM_PANTHOR_GROUP_STATE_INNOCENT flag
70
* - 1.3 - adds DRM_PANTHOR_GROUP_STATE_INNOCENT flag
67
+ * - 1.4 - adds DRM_IOCTL_PANTHOR_BO_SET_LABEL ioctl
71
+ * - 1.4 - adds DRM_IOCTL_PANTHOR_BO_SET_LABEL ioctl
68
*/
72
*/
69
static const struct drm_driver panthor_drm_driver = {
73
static const struct drm_driver panthor_drm_driver = {
70
    .driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ |
74
    .driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ |
75
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
76
index XXXXXXX..XXXXXXX 100644
77
--- a/drivers/gpu/drm/panthor/panthor_gem.h
78
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
79
@@ -XXX,XX +XXX,XX @@
80
81
struct panthor_vm;
82
83
+#define PANTHOR_BO_LABEL_MAXLEN    PAGE_SIZE
84
+
85
/**
86
* struct panthor_gem_object - Driver specific GEM object.
87
*/
71
diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h
88
diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h
72
index XXXXXXX..XXXXXXX 100644
89
index XXXXXXX..XXXXXXX 100644
73
--- a/include/uapi/drm/panthor_drm.h
90
--- a/include/uapi/drm/panthor_drm.h
74
+++ b/include/uapi/drm/panthor_drm.h
91
+++ b/include/uapi/drm/panthor_drm.h
75
@@ -XXX,XX +XXX,XX @@ enum drm_panthor_ioctl_id {
92
@@ -XXX,XX +XXX,XX @@ enum drm_panthor_ioctl_id {
...
...
diff view generated by jsdifflib
1
Expand the driver's DebugFS GEMS file to display entries for the heap
1
Kernel BO's aren't exposed to UM, so labelling them is the responsibility
2
chunks' GEM objects, both those allocated at heap creation time through an
2
of the driver itself. This kind of tagging will prove useful in further
3
ioctl(), or in response to a tiler OOM event.
3
commits when want to expose these objects through DebugFS.
4
5
Expand panthor_kernel_bo_create() interface to take a NULL-terminated
6
string. No bounds checking is done because all label strings are given
7
as statically-allocated literals, but if a more complex kernel BO naming
8
scheme with explicit memory allocation and formatting was desired in the
9
future, this would have to change.
4
10
5
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
11
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
6
---
12
---
7
drivers/gpu/drm/panthor/panthor_gem.c | 22 +++++++++++-----------
13
drivers/gpu/drm/panthor/panthor_fw.c | 8 +++++---
8
drivers/gpu/drm/panthor/panthor_gem.h | 2 ++
14
drivers/gpu/drm/panthor/panthor_gem.c | 3 ++-
9
drivers/gpu/drm/panthor/panthor_heap.c | 3 +++
15
drivers/gpu/drm/panthor/panthor_gem.h | 2 +-
10
3 files changed, 16 insertions(+), 11 deletions(-)
16
drivers/gpu/drm/panthor/panthor_heap.c | 6 ++++--
17
drivers/gpu/drm/panthor/panthor_sched.c | 9 ++++++---
18
5 files changed, 18 insertions(+), 10 deletions(-)
11
19
20
diff --git a/drivers/gpu/drm/panthor/panthor_fw.c b/drivers/gpu/drm/panthor/panthor_fw.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/drivers/gpu/drm/panthor/panthor_fw.c
23
+++ b/drivers/gpu/drm/panthor/panthor_fw.c
24
@@ -XXX,XX +XXX,XX @@ panthor_fw_alloc_queue_iface_mem(struct panthor_device *ptdev,
25
                 DRM_PANTHOR_BO_NO_MMAP,
26
                 DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC |
27
                 DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED,
28
-                 PANTHOR_VM_KERNEL_AUTO_VA);
29
+                 PANTHOR_VM_KERNEL_AUTO_VA,
30
+                 "Queue FW interface");
31
    if (IS_ERR(mem))
32
        return mem;
33
34
@@ -XXX,XX +XXX,XX @@ panthor_fw_alloc_suspend_buf_mem(struct panthor_device *ptdev, size_t size)
35
    return panthor_kernel_bo_create(ptdev, panthor_fw_vm(ptdev), size,
36
                    DRM_PANTHOR_BO_NO_MMAP,
37
                    DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC,
38
-                    PANTHOR_VM_KERNEL_AUTO_VA);
39
+                    PANTHOR_VM_KERNEL_AUTO_VA,
40
+                    "FW suspend buffer");
41
}
42
43
static int panthor_fw_load_section_entry(struct panthor_device *ptdev,
44
@@ -XXX,XX +XXX,XX @@ static int panthor_fw_load_section_entry(struct panthor_device *ptdev,
45
        section->mem = panthor_kernel_bo_create(ptdev, panthor_fw_vm(ptdev),
46
                            section_size,
47
                            DRM_PANTHOR_BO_NO_MMAP,
48
-                            vm_map_flags, va);
49
+                            vm_map_flags, va, "FW Section");
50
        if (IS_ERR(section->mem))
51
            return PTR_ERR(section->mem);
52
12
diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c
53
diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c
13
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
14
--- a/drivers/gpu/drm/panthor/panthor_gem.c
55
--- a/drivers/gpu/drm/panthor/panthor_gem.c
15
+++ b/drivers/gpu/drm/panthor/panthor_gem.c
56
+++ b/drivers/gpu/drm/panthor/panthor_gem.c
16
@@ -XXX,XX +XXX,XX @@ static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo)
57
@@ -XXX,XX +XXX,XX @@ void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo)
17
    get_task_comm(bo->gems.creator.process_name, current->group_leader);
58
struct panthor_kernel_bo *
18
}
59
panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
19
60
             size_t size, u32 bo_flags, u32 vm_map_flags,
20
-static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo)
61
-             u64 gpu_va)
21
-{
62
+             u64 gpu_va, const char *name)
22
-    struct panthor_device *ptdev = container_of(bo->base.base.dev,
23
-                         struct panthor_device, base);
24
-
25
-    mutex_lock(&ptdev->gems.lock);
26
-    list_add_tail(&bo->gems.node, &ptdev->gems.node);
27
-    mutex_unlock(&ptdev->gems.lock);
28
-}
29
-
30
static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo)
31
{
63
{
32
    struct panthor_device *ptdev = container_of(bo->base.base.dev,
64
    struct drm_gem_shmem_object *obj;
33
@@ -XXX,XX +XXX,XX @@ static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo)
65
    struct panthor_kernel_bo *kbo;
34
    list_del_init(&bo->gems.node);
66
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
35
    mutex_unlock(&ptdev->gems.lock);
67
    kbo->obj = &obj->base;
36
}
68
    bo->flags = bo_flags;
37
+
69
38
+void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo)
70
+    panthor_gem_kernel_bo_set_label(kbo, name);
39
+{
71
    /* The system and GPU MMU page size might differ, which becomes a
40
+    struct panthor_device *ptdev = container_of(bo->base.base.dev,
72
     * problem for FW sections that need to be mapped at explicit address
41
+                         struct panthor_device, base);
73
     * since our PAGE_SIZE alignment might cover a VA range that's
42
+
43
+    mutex_lock(&ptdev->gems.lock);
44
+    list_add_tail(&bo->gems.node, &ptdev->gems.node);
45
+    mutex_unlock(&ptdev->gems.lock);
46
+}
47
#else
48
static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) {}
49
-static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) {}
50
static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) {}
51
+void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) {}
52
#endif
53
54
static void panthor_gem_free_object(struct drm_gem_object *obj)
55
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
74
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
56
index XXXXXXX..XXXXXXX 100644
75
index XXXXXXX..XXXXXXX 100644
57
--- a/drivers/gpu/drm/panthor/panthor_gem.h
76
--- a/drivers/gpu/drm/panthor/panthor_gem.h
58
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
77
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
59
@@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file,
78
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_vunmap(struct panthor_kernel_bo *bo)
60
void panthor_gem_bo_set_label(struct drm_gem_object *obj, const char *label);
79
struct panthor_kernel_bo *
61
void panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label);
80
panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
62
81
             size_t size, u32 bo_flags, u32 vm_map_flags,
63
+void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo);
82
-             u64 gpu_va);
64
+
83
+             u64 gpu_va, const char *name);
65
static inline u64
84
66
panthor_kernel_bo_gpuva(struct panthor_kernel_bo *bo)
85
void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo);
67
{
86
68
diff --git a/drivers/gpu/drm/panthor/panthor_heap.c b/drivers/gpu/drm/panthor/panthor_heap.c
87
diff --git a/drivers/gpu/drm/panthor/panthor_heap.c b/drivers/gpu/drm/panthor/panthor_heap.c
69
index XXXXXXX..XXXXXXX 100644
88
index XXXXXXX..XXXXXXX 100644
70
--- a/drivers/gpu/drm/panthor/panthor_heap.c
89
--- a/drivers/gpu/drm/panthor/panthor_heap.c
71
+++ b/drivers/gpu/drm/panthor/panthor_heap.c
90
+++ b/drivers/gpu/drm/panthor/panthor_heap.c
72
@@ -XXX,XX +XXX,XX @@ static int panthor_alloc_heap_chunk(struct panthor_device *ptdev,
91
@@ -XXX,XX +XXX,XX @@ static int panthor_alloc_heap_chunk(struct panthor_device *ptdev,
73
    heap->chunk_count++;
92
    chunk->bo = panthor_kernel_bo_create(ptdev, vm, heap->chunk_size,
74
    mutex_unlock(&heap->lock);
93
                     DRM_PANTHOR_BO_NO_MMAP,
75
94
                     DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC,
76
+    panthor_gem_kernel_bo_set_label(chunk->bo, "\"Tiler heap chunk\"");
95
-                     PANTHOR_VM_KERNEL_AUTO_VA);
77
+    panthor_gem_debugfs_bo_add(to_panthor_bo(chunk->bo->obj));
96
+                     PANTHOR_VM_KERNEL_AUTO_VA,
78
+
97
+                     "Tiler heap chunk");
79
    return 0;
98
    if (IS_ERR(chunk->bo)) {
80
99
        ret = PTR_ERR(chunk->bo);
81
err_destroy_bo:
100
        goto err_free_chunk;
101
@@ -XXX,XX +XXX,XX @@ panthor_heap_pool_create(struct panthor_device *ptdev, struct panthor_vm *vm)
102
    pool->gpu_contexts = panthor_kernel_bo_create(ptdev, vm, bosize,
103
                         DRM_PANTHOR_BO_NO_MMAP,
104
                         DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC,
105
-                         PANTHOR_VM_KERNEL_AUTO_VA);
106
+                         PANTHOR_VM_KERNEL_AUTO_VA,
107
+                         "Heap pool");
108
    if (IS_ERR(pool->gpu_contexts)) {
109
        ret = PTR_ERR(pool->gpu_contexts);
110
        goto err_destroy_pool;
111
diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/panthor/panthor_sched.c
112
index XXXXXXX..XXXXXXX 100644
113
--- a/drivers/gpu/drm/panthor/panthor_sched.c
114
+++ b/drivers/gpu/drm/panthor/panthor_sched.c
115
@@ -XXX,XX +XXX,XX @@ group_create_queue(struct panthor_group *group,
116
                         DRM_PANTHOR_BO_NO_MMAP,
117
                         DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC |
118
                         DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED,
119
-                         PANTHOR_VM_KERNEL_AUTO_VA);
120
+                         PANTHOR_VM_KERNEL_AUTO_VA,
121
+                         "Ring buffer");
122
    if (IS_ERR(queue->ringbuf)) {
123
        ret = PTR_ERR(queue->ringbuf);
124
        goto err_free_queue;
125
@@ -XXX,XX +XXX,XX @@ group_create_queue(struct panthor_group *group,
126
                     DRM_PANTHOR_BO_NO_MMAP,
127
                     DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC |
128
                     DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED,
129
-                     PANTHOR_VM_KERNEL_AUTO_VA);
130
+                     PANTHOR_VM_KERNEL_AUTO_VA,
131
+                     "fdinfo slots");
132
133
    if (IS_ERR(queue->profiling.slots)) {
134
        ret = PTR_ERR(queue->profiling.slots);
135
@@ -XXX,XX +XXX,XX @@ int panthor_group_create(struct panthor_file *pfile,
136
                         DRM_PANTHOR_BO_NO_MMAP,
137
                         DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC |
138
                         DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED,
139
-                         PANTHOR_VM_KERNEL_AUTO_VA);
140
+                         PANTHOR_VM_KERNEL_AUTO_VA,
141
+                         "Group sync objects");
142
    if (IS_ERR(group->syncobjs)) {
143
        ret = PTR_ERR(group->syncobjs);
144
        goto err_put_group;
82
--
145
--
83
2.48.1
146
2.48.1
84
147
diff view generated by jsdifflib
1
Add a device DebugFS file that displays a complete list of all the DRM GEM
1
Add a device DebugFS file that displays a complete list of all the DRM
2
objects that are exposed to UM through a DRM handle.
2
GEM objects that are exposed to UM through a DRM handle.
3
3
4
Since leaking object identifiers that might belong to a different NS is
4
Since leaking object identifiers that might belong to a different NS is
5
inadmissible, this functionality is only made available in debug builds
5
inadmissible, this functionality is only made available in debug builds
6
with DEBUGFS support enabled.
6
with DEBUGFS support enabled.
7
7
8
File format is that of a table, with each entry displaying a variety of
8
File format is that of a table, with each entry displaying a variety of
9
fields with information about each GEM object.
9
fields with information about each GEM object.
10
10
11
Each GEM object entry in the file displays the following information
11
Each GEM object entry in the file displays the following information
12
fields: Client PID, BO's global name, reference count, BO virtual size, BO
12
fields: Client PID, BO's global name, reference count, BO virtual size,
13
resize size, VM address in its DRM-managed range, BO label and a flag
13
BO resize size, VM address in its DRM-managed range, BO label and a flag
14
bitmask.
14
bitmask.
15
16
There's also a kflags field for the type of BO. Bit 0 tells us whether
17
it's a kernel BO, and bit 1 means the BO is mapped onto the FW's address
18
space.
15
19
16
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
20
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
17
---
21
---
18
drivers/gpu/drm/panthor/panthor_device.c | 5 +
22
drivers/gpu/drm/panthor/panthor_device.c | 5 +
19
drivers/gpu/drm/panthor/panthor_device.h | 11 ++
23
drivers/gpu/drm/panthor/panthor_device.h | 11 ++
20
drivers/gpu/drm/panthor/panthor_drv.c | 26 +++++
24
drivers/gpu/drm/panthor/panthor_drv.c | 26 ++++
21
drivers/gpu/drm/panthor/panthor_gem.c | 130 +++++++++++++++++++++++
25
drivers/gpu/drm/panthor/panthor_gem.c | 149 +++++++++++++++++++++++
22
drivers/gpu/drm/panthor/panthor_gem.h | 29 +++++
26
drivers/gpu/drm/panthor/panthor_gem.h | 35 ++++++
23
5 files changed, 201 insertions(+)
27
5 files changed, 226 insertions(+)
24
28
25
diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/panthor/panthor_device.c
29
diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/panthor/panthor_device.c
26
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
27
--- a/drivers/gpu/drm/panthor/panthor_device.c
31
--- a/drivers/gpu/drm/panthor/panthor_device.c
28
+++ b/drivers/gpu/drm/panthor/panthor_device.c
32
+++ b/drivers/gpu/drm/panthor/panthor_device.c
29
@@ -XXX,XX +XXX,XX @@ int panthor_device_init(struct panthor_device *ptdev)
33
@@ -XXX,XX +XXX,XX @@ int panthor_device_init(struct panthor_device *ptdev)
30
    pm_runtime_set_autosuspend_delay(ptdev->base.dev, 50);
34
    if (ret)
31
    pm_runtime_use_autosuspend(ptdev->base.dev);
35
        return ret;
32
36
33
+#ifdef CONFIG_DEBUG_FS
37
+#ifdef CONFIG_DEBUG_FS
34
+    drmm_mutex_init(&ptdev->base, &ptdev->gems.lock);
38
+    drmm_mutex_init(&ptdev->base, &ptdev->gems.lock);
35
+    INIT_LIST_HEAD(&ptdev->gems.node);
39
+    INIT_LIST_HEAD(&ptdev->gems.node);
36
+#endif
40
+#endif
37
+
41
+
38
    ret = drm_dev_register(&ptdev->base, 0);
42
    atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDED);
39
    if (ret)
43
    p = alloc_page(GFP_KERNEL | __GFP_ZERO);
40
        goto err_disable_autosuspend;
44
    if (!p)
41
diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/panthor/panthor_device.h
45
diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/panthor/panthor_device.h
42
index XXXXXXX..XXXXXXX 100644
46
index XXXXXXX..XXXXXXX 100644
43
--- a/drivers/gpu/drm/panthor/panthor_device.h
47
--- a/drivers/gpu/drm/panthor/panthor_device.h
44
+++ b/drivers/gpu/drm/panthor/panthor_device.h
48
+++ b/drivers/gpu/drm/panthor/panthor_device.h
45
@@ -XXX,XX +XXX,XX @@ struct panthor_device {
49
@@ -XXX,XX +XXX,XX @@ struct panthor_device {
...
...
111
+#include <linux/cleanup.h>
115
+#include <linux/cleanup.h>
112
#include <linux/dma-buf.h>
116
#include <linux/dma-buf.h>
113
#include <linux/dma-mapping.h>
117
#include <linux/dma-mapping.h>
114
#include <linux/err.h>
118
#include <linux/err.h>
115
@@ -XXX,XX +XXX,XX @@
119
@@ -XXX,XX +XXX,XX @@
120
#include <drm/panthor_drm.h>
121
122
#include "panthor_device.h"
123
+#include "panthor_fw.h"
116
#include "panthor_gem.h"
124
#include "panthor_gem.h"
117
#include "panthor_mmu.h"
125
#include "panthor_mmu.h"
118
126
119
+#ifdef CONFIG_DEBUG_FS
127
+#ifdef CONFIG_DEBUG_FS
120
+static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo)
128
+static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo, u32 type_mask)
121
+{
129
+{
122
+    INIT_LIST_HEAD(&bo->gems.node);
130
+    INIT_LIST_HEAD(&bo->debugfs.node);
123
+    bo->gems.creator.tgid = current->group_leader->pid;
131
+
124
+    get_task_comm(bo->gems.creator.process_name, current->group_leader);
132
+    if (!(type_mask & PANTHOR_BO_FW_MAPPED)) {
125
+}
133
+        bo->debugfs.creator.tgid = current->group_leader->pid;
126
+
134
+        get_task_comm(bo->debugfs.creator.process_name, current->group_leader);
127
+static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo)
135
+    } else {
136
+        bo->debugfs.creator.tgid = 0;
137
+        snprintf(bo->debugfs.creator.process_name,
138
+             sizeof(bo->debugfs.creator.process_name),
139
+             "kernel");
140
+    }
141
+
142
+    bo->debugfs.bo_mask = type_mask;
143
+}
144
+
145
+static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo, u32 type_mask)
128
+{
146
+{
129
+    struct panthor_device *ptdev = container_of(bo->base.base.dev,
147
+    struct panthor_device *ptdev = container_of(bo->base.base.dev,
130
+                         struct panthor_device, base);
148
+                         struct panthor_device, base);
131
+
149
+
150
+    panthor_gem_debugfs_bo_init(bo, type_mask);
151
+
132
+    mutex_lock(&ptdev->gems.lock);
152
+    mutex_lock(&ptdev->gems.lock);
133
+    list_add_tail(&bo->gems.node, &ptdev->gems.node);
153
+    list_add_tail(&bo->debugfs.node, &ptdev->gems.node);
134
+    mutex_unlock(&ptdev->gems.lock);
154
+    mutex_unlock(&ptdev->gems.lock);
135
+}
155
+}
136
+
156
+
137
+static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo)
157
+static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo)
138
+{
158
+{
139
+    struct panthor_device *ptdev = container_of(bo->base.base.dev,
159
+    struct panthor_device *ptdev = container_of(bo->base.base.dev,
140
+                         struct panthor_device, base);
160
+                         struct panthor_device, base);
141
+
161
+
142
+    if (list_empty(&bo->gems.node))
162
+    if (list_empty(&bo->debugfs.node))
143
+        return;
163
+        return;
144
+
164
+
145
+    mutex_lock(&ptdev->gems.lock);
165
+    mutex_lock(&ptdev->gems.lock);
146
+    list_del_init(&bo->gems.node);
166
+    list_del_init(&bo->debugfs.node);
147
+    mutex_unlock(&ptdev->gems.lock);
167
+    mutex_unlock(&ptdev->gems.lock);
148
+}
168
+}
169
+
149
+#else
170
+#else
150
+static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) {}
171
+static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo, u32 type_mask) {}
151
+static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) {}
152
+static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) {}
172
+static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) {}
153
+#endif
173
+#endif
154
+
174
+
155
static void panthor_gem_free_object(struct drm_gem_object *obj)
175
static void panthor_gem_free_object(struct drm_gem_object *obj)
156
{
176
{
157
    struct panthor_gem_object *bo = to_panthor_bo(obj);
177
    struct panthor_gem_object *bo = to_panthor_bo(obj);
158
    struct drm_gem_object *vm_root_gem = bo->exclusive_vm_root_gem;
178
    struct drm_gem_object *vm_root_gem = bo->exclusive_vm_root_gem;
159
179
160
+    panthor_gem_debugfs_bo_rm(bo);
180
+    panthor_gem_debugfs_bo_rm(bo);
161
+
181
+
162
    kfree(bo->label.str);
182
    /*
163
    mutex_destroy(&bo->label.lock);
183
     * Label might have been allocated with kstrdup_const(),
164
184
     * we need to take that into account when freeing the memory
165
@@ -XXX,XX +XXX,XX @@ struct drm_gem_object *panthor_gem_create_object(struct drm_device *ddev, size_t
185
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
166
    drm_gem_gpuva_set_lock(&obj->base.base, &obj->gpuva_list_lock);
186
    struct drm_gem_shmem_object *obj;
167
    mutex_init(&obj->label.lock);
187
    struct panthor_kernel_bo *kbo;
168
188
    struct panthor_gem_object *bo;
169
+    panthor_gem_debugfs_bo_init(obj);
189
+    u32 type_mask = PANTHOR_BO_KERNEL;
170
+
190
    int ret;
171
    return &obj->base.base;
191
172
}
192
    if (drm_WARN_ON(&ptdev->base, !vm))
173
193
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
194
    kbo->obj = &obj->base;
195
    bo->flags = bo_flags;
196
197
+    if (vm == panthor_fw_vm(ptdev))
198
+        type_mask |= PANTHOR_BO_FW_MAPPED;
199
+
200
    panthor_gem_kernel_bo_set_label(kbo, name);
201
+    panthor_gem_debugfs_bo_add(to_panthor_bo(kbo->obj), type_mask);
202
+
203
    /* The system and GPU MMU page size might differ, which becomes a
204
     * problem for FW sections that need to be mapped at explicit address
205
     * since our PAGE_SIZE alignment might cover a VA range that's
174
@@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file,
206
@@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file,
175
    /* drop reference from allocate - handle holds it now. */
207
    /* drop reference from allocate - handle holds it now. */
176
    drm_gem_object_put(&shmem->base);
208
    drm_gem_object_put(&shmem->base);
177
209
178
+    panthor_gem_debugfs_bo_add(bo);
210
+    panthor_gem_debugfs_bo_add(bo, 0);
179
+
211
+
180
    return ret;
212
    return ret;
181
}
213
}
182
214
183
@@ -XXX,XX +XXX,XX @@ panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label)
215
@@ -XXX,XX +XXX,XX @@ panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label)
184
{
216
185
    panthor_gem_bo_set_label(bo->obj, kstrdup_const(label, GFP_KERNEL));
217
    panthor_gem_bo_set_label(bo->obj, kstrdup_const(str, GFP_KERNEL));
186
}
218
}
187
+
219
+
188
+#ifdef CONFIG_DEBUG_FS
220
+#ifdef CONFIG_DEBUG_FS
189
+static bool panfrost_gem_print_flag(const char *name,
221
+static bool panfrost_gem_print_flag(const char *name,
190
+                 bool is_set,
222
+                 bool is_set,
...
...
217
+        return;
249
+        return;
218
+
250
+
219
+    resident_size = bo->base.pages != NULL ? bo->base.base.size : 0;
251
+    resident_size = bo->base.pages != NULL ? bo->base.base.size : 0;
220
+
252
+
221
+    snprintf(creator_info, sizeof(creator_info),
253
+    snprintf(creator_info, sizeof(creator_info),
222
+         "%s/%d", bo->gems.creator.process_name, bo->gems.creator.tgid);
254
+         "%s/%d", bo->debugfs.creator.process_name, bo->debugfs.creator.tgid);
223
+    seq_printf(m, "%-32s%-16d%-16d%-16zd%-16zd%-16lx",
255
+    seq_printf(m, "%-32s%-16d%-16d%-16zd%-16zd%-16lx",
224
+         creator_info,
256
+         creator_info,
225
+         bo->base.base.name,
257
+         bo->base.base.name,
226
+         refcount,
258
+         refcount,
227
+         bo->base.base.size,
259
+         bo->base.base.size,
...
...
239
+        has_flags = panfrost_gem_print_flag("purgeable", true, has_flags, m);
271
+        has_flags = panfrost_gem_print_flag("purgeable", true, has_flags, m);
240
+    if (!has_flags)
272
+    if (!has_flags)
241
+        seq_puts(m, "none");
273
+        seq_puts(m, "none");
242
+    seq_puts(m, ")");
274
+    seq_puts(m, ")");
243
+
275
+
276
+    seq_printf(m, "%-6s0x%-2x", "", bo->debugfs.bo_mask);
277
+
244
+    mutex_lock(&bo->label.lock);
278
+    mutex_lock(&bo->label.lock);
245
+    seq_printf(m, "%-16s%-60s", "", bo->label.str ? : NULL);
279
+    seq_printf(m, "%-6s%-60s", "", bo->label.str ? : NULL);
246
+    mutex_unlock(&bo->label.lock);
280
+    mutex_unlock(&bo->label.lock);
247
+    seq_puts(m, "\n");
281
+    seq_puts(m, "\n");
248
+
282
+
249
+    totals->size += bo->base.base.size;
283
+    totals->size += bo->base.base.size;
250
+    totals->resident += resident_size;
284
+    totals->resident += resident_size;
...
...
256
+                 struct seq_file *m)
290
+                 struct seq_file *m)
257
+{
291
+{
258
+    struct gem_size_totals totals = {0};
292
+    struct gem_size_totals totals = {0};
259
+    struct panthor_gem_object *bo;
293
+    struct panthor_gem_object *bo;
260
+
294
+
261
+    seq_puts(m, "created-by global-name refcount size resident-size file-offset flags label\n");
295
+    seq_puts(m, "created-by global-name refcount size resident-size file-offset flags kflags label\n");
262
+    seq_puts(m, "------------------------------------------------------------------------------------------------------------------------------------------------\n");
296
+    seq_puts(m, "------------------------------------------------------------------------------------------------------------------------------------------------\n");
263
+
297
+
264
+    scoped_guard(mutex, &ptdev->gems.lock) {
298
+    scoped_guard(mutex, &ptdev->gems.lock) {
265
+        list_for_each_entry(bo, &ptdev->gems.node, gems.node)
299
+        list_for_each_entry(bo, &ptdev->gems.node, debugfs.node)
266
+            panthor_gem_debugfs_bo_print(bo, m, &totals);
300
+            panthor_gem_debugfs_bo_print(bo, m, &totals);
267
+    }
301
+    }
268
+
302
+
269
+    seq_puts(m, "================================================================================================================================================\n");
303
+    seq_puts(m, "==========================================================================================================================================================\n");
270
+    seq_printf(m, "Total size: %zd, Total resident: %zd, Total reclaimable: %zd\n",
304
+    seq_printf(m, "Total size: %zd, Total resident: %zd, Total reclaimable: %zd\n",
271
+         totals.size, totals.resident, totals.reclaimable);
305
+         totals.size, totals.resident, totals.reclaimable);
272
+}
306
+}
273
+#endif
307
+#endif
274
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
308
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
275
index XXXXXXX..XXXXXXX 100644
309
index XXXXXXX..XXXXXXX 100644
276
--- a/drivers/gpu/drm/panthor/panthor_gem.h
310
--- a/drivers/gpu/drm/panthor/panthor_gem.h
277
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
311
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
278
@@ -XXX,XX +XXX,XX @@
312
@@ -XXX,XX +XXX,XX @@ struct panthor_vm;
279
313
280
struct panthor_vm;
314
#define PANTHOR_BO_LABEL_MAXLEN    PAGE_SIZE
281
315
316
+#define PANTHOR_BO_KERNEL    BIT(0)
317
+#define PANTHOR_BO_FW_MAPPED    BIT(1)
318
+
282
+/**
319
+/**
283
+ * struct panthor_gem_debugfs - GEM object's DebugFS list information
320
+ * struct panthor_gem_debugfs - GEM object's DebugFS list information
284
+ */
321
+ */
285
+struct panthor_gem_debugfs {
322
+struct panthor_gem_debugfs {
286
+    /**
323
+    /**
...
...
295
+        char process_name[TASK_COMM_LEN];
332
+        char process_name[TASK_COMM_LEN];
296
+
333
+
297
+        /** @creator.tgid: PID of the thread's group leader within its process */
334
+        /** @creator.tgid: PID of the thread's group leader within its process */
298
+        pid_t tgid;
335
+        pid_t tgid;
299
+    } creator;
336
+    } creator;
337
+
338
+    /** @bo_mask: Bitmask encoding BO type as {USER, KERNEL} x {GPU, FW} */
339
+    u32 bo_mask;
300
+};
340
+};
301
+
341
+
302
/**
342
/**
303
* struct panthor_gem_object - Driver specific GEM object.
343
* struct panthor_gem_object - Driver specific GEM object.
304
*/
344
*/
305
@@ -XXX,XX +XXX,XX @@ struct panthor_gem_object {
345
@@ -XXX,XX +XXX,XX @@ struct panthor_gem_object {
306
        /** @lock.str: Protects access to the @label.str field. */
346
        /** @lock.str: Protects access to the @label.str field. */
307
        struct mutex lock;
347
        struct mutex lock;
308
    } label;
348
    } label;
309
+
349
+
310
+#ifdef CONFIG_DEBUG_FS
350
+#ifdef CONFIG_DEBUG_FS
311
+    struct panthor_gem_debugfs gems;
351
+    struct panthor_gem_debugfs debugfs;
312
+#endif
352
+#endif
313
};
353
};
314
354
315
/**
355
/**
316
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
356
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
...
...
diff view generated by jsdifflib