From c677c469ec0dfc7a84b8157f66c997f586b8d60a Mon Sep 17 00:00:00 2001 From: Joonyoung Shim Date: Tue, 22 Mar 2016 16:39:19 +0900 Subject: [PATCH] drm/sprd: save pid/tgid in private file data 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 --- drivers/gpu/drm/sprd/sprd_drm_drv.c | 8 +++++--- drivers/gpu/drm/sprd/sprd_drm_drv.h | 2 ++ drivers/gpu/drm/sprd/sprd_drm_gem.c | 41 +++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/sprd/sprd_drm_gem.h | 3 +++ 4 files changed, 51 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/sprd/sprd_drm_drv.c b/drivers/gpu/drm/sprd/sprd_drm_drv.c index 6846b40..c9a38aa 100644 --- a/drivers/gpu/drm/sprd/sprd_drm_drv.c +++ b/drivers/gpu/drm/sprd/sprd_drm_drv.c @@ -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, diff --git a/drivers/gpu/drm/sprd/sprd_drm_drv.h b/drivers/gpu/drm/sprd/sprd_drm_drv.h index e0dbd4a..f4e63fc 100644 --- a/drivers/gpu/drm/sprd/sprd_drm_drv.h +++ b/drivers/gpu/drm/sprd/sprd_drm_drv.h @@ -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; }; /* diff --git a/drivers/gpu/drm/sprd/sprd_drm_gem.c b/drivers/gpu/drm/sprd/sprd_drm_gem.c index 1fe2363..537f2fc 100755 --- a/drivers/gpu/drm/sprd/sprd_drm_gem.c +++ b/drivers/gpu/drm/sprd/sprd_drm_gem.c @@ -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; } diff --git a/drivers/gpu/drm/sprd/sprd_drm_gem.h b/drivers/gpu/drm/sprd/sprd_drm_gem.h index 7e787cc..b8acc10 100644 --- a/drivers/gpu/drm/sprd/sprd_drm_gem.h +++ b/drivers/gpu/drm/sprd/sprd_drm_gem.h @@ -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. -- 2.7.4