drm/amdkfd: Asynchronously free smi_client
authorPhilip Yang <Philip.Yang@amd.com>
Fri, 8 Apr 2022 14:25:11 +0000 (10:25 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 30 Jun 2022 19:31:30 +0000 (15:31 -0400)
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@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c

index e5896b7a16dd15f86ec92adea864933b7d61b7e9..0472b56de2457ee98d451ec69c6242129c94c9ed 100644 (file)
@@ -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;
 }