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

Reply via email to