On 01/07/2021 10:12, Boris Brezillon wrote: > Needed to keep VkQueues isolated from each other. One more comment I noticed when I tried this out: [...] > +struct panfrost_submitqueue * > +panfrost_submitqueue_create(struct panfrost_file_priv *ctx, > + enum panfrost_submitqueue_priority priority, > + u32 flags) > +{ > + struct panfrost_submitqueue *queue; > + enum drm_sched_priority sched_prio; > + int ret, i; > + > + if (flags || priority >= PANFROST_SUBMITQUEUE_PRIORITY_COUNT) > + return ERR_PTR(-EINVAL); > + > + queue = kzalloc(sizeof(*queue), GFP_KERNEL); > + if (!queue) > + return ERR_PTR(-ENOMEM); > + > + queue->pfdev = ctx->pfdev; > + sched_prio = to_sched_prio(priority); > + for (i = 0; i < NUM_JOB_SLOTS; i++) { > + struct drm_gpu_scheduler *sched; > + > + sched = panfrost_job_get_sched(ctx->pfdev, i); > + ret = drm_sched_entity_init(&queue->sched_entity[i], > + sched_prio, &sched, 1, NULL); > + if (ret) > + break; > + } > + > + if (ret) { > + for (i--; i >= 0; i--) > + drm_sched_entity_destroy(&queue->sched_entity[i]); > + > + return ERR_PTR(ret); > + } > + > + kref_init(&queue->refcount); > + idr_lock(&ctx->queues); > + ret = idr_alloc(&ctx->queues, queue, 0, INT_MAX, GFP_KERNEL); This makes lockdep complain. idr_lock() is a spinlock and GFP_KERNEL can sleep. So either we need to bring our own mutex here or not use GFP_KERNEL. Steve