drm/sprd: save pid/tgid in private file data 01/66501/1 accepted/tizen/mobile/20160421.011022 submit/tizen/20160420.073210
authorJoonyoung Shim <jy0922.shim@samsung.com>
Tue, 22 Mar 2016 07:39:19 +0000 (16:39 +0900)
committerJoonyoung Shim <jy0922.shim@samsung.com>
Tue, 19 Apr 2016 07:04:55 +0000 (16:04 +0900)
Let's save pid/tgid in private file data only once when gem object is
created or prime_fd is imported and use them on gem_info. This can solve
wrong pid/tgid information of gem_info node for imported gem object
found on tizen_3.0 platform.

Change-Id: Icfefe0d140ff2955144d509c862875d2d48241eb
Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
drivers/gpu/drm/sprd/sprd_drm_drv.c
drivers/gpu/drm/sprd/sprd_drm_drv.h
drivers/gpu/drm/sprd/sprd_drm_gem.c
drivers/gpu/drm/sprd/sprd_drm_gem.h

index 6846b40..c9a38aa 100644 (file)
@@ -49,6 +49,8 @@ static int sprd_drm_gem_one_info(int id, void *ptr, void *data)
 {
        struct drm_gem_object *obj = (struct drm_gem_object *)ptr;
        struct sprd_drm_gem_info_data *gem_info_data = data;
+       struct drm_sprd_file_private *file_priv =
+                                       gem_info_data->filp->driver_priv;
        struct sprd_drm_gem_obj *sprd_gem;
        struct sprd_drm_gem_buf *buf;
 
@@ -65,8 +67,8 @@ static int sprd_drm_gem_one_info(int id, void *ptr, void *data)
        seq_printf(gem_info_data->m,
                        "%5d\t%5d\t%4d\t%4d\t\t%4d\t0x%08lx\t0x%x\t%4d\t%4d\t\t"
                        "%4d\t\t0x%p\t%6d\n",
-                               (unsigned long)sprd_gem->pid,
-                               (unsigned long)sprd_gem->tgid,
+                               file_priv->pid,
+                               file_priv->tgid,
                                id,
                                atomic_read(&obj->refcount.refcount) - 1,
                                obj->handle_count,
@@ -635,7 +637,7 @@ static struct drm_driver sprd_drm_driver = {
        .dumb_map_offset        = sprd_drm_gem_dumb_map_offset,
        .dumb_destroy           = sprd_drm_gem_dumb_destroy,
        .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
-       .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
+       .prime_fd_to_handle     = sprd_drm_gem_prime_fd_to_handle,
 #ifdef CONFIG_DRM_SPRD_DMABUF
        .gem_prime_export       = sprd_dmabuf_prime_export,
        .gem_prime_import       = sprd_dmabuf_prime_import,
index e0dbd4a..f4e63fc 100644 (file)
@@ -45,6 +45,8 @@ struct sprd_drm_ipp_private {
 
 struct drm_sprd_file_private {
        struct sprd_drm_ipp_private     *ipp_priv;
+        pid_t                          pid;
+        pid_t                          tgid;
 };
 
 /*
index 1fe2363..537f2fc 100755 (executable)
@@ -282,6 +282,25 @@ static int sprd_drm_gem_handle_create(struct drm_gem_object *obj,
        return 0;
 }
 
+static void sprd_drm_gem_register_pid(struct drm_file *file_priv)
+{
+       struct drm_sprd_file_private *driver_priv = file_priv->driver_priv;
+
+       if (!driver_priv->pid && !driver_priv->tgid) {
+               driver_priv->pid = task_pid_nr(current);
+               driver_priv->tgid = task_tgid_nr(current);
+       } else {
+               if (driver_priv->pid != task_pid_nr(current))
+                       DRM_DEBUG_KMS("wrong pid: %ld, %ld\n",
+                                       (unsigned long)driver_priv->pid,
+                                       (unsigned long)task_pid_nr(current));
+               if (driver_priv->tgid != task_tgid_nr(current))
+                       DRM_DEBUG_KMS("wrong tgid: %ld, %ld\n",
+                                       (unsigned long)driver_priv->tgid,
+                                       (unsigned long)task_tgid_nr(current));
+       }
+}
+
 void sprd_drm_gem_destroy(struct sprd_drm_gem_obj *sprd_gem_obj)
 {
        struct drm_gem_object *obj;
@@ -447,6 +466,8 @@ int sprd_drm_gem_create_ioctl(struct drm_device *dev, void *data,
                return ret;
        }
 
+       sprd_drm_gem_register_pid(file_priv);
+
        do_gettimeofday(&val_end);
        time_end = (uint64_t)(val_end.tv_sec * 1000000 + val_end.tv_usec);
 
@@ -481,6 +502,8 @@ int sprd_drm_gem_create_index_ioctl(struct drm_device *dev, void *data,
                return ret;
        }
 
+       sprd_drm_gem_register_pid(file_priv);
+
        DRM_INFO("%s:h[%d]cnt[%d]sz[%d %d %d]f[0x%x]o[0x%x]a[0x%x]\n",
                __func__,args->handle, args->bufcount,
                (int)args->idx_size[0], (int)args->idx_size[1], (int)args->idx_size[2],
@@ -649,6 +672,22 @@ err:
        return ERR_PTR(ret);
 }
 
+int sprd_drm_gem_prime_fd_to_handle(struct drm_device *dev,
+               struct drm_file *file_priv, int prime_fd, uint32_t *handle)
+{
+       int ret;
+
+       ret = drm_gem_prime_fd_to_handle(dev, file_priv, prime_fd, handle);
+       if (ret < 0)
+               goto out;
+
+       sprd_drm_gem_register_pid(file_priv);
+
+out:
+       return ret;
+}
+
+
 void *sprd_drm_gem_get_dma_addr(struct drm_device *dev,
                                        unsigned int gem_handle,
                                        struct drm_file *file_priv)
@@ -1093,6 +1132,8 @@ int sprd_drm_gem_dumb_create(struct drm_file *file_priv,
                return ret;
        }
 
+       sprd_drm_gem_register_pid(file_priv);
+
        return 0;
 }
 
index 7e787cc..b8acc10 100644 (file)
@@ -126,6 +126,9 @@ struct dma_buf *sprd_prime_export(struct drm_device *dev,
 struct drm_gem_object *sprd_prime_import(struct drm_device *dev,
                                         struct dma_buf *dma_buf);
 
+int sprd_drm_gem_prime_fd_to_handle(struct drm_device *dev,
+               struct drm_file *file_priv, int prime_fd, uint32_t *handle);
+
 /*
  * get dma address from gem handle and this function could be used for
  * other drivers such as 2d/3d acceleration drivers.