Merge "net:sockev: hold file reference till the sock event is sent"
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)
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index ff8c1cd..ce090d6 100755
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -57,6 +57,8 @@
#define MSM_VERSION_MINOR 2
#define MSM_VERSION_PATCHLEVEL 0
+static DEFINE_MUTEX(msm_release_lock);
+
static void msm_fb_output_poll_changed(struct drm_device *dev)
{
struct msm_drm_private *priv = NULL;
@@ -1420,13 +1422,25 @@
static int msm_release(struct inode *inode, struct file *filp)
{
struct drm_file *file_priv = filp->private_data;
- struct drm_minor *minor = file_priv->minor;
- struct drm_device *dev = minor->dev;
- struct msm_drm_private *priv = dev->dev_private;
+ struct drm_minor *minor;
+ struct drm_device *dev;
+ struct msm_drm_private *priv;
struct msm_drm_event *node, *temp, *tmp_node;
u32 count;
unsigned long flags;
LIST_HEAD(tmp_head);
+ int ret = 0;
+
+ mutex_lock(&msm_release_lock);
+
+ if (!file_priv) {
+ ret = -EINVAL;
+ goto end;
+ }
+
+ minor = file_priv->minor;
+ dev = minor->dev;
+ priv = dev->dev_private;
spin_lock_irqsave(&dev->event_lock, flags);
list_for_each_entry_safe(node, temp, &priv->client_event_list,
@@ -1454,7 +1468,11 @@
kfree(node);
}
- return drm_release(inode, filp);
+ ret = drm_release(inode, filp);
+ filp->private_data = NULL;
+end:
+ mutex_unlock(&msm_release_lock);
+ return ret;
}
/**