On Thu, 17 Mar 2022, Lee Jones wrote: > Presently the Client can be freed whilst still in use. > > Use the already provided lock to prevent this. > > Cc: Felix Kuehling <Felix.Kuehling@xxxxxxx> > Cc: Alex Deucher <alexander.deucher@xxxxxxx> > Cc: "Christian König" <christian.koenig@xxxxxxx> > Cc: "Pan, Xinhui" <Xinhui.Pan@xxxxxxx> > Cc: David Airlie <airlied@xxxxxxxx> > Cc: Daniel Vetter <daniel@xxxxxxxx> > Cc: amd-gfx@xxxxxxxxxxxxxxxxxxxxx > Cc: dri-devel@xxxxxxxxxxxxxxxxxxxxx > Signed-off-by: Lee Jones <lee.jones@xxxxxxxxxx> > --- I should have clarified here, that: This patch has only been *build* tested. Since I have no way to run this on real H/W. Please ensure this is tested on real H/W before it gets applied, since it *may* have some undesired side-effects. For instance, I have no idea if client->lock plays nicely with dev->smi_lock or whether this may well end up in deadlock. TIA. > drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c > index e4beebb1c80a2..3b9ac1e87231f 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c > @@ -145,8 +145,11 @@ static int kfd_smi_ev_release(struct inode *inode, struct file *filep) > spin_unlock(&dev->smi_lock); > > synchronize_rcu(); > + > + spin_lock(&client->lock); > kfifo_free(&client->fifo); > kfree(client); > + spin_unlock(&client->lock); > > return 0; > } > @@ -247,11 +250,13 @@ int kfd_smi_event_open(struct kfd_dev *dev, uint32_t *fd) > return ret; > } > > + spin_lock(&client->lock); > ret = anon_inode_getfd(kfd_smi_name, &kfd_smi_ev_fops, (void *)client, > O_RDWR); > if (ret < 0) { > kfifo_free(&client->fifo); > kfree(client); > + spin_unlock(&client->lock); > return ret; > } > *fd = ret; > @@ -264,6 +269,7 @@ int kfd_smi_event_open(struct kfd_dev *dev, uint32_t *fd) > spin_lock(&dev->smi_lock); > list_add_rcu(&client->list, &dev->smi_clients); > spin_unlock(&dev->smi_lock); > + spin_unlock(&client->lock); > > return 0; > } -- Lee Jones [李琼斯] Principal Technical Lead - Developer Services Linaro.org │ Open source software for Arm SoCs Follow Linaro: Facebook | Twitter | Blog