On Fri, 17 Sep 2021 14:59:43 +0200 Alexandre Bailon wrote:
> +static DEFINE_IDA(req_ida);
> +static LIST_HEAD(complete_node);

I see accesses to complete_node in apu_drm_callback(), apu_job_timedout()
and ioctl_gem_dequeue() without working out the serialization to avoid
list corruption. Can you add a comment to specify it?

> +
> +int apu_drm_callback(struct apu_core *apu_core, void *data, int len)
> +{
> +     struct apu_request *apu_req, *tmp;
> +     struct apu_dev_request *hdr = data;
> +     unsigned long flags;
> +
> +     spin_lock_irqsave(&apu_core->ctx_lock, flags);
> +     list_for_each_entry_safe(apu_req, tmp, &apu_core->requests, node) {
> +             struct apu_job *job = apu_req->job;
> +
> +             if (job && hdr->id == job->id) {
> +                     kref_get(&job->refcount);
> +                     job->result = hdr->result;
> +                     if (job->size_out)
> +                             memcpy(job->data_out, hdr->data + job->size_in,
> +                                    min(job->size_out, hdr->size_out));
> +                     job->size_out = hdr->size_out;
> +                     list_add(&job->node, &complete_node);
> +                     list_del(&apu_req->node);
> +                     ida_simple_remove(&req_ida, hdr->id);
> +                     kfree(apu_req);
> +                     drm_send_event(job->apu_drm->drm,
> +                                    &job->event->pending_event);
> +                     dma_fence_signal_locked(job->done_fence);
> +             }
> +     }
> +     spin_unlock_irqrestore(&apu_core->ctx_lock, flags);
> +
> +     return 0;
> +}

Reply via email to