> 
> This is an AI-generated review of your patch. The human sending this email has
> considered the AI review valid, or at least plausible.
> ---
> net: mana: fix HWC RQ/SQ buffer size swap
> 
> The patch swaps the message sizes used to allocate the HWC RQ and SQ so the
> RQ (which receives responses) is sized by max_resp_msg_size and the SQ
> (which sends requests) by max_req_msg_size.  It also stores
> max_resp_msg_size in struct hw_channel_context and uses it as the RX slot
> stride in mana_hwc_rx_event_handler().  The commit message notes both
> sizes are 0x1000 today, so the previous swap had no observable effect.
> 
> > diff --git a/drivers/net/ethernet/microsoft/mana/hw_channel.c
> > b/drivers/net/ethernet/microsoft/mana/hw_channel.c
> > index 409e20caeccdc..3f011ebbe7b3e 100644
> > --- a/drivers/net/ethernet/microsoft/mana/hw_channel.c
> > +++ b/drivers/net/ethernet/microsoft/mana/hw_channel.c
> 
> [ ... ]
> 
> > @@ -733,14 +733,14 @@ static int mana_hwc_init_queues(struct
> hw_channel_context *hwc, u16 q_depth,
> >             goto out;
> >     }
> >
> > -   err = mana_hwc_create_wq(hwc, GDMA_RQ, q_depth,
> max_req_msg_size,
> > +   err = mana_hwc_create_wq(hwc, GDMA_RQ, q_depth,
> max_resp_msg_size,
> >                              hwc->cq, &hwc->rxq);
> >     if (err) {
> >             dev_err(hwc->dev, "Failed to create HWC RQ: %d\n", err);
> >             goto out;
> >     }
> >
> > -   err = mana_hwc_create_wq(hwc, GDMA_SQ, q_depth,
> max_resp_msg_size,
> > +   err = mana_hwc_create_wq(hwc, GDMA_SQ, q_depth,
> max_req_msg_size,
> >                              hwc->cq, &hwc->txq);
> >     if (err) {
> >             dev_err(hwc->dev, "Failed to create HWC SQ: %d\n", err); @@
> -749,6
> > +749,7 @@ static int mana_hwc_init_queues(struct hw_channel_context
> > *hwc, u16 q_depth,
> >
> >     hwc->num_inflight_msg = q_depth;
> >     hwc->max_req_msg_size = max_req_msg_size;
> > +   hwc->max_resp_msg_size = max_resp_msg_size;
> 
> [Severity: Medium]
> This isn't a bug introduced by this patch, but while looking at how these two
> fields are produced and consumed, the hardware-reported sizes appear to be
> dead: is the negotiated-size half of this interface still expected to do
> something?
> 
> mana_hwc_establish_channel() hands the device-reported values back to its
> caller:
> 
>       *q_depth = hwc->hwc_init_q_depth_max;
>       *max_req_msg_size = hwc->hwc_init_max_req_msg_size;
>       *max_resp_msg_size = hwc->hwc_init_max_resp_msg_size;
> 
> and mana_hwc_create_channel() forwards them:
> 
>       err = mana_hwc_test_channel(gc->hwc.driver_data,
> 
> HW_CHANNEL_VF_BOOTSTRAP_QUEUE_DEPTH,
>                                   max_req_msg_size, max_resp_msg_size);
> 
> but the body of mana_hwc_test_channel() references neither
> max_req_msg_size nor max_resp_msg_size, and nothing else applies them to
> the already-created queues or to hw_channel_context.  So the fields set here 
> in
> mana_hwc_init_queues() permanently hold the bootstrap constants
> HW_CHANNEL_MAX_REQUEST_SIZE / HW_CHANNEL_MAX_RESPONSE_SIZE
> (both 0x1000), which matches the commit message.
> 
> Two peer consumers do read hwc->max_req_msg_size as if it were the
> hardware-negotiated request bound.  mana_gd_create_dma_region() in
> gdma_main.c uses it to reject oversized commands:
> 
>       if (req_msg_size > hwc->max_req_msg_size)
>               return -EINVAL;
> 
> and mana_ib_gd_create_dma_region() in drivers/infiniband/hw/mana/main.c
> sizes both its request buffer and its page-list capacity from it:
> 
>       max_pgs_create_cmd =
>               (hwc->max_req_msg_size - sizeof(*create_req)) / sizeof(u64);
>       ...
>       request_buf = kzalloc(hwc->max_req_msg_size, GFP_KERNEL);
> 
> If a device ever reported HWC_INIT_DATA_MAX_REQUEST smaller than 0x1000
> (recorded into hwc->hwc_init_max_req_msg_size by
> mana_hwc_init_event_handler()), would those callers keep building up to 4KB
> commands that the hardware then rejects, and would a larger reported value
> simply be ignored?  There is no memory-safety consequence today since the
> SQ buffer and that bound are the same 0x1000 value after this patch, but
> would it be worth either applying the reported sizes or dropping the unused
> mana_hwc_test_channel() parameters?

Thanks. You're right, and it's pre-existing — this patch only fixes which of 
the two (today equal) sizes maps to the RQ vs SQ and the RX slot stride.

 hwc->max_req_msg_size  /  hwc->max_resp_msg_size  are set from the bootstrap 
constants:  mana_hwc_create_channel()  calls  mana_hwc_init_queues()  with  
HW_CHANNEL_MAX_REQUEST_SIZE  /  HW_CHANNEL_MAX_RESPONSE_SIZE  (both 0x1000). 
The device-reported values from  mana_hwc_establish_channel()  only reach  
mana_hwc_test_channel() , which ignores them, so the consumers you found use 
the 0x1000 constant. With both equal there's no memory-safety consequence; a 
smaller reported size would get commands rejected by the device, a larger one 
would be capped conservatively — neither is reachable on current firmware.

I'd rather not fix this in this series: feeding the reported sizes back is a 
runtime behaviour change that needs its own justification and testing, and this 
series is scoped to the reliability fixes. It's a good candidate for a separate 
patch.

Long

Reply via email to