Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [High] Lockless gate reopening in `mana_rdma_probe()` exposes a race window 
that can silently drop hardware service events.
--

commit 92507b04de784a341e9ea7d0275d9b3dbe00e839
Author: Long Li <[email protected]>

net: mana: Clear RDMA teardown and suspend state in mana_rdma_probe()

This commit clears the rdma_teardown and is_suspended flags during probe
to ensure hardware service events are handled correctly after a reset cycle.

Link: https://lore.kernel.org/all/[email protected]/

> diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c 
> b/drivers/net/ethernet/microsoft/mana/mana_en.c
> index 7a1ac853e3abc..56f426da72864 100644
> --- a/drivers/net/ethernet/microsoft/mana/mana_en.c
> +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c

[ ... ]

> @@ -4279,6 +4280,17 @@ int mana_rdma_probe(struct gdma_dev *gd)
>       if (err)
>               return err;
>  
> +     /* Clear the state left by a previous mana_rdma_remove() so servicing
> +      * events are handled again after a reset cycle.
> +      */
> +     gd->is_suspended = false;
> +
> +     /* Publish is_suspended before re-opening the gate, so the handler
> +      * cannot act on a stale value.  Pairs with the smp_load_acquire()
> +      * in mana_rdma_service_handle().
> +      */
> +     smp_store_release(&gd->rdma_teardown, false);
> +
>       err = add_adev(gd, "rdma");

[Severity: High]
Does opening the rdma_teardown gate here create a race window where hardware
service events can be silently dropped?

Because mana_gd_register_device(gd) was called earlier in this function,
the hardware can now generate events. If an event like
GDMA_SERVICE_TYPE_RDMA_SUSPEND fires immediately after smp_store_release()
clears rdma_teardown, the ordered workqueue will run mana_rdma_service_handle().

The handler will pass the rdma_teardown check but evaluate !gd->adev as true
because add_adev() hasn't completed yet:

drivers/net/ethernet/microsoft/mana/mana_en.c:mana_rdma_service_handle() {
        ...
        case GDMA_SERVICE_TYPE_RDMA_SUSPEND:
                if (!gd->adev || gd->is_suspended)
                        break;
        ...
}

This causes the event to be dropped, which could create a permanent state
inconsistency between the OS and the hardware. Should the gate be opened
after add_adev() successfully assigns gd->adev?

>       if (err)
>               mana_gd_deregister_device(gd);

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=1

Reply via email to