Loading drivers/char/adsprpc.c +44 −11 Original line number Diff line number Diff line Loading @@ -567,9 +567,10 @@ struct fastrpc_mmap { uintptr_t raddr; int uncached; int secure; bool is_persistent; //the map is persistenet across sessions int frpc_md_index; //Minidump unique index bool is_persistent; /* Indicates whether map is persistent */ int frpc_md_index; /* Minidump unique index */ uintptr_t attr; bool in_use; /* Indicates if persistent map is in use*/ struct timespec64 map_start_time; struct timespec64 map_end_time; }; Loading Loading @@ -1259,6 +1260,11 @@ static void fastrpc_mmap_free(struct fastrpc_mmap *map, uint32_t flags) map->size, map->va, map->refs); return; } if (map->is_persistent && map->in_use) { spin_lock(&me->hlock); map->in_use = false; spin_unlock(&me->hlock); } } else { map->refs--; if (!map->refs) Loading Loading @@ -1332,6 +1338,27 @@ static void fastrpc_mmap_free(struct fastrpc_mmap *map, uint32_t flags) static int fastrpc_session_alloc(struct fastrpc_channel_ctx *chan, int secure, struct fastrpc_session_ctx **session); static inline bool fastrpc_get_persistent_map(size_t len, struct fastrpc_mmap **pers_map) { struct fastrpc_apps *me = &gfa; struct fastrpc_mmap *map = NULL; struct hlist_node *n = NULL; bool found = false; spin_lock(&me->hlock); hlist_for_each_entry_safe(map, n, &me->maps, hn) { if (len == map->len && map->is_persistent && !map->in_use) { *pers_map = map; map->in_use = true; found = true; break; } } spin_unlock(&me->hlock); return found; } static int fastrpc_mmap_create(struct fastrpc_file *fl, int fd, unsigned int attr, uintptr_t va, size_t len, int mflags, struct fastrpc_mmap **ppmap) Loading Loading @@ -3853,12 +3880,17 @@ static int fastrpc_init_create_static_process(struct fastrpc_file *fl, if (!me->staticpd_flags && !me->legacy_remote_heap) { inbuf.pageslen = 1; if (!fastrpc_get_persistent_map(init->memlen, &mem)) { mutex_lock(&fl->map_mutex); err = fastrpc_mmap_create(fl, -1, 0, init->mem, init->memlen, ADSP_MMAP_REMOTE_HEAP_ADDR, &mem); mutex_unlock(&fl->map_mutex); if (err) goto bail; spin_lock(&me->hlock); mem->in_use = true; spin_unlock(&me->hlock); } phys = mem->phys; size = mem->size; /* Loading Loading @@ -4520,6 +4552,7 @@ static int fastrpc_mmap_remove_ssr(struct fastrpc_file *fl) hlist_for_each_entry_safe(map, n, &me->maps, hn) { match = map; if (map->is_persistent) { map->in_use = false; match = NULL; continue; } Loading Loading
drivers/char/adsprpc.c +44 −11 Original line number Diff line number Diff line Loading @@ -567,9 +567,10 @@ struct fastrpc_mmap { uintptr_t raddr; int uncached; int secure; bool is_persistent; //the map is persistenet across sessions int frpc_md_index; //Minidump unique index bool is_persistent; /* Indicates whether map is persistent */ int frpc_md_index; /* Minidump unique index */ uintptr_t attr; bool in_use; /* Indicates if persistent map is in use*/ struct timespec64 map_start_time; struct timespec64 map_end_time; }; Loading Loading @@ -1259,6 +1260,11 @@ static void fastrpc_mmap_free(struct fastrpc_mmap *map, uint32_t flags) map->size, map->va, map->refs); return; } if (map->is_persistent && map->in_use) { spin_lock(&me->hlock); map->in_use = false; spin_unlock(&me->hlock); } } else { map->refs--; if (!map->refs) Loading Loading @@ -1332,6 +1338,27 @@ static void fastrpc_mmap_free(struct fastrpc_mmap *map, uint32_t flags) static int fastrpc_session_alloc(struct fastrpc_channel_ctx *chan, int secure, struct fastrpc_session_ctx **session); static inline bool fastrpc_get_persistent_map(size_t len, struct fastrpc_mmap **pers_map) { struct fastrpc_apps *me = &gfa; struct fastrpc_mmap *map = NULL; struct hlist_node *n = NULL; bool found = false; spin_lock(&me->hlock); hlist_for_each_entry_safe(map, n, &me->maps, hn) { if (len == map->len && map->is_persistent && !map->in_use) { *pers_map = map; map->in_use = true; found = true; break; } } spin_unlock(&me->hlock); return found; } static int fastrpc_mmap_create(struct fastrpc_file *fl, int fd, unsigned int attr, uintptr_t va, size_t len, int mflags, struct fastrpc_mmap **ppmap) Loading Loading @@ -3853,12 +3880,17 @@ static int fastrpc_init_create_static_process(struct fastrpc_file *fl, if (!me->staticpd_flags && !me->legacy_remote_heap) { inbuf.pageslen = 1; if (!fastrpc_get_persistent_map(init->memlen, &mem)) { mutex_lock(&fl->map_mutex); err = fastrpc_mmap_create(fl, -1, 0, init->mem, init->memlen, ADSP_MMAP_REMOTE_HEAP_ADDR, &mem); mutex_unlock(&fl->map_mutex); if (err) goto bail; spin_lock(&me->hlock); mem->in_use = true; spin_unlock(&me->hlock); } phys = mem->phys; size = mem->size; /* Loading Loading @@ -4520,6 +4552,7 @@ static int fastrpc_mmap_remove_ssr(struct fastrpc_file *fl) hlist_for_each_entry_safe(map, n, &me->maps, hn) { match = map; if (map->is_persistent) { map->in_use = false; match = NULL; continue; } Loading