tbm_bufmgr_sprd: clean up tbm_sprd_bo_import(_fd)() 52/97452/2
authorYoungJun Cho <yj44.cho@samsung.com>
Mon, 14 Nov 2016 07:17:44 +0000 (16:17 +0900)
committerYoungJun Cho <yj44.cho@samsung.com>
Tue, 15 Nov 2016 02:04:25 +0000 (11:04 +0900)
This patch cleans up tbm_sprd_bo_import(_fd)().
- Changes return value.
- Closes gem handle for error routines.

Change-Id: Ibf6a27cc05a155deec483d87179dcb428fb611f4
Signed-off-by: YoungJun Cho <yj44.cho@samsung.com>
src/tbm_bufmgr_sprd.c

index ecca133..e8b84a0 100644 (file)
@@ -999,7 +999,7 @@ tbm_sprd_bo_free(tbm_bo bo)
 static void *
 tbm_sprd_bo_import(tbm_bo bo, unsigned int key)
 {
-       SPRD_RETURN_VAL_IF_FAIL(bo != NULL, 0);
+       SPRD_RETURN_VAL_IF_FAIL(bo != NULL, NULL);
 
        tbm_bufmgr_sprd bufmgr_sprd;
        tbm_bo_sprd bo_sprd;
@@ -1007,21 +1007,21 @@ tbm_sprd_bo_import(tbm_bo bo, unsigned int key)
        int ret;
 
        bufmgr_sprd = (tbm_bufmgr_sprd)tbm_backend_get_bufmgr_priv(bo);
-       SPRD_RETURN_VAL_IF_FAIL(bufmgr_sprd != NULL, 0);
+       SPRD_RETURN_VAL_IF_FAIL(bufmgr_sprd != NULL, NULL);
 
        ret = drmHashLookup(bufmgr_sprd->hashBos, key, (void **)&privGem);
        if (ret == 0)
                return privGem->bo_priv;
 
-       struct drm_gem_open arg = {0, };
        struct drm_sprd_gem_info info = {0, };
+       struct drm_gem_open arg = {0, };
 
        arg.name = key;
        if (drmIoctl(bufmgr_sprd->fd, DRM_IOCTL_GEM_OPEN, &arg)) {
                TBM_SPRD_LOG("[libtbm-sprd:%d] "
                              "error %s:%d Cannot open gem name=%d\n",
                              getpid(), __FUNCTION__, __LINE__, key);
-               return 0;
+               return NULL;
        }
 
        info.handle = arg.handle;
@@ -1032,7 +1032,7 @@ tbm_sprd_bo_import(tbm_bo bo, unsigned int key)
                TBM_SPRD_LOG("[libtbm-sprd:%d] "
                              "error %s:%d Cannot get gem info=%d\n",
                              getpid(), __FUNCTION__, __LINE__, key);
-               return 0;
+               goto fail_get_gem;
        }
 
        bo_sprd = calloc(1, sizeof(struct _tbm_bo_sprd));
@@ -1040,7 +1040,7 @@ tbm_sprd_bo_import(tbm_bo bo, unsigned int key)
                TBM_SPRD_LOG("[libtbm-sprd:%d] "
                              "error %s:%d fail to allocate the bo private\n",
                              getpid(), __FUNCTION__, __LINE__);
-               return 0;
+               goto fail_alloc_bo;
        }
 
        bo_sprd->fd = bufmgr_sprd->fd;
@@ -1057,8 +1057,7 @@ tbm_sprd_bo_import(tbm_bo bo, unsigned int key)
 
        if (!_bo_init_cache_state(bufmgr_sprd, bo_sprd, 1)) {
                TBM_SPRD_LOG("error fail init cache state(%d)\n", bo_sprd->name);
-               free(bo_sprd);
-               return 0;
+               goto fail_init_cache;
        }
 
        if (!bo_sprd->dmabuf) {
@@ -1069,14 +1068,19 @@ tbm_sprd_bo_import(tbm_bo bo, unsigned int key)
                        TBM_SPRD_LOG("[libtbm-sprd:%d] "
                                      "error %s:%d Cannot dmabuf=%d\n",
                                      getpid(), __FUNCTION__, __LINE__, bo_sprd->gem);
-                       free(bo_sprd);
-                       return 0;
+                       goto fail_prime_handle_to_fd;
                }
                bo_sprd->dmabuf = arg.fd;
        }
 
        /* add bo to hash */
        privGem = calloc(1, sizeof(PrivGem));
+       if (!privGem) {
+               TBM_SPRD_LOG("[libtbm-sprd:%d] error %s:%d Fail to alloc\n",
+                             getpid(), __FUNCTION__, __LINE__);
+               goto fail_alloc_gem_priv;
+       }
+
        privGem->ref_count = 1;
        privGem->bo_priv = bo_sprd;
        if (drmHashInsert(bufmgr_sprd->hashBos, bo_sprd->name, (void *)privGem) < 0) {
@@ -1091,28 +1095,41 @@ tbm_sprd_bo_import(tbm_bo bo, unsigned int key)
             bo_sprd->flags_tbm, bo_sprd->flags_sprd);
 
        return (void *)bo_sprd;
