OSDN Git Service

msm: ADSPRPC: avoid sending new requests to dsp while device_release
authortharun kumar <mtharu@codeaurora.org>
Mon, 3 Jul 2017 11:37:03 +0000 (17:07 +0530)
committerGerrit - the friendly Code Review server <code-review@localhost>
Tue, 18 Jul 2017 09:47:45 +0000 (02:47 -0700)
When fastrpc_device_release is in progress, don't send any new
requets to DSP

Change-Id: I4d9e2f06485cde6dbd3d7aef402e3e853e0be998
Acked-by: Chenna Kesava Raju <chennak@qti.qualcomm.com>
Signed-off-by: Tharun Kumar Merugu <mtharu@codeaurora.org>
drivers/char/adsprpc.c

index a841721..7a4b529 100644 (file)
@@ -291,6 +291,7 @@ struct fastrpc_file {
        int cid;
        int ssrcount;
        int pd;
+       int file_close;
        struct fastrpc_apps *apps;
        struct fastrpc_perf perf;
        struct dentry *debugfs_file;
@@ -2195,6 +2196,9 @@ static int fastrpc_file_free(struct fastrpc_file *fl)
                return 0;
        }
        (void)fastrpc_release_current_dsp_process(fl);
+       spin_lock(&fl->hlock);
+       fl->file_close = 1;
+       spin_unlock(&fl->hlock);
        fastrpc_context_list_dtor(fl);
        fastrpc_buf_list_free(fl);
        hlist_for_each_entry_safe(map, n, &fl->maps, hn) {
@@ -2583,6 +2587,14 @@ static long fastrpc_device_ioctl(struct file *file, unsigned int ioctl_num,
 
        p.inv.fds = 0;
        p.inv.attrs = 0;
+       spin_lock(&fl->hlock);
+       if (fl->file_close == 1) {
+               err = EBADF;
+               pr_warn("ADSPRPC: fastrpc_device_release is happening, So not sending any new requests to DSP");
+               spin_unlock(&fl->hlock);
+               goto bail;
+       }
+       spin_unlock(&fl->hlock);
 
        switch (ioctl_num) {
        case FASTRPC_IOCTL_INVOKE: