From: John Fastabend <john.fastab...@gmail.com> Date: Wed, 02 May 2018 10:47:27 -0700
> When the call to do_tcp_sendpage() fails to send the complete block > requested we either retry if only a partial send was completed or > abort if we receive a error less than or equal to zero. Before > returning though we must update the scatterlist length/offset to > account for any partial send completed. > > Before this patch we did this at the end of the retry loop, but > this was buggy when used while applying a verdict to fewer bytes > than in the scatterlist. When the scatterlist length was being set > we forgot to account for the apply logic reducing the size variable. > So the result was we chopped off some bytes in the scatterlist without > doing proper cleanup on them. This results in a WARNING when the > sock is tore down because the bytes have previously been charged to > the socket but are never uncharged. > > The simple fix is to simply do the accounting inside the retry loop > subtracting from the absolute scatterlist values rather than trying > to accumulate the totals and subtract at the end. > > Reported-by: Alexei Starovoitov <a...@kernel.org> > Signed-off-by: John Fastabend <john.fastab...@gmail.com> Acked-by: David S. Miller <da...@davemloft.net>