+
+fail_alloc_gem_priv:
+       if (bo_sprd->dmabuf)
+               close(bo_sprd->dmabuf);
+fail_prime_handle_to_fd:
+       _bo_destroy_cache_state(bufmgr_sprd, bo_sprd);
+fail_init_cache:
+       free(bo_sprd);
+fail_alloc_bo:
+fail_get_gem:
+       {
+               struct drm_gem_close gem_close_arg = {arg.handle, 0};
+               drmIoctl(bufmgr_sprd->fd, DRM_IOCTL_GEM_CLOSE, &gem_close_arg);
+       }
+       return NULL;
 }
 
 static void *
 tbm_sprd_bo_import_fd(tbm_bo bo, tbm_fd key)
 {
-       SPRD_RETURN_VAL_IF_FAIL(bo != NULL, 0);
+       SPRD_RETURN_VAL_IF_FAIL(bo != NULL, NULL);
 
        tbm_bufmgr_sprd bufmgr_sprd;
        tbm_bo_sprd bo_sprd;
-       PrivGem *privGem = NULL;
-       int ret;
        unsigned int name;
+       PrivGem *privGem;
 
        bufmgr_sprd = (tbm_bufmgr_sprd)tbm_backend_get_bufmgr_priv(bo);
-       SPRD_RETURN_VAL_IF_FAIL(bufmgr_sprd != NULL, 0);
+       SPRD_RETURN_VAL_IF_FAIL(bufmgr_sprd != NULL, NULL);
 
        //getting handle from fd
-       unsigned int gem = 0;
        struct drm_prime_handle arg = {0, };
+       unsigned int gem;
 
        arg.fd = key;
-       arg.flags = 0;
        if (drmIoctl(bufmgr_sprd->fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &arg)) {
                TBM_SPRD_LOG("error bo:%p Cannot get gem handle from fd:%d (%s)\n",
                              bo, arg.fd, strerror(errno));
@@ -1121,14 +1138,18 @@ tbm_sprd_bo_import_fd(tbm_bo bo, tbm_fd key)
        gem = arg.handle;
 
        name = _get_name(bufmgr_sprd->fd, gem);
+       if (!name) {
+               TBM_SPRD_LOG("error bo:%p Cannot get name from gem:%d, fd:%d (%s)\n",
+                               bo, gem, key, strerror(errno));
+               return NULL;
+       }
 
-       ret = drmHashLookup(bufmgr_sprd->hashBos, name, (void **)&privGem);
-       if (ret == 0) {
+       if (!drmHashLookup(bufmgr_sprd->hashBos, name, (void **)&privGem)) {
                if (gem == privGem->bo_priv->gem)
                        return privGem->bo_priv;
        }
 
-       unsigned int real_size = -1;
+       unsigned int real_size;
        struct drm_sprd_gem_info info = {0, };
 
        /* Determine size of bo.  The fd-to-handle ioctl really should
@@ -1145,7 +1166,7 @@ tbm_sprd_bo_import_fd(tbm_bo bo, tbm_fd key)
                                sizeof(struct drm_sprd_gem_info))) {
                TBM_SPRD_LOG("error bo:%p Cannot get gem info from gem:%d, fd:%d (%s)\n",
                              bo, gem, key, strerror(errno));
-               return 0;
+               return NULL;
        }
 
        if (real_size == -1)
@@ -1154,7 +1175,7 @@ tbm_sprd_bo_import_fd(tbm_bo bo, tbm_fd key)
        bo_sprd = calloc(1, sizeof(struct _tbm_bo_sprd));
        if (!bo_sprd) {
                TBM_SPRD_LOG("error bo:%p fail to allocate the bo private\n", bo);
-               return 0;
+               return NULL;
        }
 
        bo_sprd->fd = bufmgr_sprd->fd;
@@ -1167,26 +1188,21 @@ tbm_sprd_bo_import_fd(tbm_bo bo, tbm_fd key)
        if (!bo_sprd->name) {
                TBM_SPRD_LOG("error bo:%p Cannot get name from gem:%d, fd:%d (%s)\n",
                              bo, gem, key, strerror(errno));
-               free(bo_sprd);
-               return 0;
+               goto fail_check_name;
        }
 
        if (!_bo_init_cache_state(bufmgr_sprd, bo_sprd, 1)) {
                TBM_SPRD_LOG("error fail init cache state(%d)\n", bo_sprd->name);
-               free(bo_sprd);
-               return 0;
+               goto fail_init_cache;
        }
 
        /* add bo to hash */
-       privGem = NULL;
-
        privGem = calloc(1, sizeof(PrivGem));
        if (!privGem) {
                TBM_SPRD_LOG("[libtbm-sprd:%d] "
                              "error %s:%d Fail to callocprivGem\n",
                              getpid(), __FUNCTION__, __LINE__);
-               free(bo_sprd);
-               return 0;
+               goto fail_alloc_gem_priv;
        }
 
        privGem->ref_count = 1;
@@ -1206,6 +1222,13 @@ tbm_sprd_bo_import_fd(tbm_bo bo, tbm_fd key)
             bo_sprd->size);
 
        return (void *)bo_sprd;
+
+fail_alloc_gem_priv:
+       _bo_destroy_cache_state(bufmgr_sprd, bo_sprd);
+fail_init_cache:
+fail_check_name:
+       free(bo_sprd);
+       return NULL;
 }
 
 static unsigned int