drm/exynos: Use the new event init/free functions
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 11 Jan 2016 21:40:57 +0000 (22:40 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 25 Jan 2016 07:40:26 +0000 (08:40 +0100)
Also fixes a bug in IPP with not correctly checking/allocating for
space in the event space. Not a too serious bug since it's not a
real ringbuffer, just a limit to avoid too much kernel allocations.

Cc: Rob Clark <robdclark@gmail.com>
Cc: Inki Dae <inki.dae@samsung.com>
Acked-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1452548477-15905-4-git-send-email-daniel.vetter@ffwll.ch
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/exynos/exynos_drm_g2d.c
drivers/gpu/drm/exynos/exynos_drm_ipp.c

index c17efdb..82e7f95 100644 (file)
@@ -1072,7 +1072,6 @@ int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
        struct drm_exynos_pending_g2d_event *e;
        struct g2d_cmdlist_node *node;
        struct g2d_cmdlist *cmdlist;
-       unsigned long flags;
        int size;
        int ret;
 
@@ -1094,21 +1093,8 @@ int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
        node->event = NULL;
 
        if (req->event_type != G2D_EVENT_NOT) {
-               spin_lock_irqsave(&drm_dev->event_lock, flags);
-               if (file->event_space < sizeof(e->event)) {
-                       spin_unlock_irqrestore(&drm_dev->event_lock, flags);
-                       ret = -ENOMEM;
-                       goto err;
-               }
-               file->event_space -= sizeof(e->event);
-               spin_unlock_irqrestore(&drm_dev->event_lock, flags);
-
                e = kzalloc(sizeof(*node->event), GFP_KERNEL);
                if (!e) {
-                       spin_lock_irqsave(&drm_dev->event_lock, flags);
-                       file->event_space += sizeof(e->event);
-                       spin_unlock_irqrestore(&drm_dev->event_lock, flags);
-
                        ret = -ENOMEM;
                        goto err;
                }
@@ -1116,9 +1102,12 @@ int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
                e->event.base.type = DRM_EXYNOS_G2D_EVENT;
                e->event.base.length = sizeof(e->event);
                e->event.user_data = req->user_data;
-               e->base.event = &e->event.base;
-               e->base.file_priv = file;
-               e->base.destroy = (void (*) (struct drm_pending_event *)) kfree;
+
+               ret = drm_event_reserve_init(drm_dev, file, &e->base, &e->event.base);
+               if (ret) {
+                       kfree(e);
+                       goto err;
+               }
 
                node->event = e;
        }
@@ -1219,12 +1208,8 @@ int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
 err_unmap:
        g2d_unmap_cmdlist_gem(g2d, node, file);
 err_free_event:
-       if (node->event) {
-               spin_lock_irqsave(&drm_dev->event_lock, flags);
-               file->event_space += sizeof(e->event);
-               spin_unlock_irqrestore(&drm_dev->event_lock, flags);
-               kfree(node->event);
-       }
+       if (node->event)
+               drm_event_cancel_free(drm_dev, &node->event->base);
 err:
        g2d_put_cmdlist(g2d, node);
        return ret;
index 67d2423..c8819c0 100644 (file)
@@ -618,27 +618,18 @@ static void ipp_clean_mem_nodes(struct drm_device *drm_dev,
        mutex_unlock(&c_node->mem_lock);
 }
 
-static void ipp_free_event(struct drm_pending_event *event)
-{
-       kfree(event);
-}
-
 static int ipp_get_event(struct drm_device *drm_dev,
                struct drm_exynos_ipp_cmd_node *c_node,
                struct drm_exynos_ipp_queue_buf *qbuf)
 {
        struct drm_exynos_ipp_send_event *e;
-       unsigned long flags;
+       int ret;
 
        DRM_DEBUG_KMS("ops_id[%d]buf_id[%d]\n", qbuf->ops_id, qbuf->buf_id);
 
        e = kzalloc(sizeof(*e), GFP_KERNEL);
-       if (!e) {
-               spin_lock_irqsave(&drm_dev->event_lock, flags);
-               c_node->filp->event_space += sizeof(e->event);
-               spin_unlock_irqrestore(&drm_dev->event_lock, flags);
+       if (!e)
                return -ENOMEM;
-       }
 
        /* make event */
        e->event.base.type = DRM_EXYNOS_IPP_EVENT;
@@ -646,9 +637,13 @@ static int ipp_get_event(struct drm_device *drm_dev,
        e->event.user_data = qbuf->user_data;
        e->event.prop_id = qbuf->prop_id;
        e->event.buf_id[EXYNOS_DRM_OPS_DST] = qbuf->buf_id;
-       e->base.event = &e->event.base;
-       e->base.file_priv = c_node->filp;
-       e->base.destroy = ipp_free_event;
+
+       ret = drm_event_reserve_init(drm_dev, c_node->filp, &e->base, &e->event.base);
+       if (ret) {
+               kfree(e);
+               return ret;
+       }
+
        mutex_lock(&c_node->event_lock);
        list_add_tail(&e->base.link, &c_node->event_list);
        mutex_unlock(&c_node->event_lock);