[PATCH v5 7/11] drm/amdkfd: Asynchronously free smi_client

Felix Kuehling felix.kuehling at amd.com
Thu Jun 30 14:45:03 UTC 2022


Am 2022-06-28 um 10:50 schrieb Philip Yang:
> The synchronize_rcu may take several ms, which noticeably slows down
> applications close SMI event handle. Use call_rcu to free client->fifo
> and client asynchronously and eliminate the synchronize_rcu call in the
> user thread.
>
> Signed-off-by: Philip Yang <Philip.Yang at amd.com>

Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>


> ---
>   drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c | 14 ++++++++++----
>   1 file changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c
> index e5896b7a16dd..0472b56de245 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c
> @@ -38,6 +38,7 @@ struct kfd_smi_client {
>   	uint64_t events;
>   	struct kfd_dev *dev;
>   	spinlock_t lock;
> +	struct rcu_head rcu;
>   	pid_t pid;
>   	bool suser;
>   };
> @@ -137,6 +138,14 @@ static ssize_t kfd_smi_ev_write(struct file *filep, const char __user *user,
>   	return sizeof(events);
>   }
>   
> +static void kfd_smi_ev_client_free(struct rcu_head *p)
> +{
> +	struct kfd_smi_client *ev = container_of(p, struct kfd_smi_client, rcu);
> +
> +	kfifo_free(&ev->fifo);
> +	kfree(ev);
> +}
> +
>   static int kfd_smi_ev_release(struct inode *inode, struct file *filep)
>   {
>   	struct kfd_smi_client *client = filep->private_data;
> @@ -146,10 +155,7 @@ static int kfd_smi_ev_release(struct inode *inode, struct file *filep)
>   	list_del_rcu(&client->list);
>   	spin_unlock(&dev->smi_lock);
>   
> -	synchronize_rcu();
> -	kfifo_free(&client->fifo);
> -	kfree(client);
> -
> +	call_rcu(&client->rcu, kfd_smi_ev_client_free);
>   	return 0;
>   }
>   


More information about the amd-gfx mailing list