Merge "disp: msm: sde: add null check for drm file in msm_release"
diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c
index c7aa94f..233c3c5 100644
--- a/drivers/char/adsprpc.c
+++ b/drivers/char/adsprpc.c
@@ -352,6 +352,7 @@
int uncached;
int secure;
uintptr_t attr;
+ bool is_filemap; /*flag to indicate map used in process init*/
};
enum fastrpc_perfkeys {
@@ -407,6 +408,7 @@
struct mutex perf_mutex;
struct pm_qos_request pm_qos_req;
int qos_request;
+ struct mutex pm_qos_mutex;
struct mutex map_mutex;
struct mutex fl_map_mutex;
int refcount;
@@ -700,9 +702,10 @@
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;
@@ -714,9 +717,10 @@
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;
@@ -858,6 +862,7 @@
map->fl = fl;
map->fd = fd;
map->attr = attr;
+ map->is_filemap = false;
if (mflags == ADSP_MMAP_HEAP_ADDR ||
mflags == ADSP_MMAP_REMOTE_HEAP_ADDR) {
unsigned long dma_attrs = DMA_ATTR_SKIP_ZEROING |
@@ -2243,6 +2248,8 @@
mutex_lock(&fl->fl_map_mutex);
VERIFY(err, !fastrpc_mmap_create(fl, init->filefd, 0,
init->file, init->filelen, mflags, &file));
+ if (file)
+ file->is_filemap = true;
mutex_unlock(&fl->fl_map_mutex);
if (err)
goto bail;
@@ -3110,6 +3117,7 @@
mutex_destroy(&fl->perf_mutex);
mutex_destroy(&fl->fl_map_mutex);
mutex_destroy(&fl->map_mutex);
+ mutex_destroy(&fl->pm_qos_mutex);
kfree(fl);
return 0;
}
@@ -3611,6 +3619,7 @@
hlist_add_head(&fl->hn, &me->drivers);
spin_unlock(&me->hlock);
mutex_init(&fl->perf_mutex);
+ mutex_init(&fl->pm_qos_mutex);
return 0;
}
@@ -3618,22 +3627,26 @@
{
int err = 0, buf_size = 0;
char strpid[PID_SIZE];
+ char cur_comm[TASK_COMM_LEN];
+ memcpy(cur_comm, current->comm, TASK_COMM_LEN);
+ cur_comm[TASK_COMM_LEN-1] = '\0';
fl->tgid = current->tgid;
snprintf(strpid, PID_SIZE, "%d", current->pid);
- buf_size = strlen(current->comm) + strlen("_") + strlen(strpid) + 1;
+ buf_size = strlen(cur_comm) + strlen("_") + strlen(strpid) + 1;
fl->debug_buf = kzalloc(buf_size, GFP_KERNEL);
if (!fl->debug_buf) {
err = -ENOMEM;
return err;
}
- snprintf(fl->debug_buf, UL_SIZE, "%.10s%s%d",
- current->comm, "_", current->pid);
+ snprintf(fl->debug_buf, buf_size, "%.10s%s%d",
+ cur_comm, "_", current->pid);
fl->debugfs_file = debugfs_create_file(fl->debug_buf, 0644,
debugfs_root, fl, &debugfs_fops);
if (!fl->debugfs_file)
pr_warn("Error: %s: %s: failed to create debugfs file %s\n",
- current->comm, __func__, fl->debug_buf);
+ cur_comm, __func__, fl->debug_buf);
+
return err;
}
@@ -3709,12 +3722,14 @@
VERIFY(err, latency != 0);
if (err)
goto bail;
+ mutex_lock(&fl->pm_qos_mutex);
if (!fl->qos_request) {
pm_qos_add_request(&fl->pm_qos_req,
PM_QOS_CPU_DMA_LATENCY, latency);
fl->qos_request = 1;
} else
pm_qos_update_request(&fl->pm_qos_req, latency);
+ mutex_unlock(&fl->pm_qos_mutex);
break;
case FASTRPC_CONTROL_SMMU:
if (!me->legacy)