From: Sui Jingfeng <suijingf...@loongson.cn>

Noticed that there are a lot of members in the struct etnaviv_drm_private,
which are intended to be shared by all GPU cores. Introduces two helpers
for construction and destruction purpose for it. The benefit is that error
handling get simplified a lot.

Signed-off-by: Sui Jingfeng <suijingf...@loongson.cn>
---
 drivers/gpu/drm/etnaviv/etnaviv_drv.c | 70 +++++++++++++++++----------
 1 file changed, 44 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c 
b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
index a9a1659840ec..41ef7a8b7839 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
@@ -41,6 +41,43 @@ static struct device_node 
*etnaviv_of_first_available_node(void)
        return NULL;
 }
 
+static struct etnaviv_drm_private *etnaviv_alloc_private(struct device *dev)
+{
+       struct etnaviv_drm_private *priv;
+
+       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+       if (!priv)
+               return ERR_PTR(-ENOMEM);
+
+       xa_init_flags(&priv->active_contexts, XA_FLAGS_ALLOC);
+
+       mutex_init(&priv->gem_lock);
+       INIT_LIST_HEAD(&priv->gem_list);
+       priv->num_gpus = 0;
+       priv->shm_gfp_mask = GFP_HIGHUSER | __GFP_RETRY_MAYFAIL | __GFP_NOWARN;
+
+       priv->cmdbuf_suballoc = etnaviv_cmdbuf_suballoc_new(dev);
+       if (IS_ERR(priv->cmdbuf_suballoc)) {
+               kfree(priv);
+               dev_err(dev, "Failed to create cmdbuf suballocator\n");
+               return ERR_PTR(-ENOMEM);
+       }
+
+       return priv;
+}
+
+static void etnaviv_free_private(struct etnaviv_drm_private *priv)
+{
+       if (!priv)
+               return;
+
+       etnaviv_cmdbuf_suballoc_destroy(priv->cmdbuf_suballoc);
+
+       xa_destroy(&priv->active_contexts);
+
+       kfree(priv);
+}
+
 static void load_gpu(struct drm_device *dev)
 {
        struct etnaviv_drm_private *priv = dev->dev_private;
@@ -521,35 +558,21 @@ static int etnaviv_bind(struct device *dev)
        if (IS_ERR(drm))
                return PTR_ERR(drm);
 
-       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
-       if (!priv) {
-               dev_err(dev, "failed to allocate private data\n");
-               ret = -ENOMEM;
+       priv = etnaviv_alloc_private(dev);
+       if (IS_ERR(priv)) {
+               ret = PTR_ERR(priv);
                goto out_put;
        }
+
        drm->dev_private = priv;
 
        dma_set_max_seg_size(dev, SZ_2G);
 
-       xa_init_flags(&priv->active_contexts, XA_FLAGS_ALLOC);
-
-       mutex_init(&priv->gem_lock);
-       INIT_LIST_HEAD(&priv->gem_list);
-       priv->num_gpus = 0;
-       priv->shm_gfp_mask = GFP_HIGHUSER | __GFP_RETRY_MAYFAIL | __GFP_NOWARN;
-
-       priv->cmdbuf_suballoc = etnaviv_cmdbuf_suballoc_new(drm->dev);
-       if (IS_ERR(priv->cmdbuf_suballoc)) {
-               dev_err(drm->dev, "Failed to create cmdbuf suballocator\n");
-               ret = PTR_ERR(priv->cmdbuf_suballoc);
-               goto out_free_priv;
-       }
-
        dev_set_drvdata(dev, drm);
 
        ret = component_bind_all(dev, drm);
        if (ret < 0)
-               goto out_destroy_suballoc;
+               goto out_free_priv;
 
        load_gpu(drm);
 
@@ -561,10 +584,8 @@ static int etnaviv_bind(struct device *dev)
 
 out_unbind:
        component_unbind_all(dev, drm);
-out_destroy_suballoc:
-       etnaviv_cmdbuf_suballoc_destroy(priv->cmdbuf_suballoc);
 out_free_priv:
-       kfree(priv);
+       etnaviv_free_private(priv);
 out_put:
        drm_dev_put(drm);
 
@@ -580,12 +601,9 @@ static void etnaviv_unbind(struct device *dev)
 
        component_unbind_all(dev, drm);
 
-       etnaviv_cmdbuf_suballoc_destroy(priv->cmdbuf_suballoc);
-
-       xa_destroy(&priv->active_contexts);
+       etnaviv_free_private(priv);
 
        drm->dev_private = NULL;
-       kfree(priv);
 
        drm_dev_put(drm);
 }
-- 
2.34.1

Reply via email to