Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues: - [High] Concurrent execution of `xdna_mailbox_send_msg` by the DRM scheduler thread and the ioctl thread leads to hardware ring buffer corruption. -- commit f00c302142d5de5c06245223cfbc1a367c1aef38 Author: Deniz Aydogan <[email protected]> accel/amdxdna: fix double-free on mailbox channel stop This commit fixes a double-free issue when stopping a mailbox channel. The previous implementation used two xarray iterators that could overlap and release the same message twice. It replaces them with a single iterator to ensure each message is freed exactly once. > diff --git a/drivers/accel/amdxdna/amdxdna_mailbox.c > b/drivers/accel/amdxdna/amdxdna_mailbox.c > index cc8865f4e79c9..27161734753d0 100644 > --- a/drivers/accel/amdxdna/amdxdna_mailbox.c > +++ b/drivers/accel/amdxdna/amdxdna_mailbox.c > @@ -556,9 +556,7 @@ void xdna_mailbox_stop_channel(struct mailbox_channel > *mb_chann) > drain_workqueue(mb_chann->work_q); > > /* We can clean up and release resources */ > - xa_for_each_start(&mb_chann->chan_xa, msg_id, mb_msg, > mb_chann->next_msgid) > - mailbox_release_msg(mb_chann, mb_msg); > - xa_for_each_range(&mb_chann->chan_xa, msg_id, mb_msg, 0, > mb_chann->next_msgid - 1) > + xa_for_each(&mb_chann->chan_xa, msg_id, mb_msg) > mailbox_release_msg(mb_chann, mb_msg); > xa_destroy(&mb_chann->chan_xa); [Severity: High] This is a pre-existing issue, but while reviewing the mailbox channel code in drivers/accel/amdxdna/amdxdna_mailbox.c, I noticed a potential data corruption issue with concurrent messages. Can concurrent execution of xdna_mailbox_send_msg() lead to hardware ring buffer corruption? The DRM scheduler thread can submit jobs without holding the device lock, calling: drivers/accel/amdxdna/aie2_message.c:aie2_execbuf() -> xdna_mailbox_send_msg() Concurrently, the ioctl thread can configure the same hardware context and channel while holding the device lock, calling: drivers/accel/amdxdna/aie2_message.c:aie2_config_cu() -> xdna_mailbox_send_msg() Inside mailbox_send_msg() in drivers/accel/amdxdna/amdxdna_mailbox.c, the tail pointer is read locklessly: tail = mb_chann->x2i_tail; And it is updated locklessly after the message is written: mailbox_set_tailptr(mb_chann, tail + mb_msg->pkg_size); Since there is no common lock held between the DRM scheduler thread and the ioctl thread for the mailbox channel, can they race to read the same tail pointer, overwrite each other's messages in the ring buffer, and write conflicting tail pointers to the hardware? -- Sashiko AI review ยท https://sashiko.dev/#/patchset/[email protected]?part=1
