Message ID | 58ad4867-6178-54bd-7e49-e35875d012f9@google.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: fix rc7's __skb_datagram_iter() | expand |
On 08/07/2024 6:00, Hugh Dickins wrote: > X would not start in my old 32-bit partition (and the "n"-handling looks > just as wrong on 64-bit, but for whatever reason did not show up there): > "n" must be accumulated over all pages before it's added to "offset" and > compared with "copy", immediately after the skb_frag_foreach_page() loop. That is indeed strange. I see the issue. It didn't happen in my local testing either. > > Fixes: d2d30a376d9c ("net: allow skb_datagram_iter to be called from any context") > Signed-off-by: Hugh Dickins <hughd@google.com> > --- > net/core/datagram.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/net/core/datagram.c b/net/core/datagram.c > index e9ba4c7b449d..ea69d01156e6 100644 > --- a/net/core/datagram.c > +++ b/net/core/datagram.c > @@ -420,6 +420,7 @@ static int __skb_datagram_iter(const struct sk_buff *skb, int offset, > struct page *p; > u8 *vaddr; > > + n = 0; I think its better to reset n right before the skb_frag_foreach_page() iteration. Thanks Hugh for addressing this!
diff --git a/net/core/datagram.c b/net/core/datagram.c index e9ba4c7b449d..ea69d01156e6 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c @@ -420,6 +420,7 @@ static int __skb_datagram_iter(const struct sk_buff *skb, int offset, struct page *p; u8 *vaddr; + n = 0; if (copy > len) copy = len; @@ -427,7 +428,7 @@ static int __skb_datagram_iter(const struct sk_buff *skb, int offset, skb_frag_off(frag) + offset - start, copy, p, p_off, p_len, copied) { vaddr = kmap_local_page(p); - n = INDIRECT_CALL_1(cb, simple_copy_to_iter, + n += INDIRECT_CALL_1(cb, simple_copy_to_iter, vaddr + p_off, p_len, data, to); kunmap_local(vaddr); }
X would not start in my old 32-bit partition (and the "n"-handling looks just as wrong on 64-bit, but for whatever reason did not show up there): "n" must be accumulated over all pages before it's added to "offset" and compared with "copy", immediately after the skb_frag_foreach_page() loop. Fixes: d2d30a376d9c ("net: allow skb_datagram_iter to be called from any context") Signed-off-by: Hugh Dickins <hughd@google.com> --- net/core/datagram.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)