On Thu, 8 Jan 2026 at 09:37, Eelco Chaudron <[email protected]> wrote:
> On 15 Dec 2025, at 14:57, David Marchand via dev wrote:
>
> > If we can predict that the segmented traffic will have the same headers,
> > it is possible to rely on HW segmentation.
> >
> > TCP over IPv4 geneve (with checksum on tunnel) on a mlx5 nic:
> > Before:  7.80 Gbits/sec, 100% cpu (SW segmentation)
> > After:  10.8  Gbits/sec,  27% cpu (HW segmentation)
> >
> > For this optimisation, no touching of original tso_segsz should be
> > allowed, so revert the commit
> > 844a7cfa6edd ("netdev-dpdk: Use guest TSO segmentation size hint.").
> >
> > Yet, there might still be some non optimal cases where the L4 payload
> > size would not be a multiple of tso_segsz.
> > For this condition, "partially" segment: split the "last" segment and keep
> > n-1 segments data in the original packet which will be segmented by HW.
> >
>
> Hi David,
>
> Coverity reports an issue with this series. The abstract is below, and I 
> think a simple cast could fix the sign problemns, for example:

I'll have a try on the sign extension warning and post a patch.


>
> dp_packet_set_size(p, hdr_len +
>     (size_t)(n_segs - 1) * tso_segsz);
>
> The memory access ones, I did not investigate. Could you check and send a 
> patch with fixes if needed?

[snip]

> ** CID 556378:       Memory - illegal accesses  (OVERRUN)
>
>
> _____________________________________________________________________________________________
> *** CID 556378:         Memory - illegal accesses  (OVERRUN)
> /lib/packets.c: 2154             in packet_udp_tunnel_csum()
> 2148
> 2149             inner_csum = packet_csum_pseudoheader6(inner_ip6);
> 2150         }
> 2151
> 2152         inner_csum = csum_continue(inner_csum, inner_l4,
> 2153             (char *) inner_l4_csum_p - (char *) inner_l4);
> >>>     CID 556378:         Memory - illegal accesses  (OVERRUN)
> >>>     Overrunning array of 2 bytes at byte offset 2 by dereferencing 
> >>> pointer "inner_l4_csum_p + 1".
> 2154         inner_l4_csum = csum_finish(csum_continue(inner_csum, 
> inner_l4_csum_p + 1,
> 2155             (char *) inner_l4_data - (char *)(inner_l4_csum_p + 1)));
> 2156         /* Important: for inner UDP, a null inner_l4_csum here should in 
> theory be
> 2157          * replaced with 0xffff.  However, since the only use of 
> inner_l4_csum is
> 2158          * for the final outer checksum with a csum_add16() below, we 
> can skip this
> 2159          * entirely because adding 0xffff will have the same effect as 
> adding 0x0

Hum, this comes from the fact that inner_l4_csum_p points at an
explicit uint16_t field in the udp header.
I will try and see if switching to some pointer arithmetics
(referencing udp header + offsetof csum) pleases coverity...


>
> ** CID 556377:       Memory - illegal accesses  (USE_AFTER_FREE)
>
>
> _____________________________________________________________________________________________
> *** CID 556377:         Memory - illegal accesses  (USE_AFTER_FREE)
> /lib/dp-packet-gso.c: 207             in dp_packet_gso__()
> 201         dp_packet_batch_add(curr_batch, p);
> 202
> 203         if (n_segs == 1) {
> 204             goto out;
> 205         }
> 206
> >>>     CID 556377:         Memory - illegal accesses  (USE_AFTER_FREE)
> >>>     Calling "dp_packet_tunnel" dereferences freed pointer "p".
> 207         if (dp_packet_tunnel(p)) {
> 208             hdr_len = (char *) dp_packet_get_inner_tcp_payload(p)
> 209                       - (char *) dp_packet_eth(p);
> 210             data_len = dp_packet_get_inner_tcp_payload_length(p);
> 211         } else {
> 212             hdr_len = (char *) dp_packet_get_tcp_payload(p)

This one is a false positive.

3. Condition dp_packet_batch_is_full(curr_batch), taking true branch.
198    if (dp_packet_batch_is_full(curr_batch)) {
199        curr_batch++;
200    }

4. freed_arg: dp_packet_batch_add frees p.[hide details]
201    dp_packet_batch_add(curr_batch, p);


Coverity fails to understand that we switched to a new empty batch.

Can you waive CID 556377?


Thanks for the report.


-- 
David Marchand

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to