Import G955FXXUCDUD1/G950FXXUCDUD1+N950FXXSGDUG7 kernel source
[GitHub/exynos8895/android_kernel_samsung_universal8895.git] / drivers / gpu / arm / b_r16p0 / mali_kbase_vinstr.c
index 51cb3651ed9a7699fe7a1f6f88801a58e8945b6c..d99e12a9e709f1d3e053159a6a4205a4cb56fed1 100644 (file)
@@ -565,24 +565,14 @@ int kbase_vinstr_hwcnt_reader_setup(
        struct kbase_vinstr_client *vcli = NULL;
 
        if (!vctx || !setup ||
-           (setup->buffer_count == 0) ||
-           (setup->buffer_count > MAX_BUFFER_COUNT))
+                       (setup->buffer_count == 0) ||
+                       (setup->buffer_count > MAX_BUFFER_COUNT))
                return -EINVAL;
 
        errcode = kbasep_vinstr_client_create(vctx, setup, &vcli);
        if (errcode)
                goto error;
 
-       errcode = anon_inode_getfd(
-               "[mali_vinstr_desc]",
-               &vinstr_client_fops,
-               vcli,
-               O_RDONLY | O_CLOEXEC);
-       if (errcode < 0)
-               goto error;
-
-       fd = errcode;
-
        /* Add the new client. No need to reschedule worker, as not periodic */
        mutex_lock(&vctx->lock);
 
@@ -591,7 +581,26 @@ int kbase_vinstr_hwcnt_reader_setup(
 
        mutex_unlock(&vctx->lock);
 
+       /* Expose to user-space */
+       errcode = anon_inode_getfd(
+                       "[mali_vinstr_desc]",
+                       &vinstr_client_fops,
+                       vcli,
+                       O_RDONLY | O_CLOEXEC);
+       if (errcode < 0)
+               goto client_installed_error;
+
+       fd = errcode;
+
        return fd;
+
+client_installed_error:
+       mutex_lock(&vctx->lock);
+
+       vctx->client_count--;
+       list_del(&vcli->node);
+
+       mutex_unlock(&vctx->lock);
 error:
        kbasep_vinstr_client_destroy(vcli);
        return errcode;