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