On Wed, Oct 08, 2025 at 12:42:49AM +0200, Stefano Brivio wrote: > On Tue, 7 Oct 2025 10:34:01 +1100 > David Gibson wrote: > > On Tue, Oct 07, 2025 at 12:32:54AM +0200, Stefano Brivio wrote: > > > On Fri, 3 Oct 2025 13:43:32 +1000 > > > David Gibson wrote: [snip] > > > > @@ -1820,6 +1817,8 @@ static int tcp_data_from_tap(const struct ctx *c, struct tcp_tap_conn *conn, > > > > break; > > > > seq_from_tap += size; > > > > iov_i += count; > > > > + if (th->fin) > > > > + fin = 1; > > > > > > > > if (keep == i) > > > > keep = -1; > > > > > > > > > > > > We'd need to double check that the "accept data segment" path is safe > > > > with len == 0, of course. > > > > > > For sure it's not before d2c33f45f7be ("tcp: Convert > > > tcp_data_from_tap() to use iov_tail"), because we might add > > > zero-length segments to the tcp_iov array, and that would make > > > backporting an otherwise simple and critical fix to slightly older > > > versions rather complicated. > > > > Kinda. It's not that complicated to deal with that case, by wrapping > > the actual data processing in an `if (len) { ... }` > > That's needed for sure, but do we risk looping forever on a particular > batch of FIN segments without data with a given series of sequence > numbers? > > Right now the loop terminates because the sequence moves forward. I'm > not sure what happens without data while moving 'keep' around. Maybe it > takes a few minutes to figure out (I haven't tried) but I wouldn't call > that trivial. That should be fine, because we need to advance the sequence by one for the FIN anyway, so we will move forwards. I might have forgotten that in my quick example, which is a bug, but an easy one to fix. > > > After that commit, I'm not sure about the behaviour of > > > iov_tail_clone(). I think it will return 0, but it should be tested > > > (that assumption, itself, but also that the fix still works). > > > > Right, I think it's safe in that case - that's what I was looking at. > > Note that I didn't test this. Understood. > > > > But I think that will treat dataless and > > > > with-data FINs the same way, and let them use the keep mechanism. > > > > > > Given that the only advantage of doing this would be to handle a rare > > > (I guess) corner case, that is, an out-of-sequence FIN segment with > > > data, which is not critical anyway because the FIN will be > > > retransmitted, I would rather keep this (critical) fix as it is. > > > > > > I would suggest filing a separate ticket or anyway sending a separate > > > patch if you want to fix that other case. > > > > Fair enough. I'll wait for you to get the basic fix merge, then I > > might batch this cleanup/fixup with the reorg to clarify bytes_acked > > handling. > > Okay, thanks, merged now. > > -- > Stefano > -- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson