Loading drivers/char/adsprpc.c +28 −4 Original line number Diff line number Diff line Loading @@ -415,6 +415,7 @@ struct fastrpc_mmap { int uncached; int secure; uintptr_t attr; bool is_filemap; /*flag to indicate map used in process init*/ }; enum fastrpc_perfkeys { Loading Loading @@ -481,6 +482,8 @@ struct fastrpc_file { uint32_t ws_timeout; /* To indicate attempt has been made to allocate memory for debug_buf */ int debug_buf_alloced_attempted; /* Flag to indicate dynamic process creation status*/ bool in_process_create; }; static struct fastrpc_apps gfa; Loading Loading @@ -834,9 +837,10 @@ static int fastrpc_mmap_remove(struct fastrpc_file *fl, uintptr_t va, spin_lock(&me->hlock); hlist_for_each_entry_safe(map, n, &me->maps, hn) { if (map->raddr == va && if (map->refs == 1 && map->raddr == va && map->raddr + map->len == va + len && map->refs == 1) { /*Remove map if not used in process initialization*/ !map->is_filemap) { match = map; hlist_del_init(&map->hn); break; Loading @@ -848,9 +852,10 @@ static int fastrpc_mmap_remove(struct fastrpc_file *fl, uintptr_t va, return 0; } hlist_for_each_entry_safe(map, n, &fl->maps, hn) { if (map->raddr == va && if (map->refs == 1 && map->raddr == va && map->raddr + map->len == va + len && map->refs == 1) { /*Remove map if not used in process initialization*/ !map->is_filemap) { match = map; hlist_del_init(&map->hn); break; Loading Loading @@ -985,6 +990,7 @@ static int fastrpc_mmap_create(struct fastrpc_file *fl, int fd, map->refs = 1; map->fl = fl; map->fd = fd; map->is_filemap = false; map->attr = attr; if (mflags == ADSP_MMAP_HEAP_ADDR || mflags == ADSP_MMAP_REMOTE_HEAP_ADDR) { Loading Loading @@ -2573,6 +2579,15 @@ static int fastrpc_init_process(struct fastrpc_file *fl, int siglen; } inbuf; spin_lock(&fl->hlock); if (fl->in_process_create) { err = -EALREADY; pr_err("Already in create init process\n"); spin_unlock(&fl->hlock); return err; } fl->in_process_create = true; spin_unlock(&fl->hlock); inbuf.pgid = fl->tgid; inbuf.namelen = strlen(current->comm) + 1; inbuf.filelen = init->filelen; Loading @@ -2587,6 +2602,8 @@ static int fastrpc_init_process(struct fastrpc_file *fl, VERIFY(err, !fastrpc_mmap_create(fl, init->filefd, 0, init->file, init->filelen, mflags, &file)); mutex_unlock(&fl->map_mutex); if (file) file->is_filemap = true; if (err) goto bail; } Loading Loading @@ -2780,6 +2797,11 @@ static int fastrpc_init_process(struct fastrpc_file *fl, fastrpc_mmap_free(file, 0); mutex_unlock(&fl->map_mutex); } if (init->flags == FASTRPC_INIT_CREATE) { spin_lock(&fl->hlock); fl->in_process_create = false; spin_unlock(&fl->hlock); } return err; } Loading Loading @@ -3684,6 +3706,7 @@ static int fastrpc_file_free(struct fastrpc_file *fl) } spin_lock(&fl->hlock); fl->file_close = 1; fl->in_process_create = false; spin_unlock(&fl->hlock); if (!IS_ERR_OR_NULL(fl->init_mem)) fastrpc_buf_free(fl->init_mem, 0); Loading Loading @@ -4077,6 +4100,7 @@ static int fastrpc_device_open(struct inode *inode, struct file *filp) fl->cid = -1; fl->dev_minor = dev_minor; fl->init_mem = NULL; fl->in_process_create = false; memset(&fl->perf, 0, sizeof(fl->perf)); fl->qos_request = 0; fl->dsp_proc_init = 0; Loading Loading
drivers/char/adsprpc.c +28 −4 Original line number Diff line number Diff line Loading @@ -415,6 +415,7 @@ struct fastrpc_mmap { int uncached; int secure; uintptr_t attr; bool is_filemap; /*flag to indicate map used in process init*/ }; enum fastrpc_perfkeys { Loading Loading @@ -481,6 +482,8 @@ struct fastrpc_file { uint32_t ws_timeout; /* To indicate attempt has been made to allocate memory for debug_buf */ int debug_buf_alloced_attempted; /* Flag to indicate dynamic process creation status*/ bool in_process_create; }; static struct fastrpc_apps gfa; Loading Loading @@ -834,9 +837,10 @@ static int fastrpc_mmap_remove(struct fastrpc_file *fl, uintptr_t va, spin_lock(&me->hlock); hlist_for_each_entry_safe(map, n, &me->maps, hn) { if (map->raddr == va && if (map->refs == 1 && map->raddr == va && map->raddr + map->len == va + len && map->refs == 1) { /*Remove map if not used in process initialization*/ !map->is_filemap) { match = map; hlist_del_init(&map->hn); break; Loading @@ -848,9 +852,10 @@ static int fastrpc_mmap_remove(struct fastrpc_file *fl, uintptr_t va, return 0; } hlist_for_each_entry_safe(map, n, &fl->maps, hn) { if (map->raddr == va && if (map->refs == 1 && map->raddr == va && map->raddr + map->len == va + len && map->refs == 1) { /*Remove map if not used in process initialization*/ !map->is_filemap) { match = map; hlist_del_init(&map->hn); break; Loading Loading @@ -985,6 +990,7 @@ static int fastrpc_mmap_create(struct fastrpc_file *fl, int fd, map->refs = 1; map->fl = fl; map->fd = fd; map->is_filemap = false; map->attr = attr; if (mflags == ADSP_MMAP_HEAP_ADDR || mflags == ADSP_MMAP_REMOTE_HEAP_ADDR) { Loading Loading @@ -2573,6 +2579,15 @@ static int fastrpc_init_process(struct fastrpc_file *fl, int siglen; } inbuf; spin_lock(&fl->hlock); if (fl->in_process_create) { err = -EALREADY; pr_err("Already in create init process\n"); spin_unlock(&fl->hlock); return err; } fl->in_process_create = true; spin_unlock(&fl->hlock); inbuf.pgid = fl->tgid; inbuf.namelen = strlen(current->comm) + 1; inbuf.filelen = init->filelen; Loading @@ -2587,6 +2602,8 @@ static int fastrpc_init_process(struct fastrpc_file *fl, VERIFY(err, !fastrpc_mmap_create(fl, init->filefd, 0, init->file, init->filelen, mflags, &file)); mutex_unlock(&fl->map_mutex); if (file) file->is_filemap = true; if (err) goto bail; } Loading Loading @@ -2780,6 +2797,11 @@ static int fastrpc_init_process(struct fastrpc_file *fl, fastrpc_mmap_free(file, 0); mutex_unlock(&fl->map_mutex); } if (init->flags == FASTRPC_INIT_CREATE) { spin_lock(&fl->hlock); fl->in_process_create = false; spin_unlock(&fl->hlock); } return err; } Loading Loading @@ -3684,6 +3706,7 @@ static int fastrpc_file_free(struct fastrpc_file *fl) } spin_lock(&fl->hlock); fl->file_close = 1; fl->in_process_create = false; spin_unlock(&fl->hlock); if (!IS_ERR_OR_NULL(fl->init_mem)) fastrpc_buf_free(fl->init_mem, 0); Loading Loading @@ -4077,6 +4100,7 @@ static int fastrpc_device_open(struct inode *inode, struct file *filp) fl->cid = -1; fl->dev_minor = dev_minor; fl->init_mem = NULL; fl->in_process_create = false; memset(&fl->perf, 0, sizeof(fl->perf)); fl->qos_request = 0; fl->dsp_proc_init = 0; Loading