Skip to content

Commit e79a239

Browse files
Lee Jonesalexdeucher
authored andcommitted
drm/amdkfd: Create file descriptor after client is added to smi_clients list
This ensures userspace cannot prematurely clean-up the client before it is fully initialised which has been proven to cause issues in the past. Cc: Felix Kuehling <Felix.Kuehling@amd.com> Cc: Alex Deucher <alexander.deucher@amd.com> Cc: "Christian König" <christian.koenig@amd.com> Cc: "Pan, Xinhui" <Xinhui.Pan@amd.com> Cc: David Airlie <airlied@linux.ie> Cc: Daniel Vetter <daniel@ffwll.ch> Cc: amd-gfx@lists.freedesktop.org Cc: dri-devel@lists.freedesktop.org Signed-off-by: Lee Jones <lee.jones@linaro.org> Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
1 parent ef1a080 commit e79a239

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -247,15 +247,6 @@ int kfd_smi_event_open(struct kfd_dev *dev, uint32_t *fd)
247247
return ret;
248248
}
249249

250-
ret = anon_inode_getfd(kfd_smi_name, &kfd_smi_ev_fops, (void *)client,
251-
O_RDWR);
252-
if (ret < 0) {
253-
kfifo_free(&client->fifo);
254-
kfree(client);
255-
return ret;
256-
}
257-
*fd = ret;
258-
259250
init_waitqueue_head(&client->wait_queue);
260251
spin_lock_init(&client->lock);
261252
client->events = 0;
@@ -265,5 +256,20 @@ int kfd_smi_event_open(struct kfd_dev *dev, uint32_t *fd)
265256
list_add_rcu(&client->list, &dev->smi_clients);
266257
spin_unlock(&dev->smi_lock);
267258

259+
ret = anon_inode_getfd(kfd_smi_name, &kfd_smi_ev_fops, (void *)client,
260+
O_RDWR);
261+
if (ret < 0) {
262+
spin_lock(&dev->smi_lock);
263+
list_del_rcu(&client->list);
264+
spin_unlock(&dev->smi_lock);
265+
266+
synchronize_rcu();
267+
268+
kfifo_free(&client->fifo);
269+
kfree(client);
270+
return ret;
271+
}
272+
*fd = ret;
273+
268274
return 0;
269275
}

0 commit comments

Comments
 (0)