Skip to content

Commit 0b2ad4f

Browse files
committed
drm/vc4: Stop the active perfmon before being destroyed
Upon closing the file descriptor, the active performance monitor is not stopped. Although all perfmons are destroyed in `vc4_perfmon_close_file()`, the active performance monitor's pointer (`vc4->active_perfmon`) is still retained. If we open a new file descriptor and submit a few jobs with performance monitors, the driver will attempt to stop the active performance monitor using the stale pointer in `vc4->active_perfmon`. However, this pointer is no longer valid because the previous process has already terminated, and all performance monitors associated with it have been destroyed and freed. To fix this, when the active performance monitor belongs to a given process, explicitly stop it before destroying and freeing it. Cc: [email protected] # v4.17+ Cc: Boris Brezillon <[email protected]> Cc: Juan A. Suarez Romero <[email protected]> Fixes: 65101d8 ("drm/vc4: Expose performance counters to userspace") Signed-off-by: Maíra Canal <[email protected]> Reviewed-by: Juan A. Suarez <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 7d1fd36 commit 0b2ad4f

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

drivers/gpu/drm/vc4/vc4_perfmon.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ void vc4_perfmon_open_file(struct vc4_file *vc4file)
116116
static int vc4_perfmon_idr_del(int id, void *elem, void *data)
117117
{
118118
struct vc4_perfmon *perfmon = elem;
119+
struct vc4_dev *vc4 = (struct vc4_dev *)data;
120+
121+
/* If the active perfmon is being destroyed, stop it first */
122+
if (perfmon == vc4->active_perfmon)
123+
vc4_perfmon_stop(vc4, perfmon, false);
119124

120125
vc4_perfmon_put(perfmon);
121126

@@ -130,7 +135,7 @@ void vc4_perfmon_close_file(struct vc4_file *vc4file)
130135
return;
131136

132137
mutex_lock(&vc4file->perfmon.lock);
133-
idr_for_each(&vc4file->perfmon.idr, vc4_perfmon_idr_del, NULL);
138+
idr_for_each(&vc4file->perfmon.idr, vc4_perfmon_idr_del, vc4);
134139
idr_destroy(&vc4file->perfmon.idr);
135140
mutex_unlock(&vc4file->perfmon.lock);
136141
mutex_destroy(&vc4file->perfmon.lock);

0 commit comments

Comments
 (0)