drm/msm: Add a context pointer to the submitqueue
authorJordan Crouse <jcrouse@codeaurora.org>
Mon, 17 Aug 2020 22:01:36 +0000 (15:01 -0700)
committerRob Clark <robdclark@chromium.org>
Sat, 12 Sep 2020 17:45:56 +0000 (10:45 -0700)
Each submitqueue is attached to a context. Add a pointer to the
context to the submitqueue at create time and refcount it so
that it stays around through the life of the queue.

Co-developed-by: Rob Clark <robdclark@chromium.org>
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_drv.h
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gem_submit.c
drivers/gpu/drm/msm/msm_gpu.h
drivers/gpu/drm/msm/msm_submitqueue.c

index 8796b7c861ecde6a23e368f877e808fda84f0eb3..8f00abb720de53a9fe8418e9b283334a3837cb79 100644 (file)
@@ -586,6 +586,7 @@ static int context_init(struct drm_device *dev, struct drm_file *file)
        if (!ctx)
                return -ENOMEM;
 
+       kref_init(&ctx->ref);
        msm_submitqueue_init(dev, ctx);
 
        ctx->aspace = priv->gpu ? priv->gpu->aspace : NULL;
@@ -607,7 +608,7 @@ static int msm_open(struct drm_device *dev, struct drm_file *file)
 static void context_close(struct msm_file_private *ctx)
 {
        msm_submitqueue_close(ctx);
-       kfree(ctx);
+       msm_file_private_put(ctx);
 }
 
 static void msm_postclose(struct drm_device *dev, struct drm_file *file)
index af259b0573ea07fb7e6b60289247dda8c1bb9624..4561bfb5e745ab7f130779aa110d0f5fb0ea85e5 100644 (file)
@@ -57,6 +57,7 @@ struct msm_file_private {
        struct list_head submitqueues;
        int queueid;
        struct msm_gem_address_space *aspace;
+       struct kref ref;
 };
 
 enum msm_mdp_plane_property {
@@ -428,6 +429,25 @@ void msm_submitqueue_close(struct msm_file_private *ctx);
 
 void msm_submitqueue_destroy(struct kref *kref);
 
+static inline void __msm_file_private_destroy(struct kref *kref)
+{
+       struct msm_file_private *ctx = container_of(kref,
+               struct msm_file_private, ref);
+
+       kfree(ctx);
+}
+
+static inline void msm_file_private_put(struct msm_file_private *ctx)
+{
+       kref_put(&ctx->ref, __msm_file_private_destroy);
+}
+
+static inline struct msm_file_private *msm_file_private_get(
+       struct msm_file_private *ctx)
+{
+       kref_get(&ctx->ref);
+       return ctx;
+}
 
 #define DBG(fmt, ...) DRM_DEBUG_DRIVER(fmt"\n", ##__VA_ARGS__)
 #define VERB(fmt, ...) if (0) DRM_DEBUG_DRIVER(fmt"\n", ##__VA_ARGS__)
index 972490b14ba5e5cd6fd574052c265c716da44506..9c573c4269cb5f0a69d2acd84b34a4337ff3ce68 100644 (file)
@@ -142,6 +142,7 @@ struct msm_gem_submit {
        bool valid;         /* true if no cmdstream patching needed */
        bool in_rb;         /* "sudo" mode, copy cmds into RB */
        struct msm_ringbuffer *ring;
+       struct msm_file_private *ctx;
        unsigned int nr_cmds;
        unsigned int nr_bos;
        u32 ident;         /* A "identifier" for the submit for logging */
index 8cb9aa15ff90ec3056d05cfc776f1e6568989315..1464b04d25d3157118d2cdaf3c1fd272b1b320bd 100644 (file)
@@ -27,7 +27,7 @@
 #define BO_PINNED   0x2000
 
 static struct msm_gem_submit *submit_create(struct drm_device *dev,
-               struct msm_gpu *gpu, struct msm_gem_address_space *aspace,
+               struct msm_gpu *gpu,
                struct msm_gpu_submitqueue *queue, uint32_t nr_bos,
                uint32_t nr_cmds)
 {
@@ -43,7 +43,7 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev,
                return NULL;
 
        submit->dev = dev;
-       submit->aspace = aspace;
+       submit->aspace = queue->ctx->aspace;
        submit->gpu = gpu;
        submit->fence = NULL;
        submit->cmd = (void *)&submit->bos[nr_bos];
@@ -677,7 +677,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
                }
        }
 
-       submit = submit_create(dev, gpu, ctx->aspace, queue, args->nr_bos,
+       submit = submit_create(dev, gpu, queue, args->nr_bos,
                args->nr_cmds);
        if (!submit) {
                ret = -ENOMEM;
index 1f65aec57a8fefab3c2d2352d6ac163bf783c2d6..c4ce462c30c5ee87bbd94eba9a2bcdd3b3e61fe9 100644 (file)
@@ -193,6 +193,7 @@ struct msm_gpu_submitqueue {
        u32 flags;
        u32 prio;
        int faults;
+       struct msm_file_private *ctx;
        struct list_head node;
        struct kref ref;
 };
index 90c9d84e6155ab39f3b45f45d54025a6039bf4d5..c3d206105d285a838ed2096092e2d5454f37f323 100644 (file)
@@ -12,6 +12,8 @@ void msm_submitqueue_destroy(struct kref *kref)
        struct msm_gpu_submitqueue *queue = container_of(kref,
                struct msm_gpu_submitqueue, ref);
 
+       msm_file_private_put(queue->ctx);
+
        kfree(queue);
 }
 
@@ -83,6 +85,7 @@ int msm_submitqueue_create(struct drm_device *drm, struct msm_file_private *ctx,
 
        write_lock(&ctx->queuelock);
 
+       queue->ctx = msm_file_private_get(ctx);
        queue->id = ctx->queueid++;
 
        if (id)