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; > +}