Message ID | 20241203173617.2595451-1-edumazet@google.com (mailing list archive) |
---|---|
State | New |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next] inet: add indirect call wrapper for getfrag() calls | expand |
Eric Dumazet wrote: > UDP send path suffers from one indirect call to ip_generic_getfrag() > > We can use INDIRECT_CALL_1() to avoid it. > > Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Willem de Bruijn <willemb@google.com>
On Tue, Dec 3, 2024 at 12:36 PM Eric Dumazet <edumazet@google.com> wrote: > > UDP send path suffers from one indirect call to ip_generic_getfrag() > > We can use INDIRECT_CALL_1() to avoid it. > > Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Brian Vazquez <brianvv@google.com> > --- > Cc: Willem de Bruijn <willemb@google.com> > Cc: Brian Vazquez <brianvv@google.com> > --- > net/ipv4/ip_output.c | 13 +++++++++---- > net/ipv6/ip6_output.c | 13 ++++++++----- > 2 files changed, 17 insertions(+), 9 deletions(-) > > diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c > index 0065b1996c947078bea210c9abe5c80fa0e0ab4f..a59204a8d85053a9b8c9e86a404aa4bf2f0d2416 100644 > --- a/net/ipv4/ip_output.c > +++ b/net/ipv4/ip_output.c > @@ -1169,7 +1169,10 @@ static int __ip_append_data(struct sock *sk, > /* [!] NOTE: copy will be negative if pagedlen>0 > * because then the equation reduces to -fraggap. > */ > - if (copy > 0 && getfrag(from, data + transhdrlen, offset, copy, fraggap, skb) < 0) { > + if (copy > 0 && > + INDIRECT_CALL_1(getfrag, ip_generic_getfrag, > + from, data + transhdrlen, offset, > + copy, fraggap, skb) < 0) { > err = -EFAULT; > kfree_skb(skb); > goto error; > @@ -1213,8 +1216,9 @@ static int __ip_append_data(struct sock *sk, > unsigned int off; > > off = skb->len; > - if (getfrag(from, skb_put(skb, copy), > - offset, copy, off, skb) < 0) { > + if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag, > + from, skb_put(skb, copy), > + offset, copy, off, skb) < 0) { > __skb_trim(skb, off); > err = -EFAULT; > goto error; > @@ -1252,7 +1256,8 @@ static int __ip_append_data(struct sock *sk, > get_page(pfrag->page); > } > copy = min_t(int, copy, pfrag->size - pfrag->offset); > - if (getfrag(from, > + if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag, > + from, > page_address(pfrag->page) + pfrag->offset, > offset, copy, skb->len, skb) < 0) > goto error_efault; > diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c > index f7b4608bb316ed2114a0e626aad530b62b767fc1..3d672dea9f56284e7a8ebabec037e04e7f3d19f4 100644 > --- a/net/ipv6/ip6_output.c > +++ b/net/ipv6/ip6_output.c > @@ -1697,8 +1697,9 @@ static int __ip6_append_data(struct sock *sk, > pskb_trim_unique(skb_prev, maxfraglen); > } > if (copy > 0 && > - getfrag(from, data + transhdrlen, offset, > - copy, fraggap, skb) < 0) { > + INDIRECT_CALL_1(getfrag, ip_generic_getfrag, > + from, data + transhdrlen, offset, > + copy, fraggap, skb) < 0) { > err = -EFAULT; > kfree_skb(skb); > goto error; > @@ -1742,8 +1743,9 @@ static int __ip6_append_data(struct sock *sk, > unsigned int off; > > off = skb->len; > - if (getfrag(from, skb_put(skb, copy), > - offset, copy, off, skb) < 0) { > + if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag, > + from, skb_put(skb, copy), > + offset, copy, off, skb) < 0) { > __skb_trim(skb, off); > err = -EFAULT; > goto error; > @@ -1781,7 +1783,8 @@ static int __ip6_append_data(struct sock *sk, > get_page(pfrag->page); > } > copy = min_t(int, copy, pfrag->size - pfrag->offset); > - if (getfrag(from, > + if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag, > + from, > page_address(pfrag->page) + pfrag->offset, > offset, copy, skb->len, skb) < 0) > goto error_efault; > -- > 2.47.0.338.g60cca15819-goog >
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 0065b1996c947078bea210c9abe5c80fa0e0ab4f..a59204a8d85053a9b8c9e86a404aa4bf2f0d2416 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -1169,7 +1169,10 @@ static int __ip_append_data(struct sock *sk, /* [!] NOTE: copy will be negative if pagedlen>0 * because then the equation reduces to -fraggap. */ - if (copy > 0 && getfrag(from, data + transhdrlen, offset, copy, fraggap, skb) < 0) { + if (copy > 0 && + INDIRECT_CALL_1(getfrag, ip_generic_getfrag, + from, data + transhdrlen, offset, + copy, fraggap, skb) < 0) { err = -EFAULT; kfree_skb(skb); goto error; @@ -1213,8 +1216,9 @@ static int __ip_append_data(struct sock *sk, unsigned int off; off = skb->len; - if (getfrag(from, skb_put(skb, copy), - offset, copy, off, skb) < 0) { + if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag, + from, skb_put(skb, copy), + offset, copy, off, skb) < 0) { __skb_trim(skb, off); err = -EFAULT; goto error; @@ -1252,7 +1256,8 @@ static int __ip_append_data(struct sock *sk, get_page(pfrag->page); } copy = min_t(int, copy, pfrag->size - pfrag->offset); - if (getfrag(from, + if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag, + from, page_address(pfrag->page) + pfrag->offset, offset, copy, skb->len, skb) < 0) goto error_efault; diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index f7b4608bb316ed2114a0e626aad530b62b767fc1..3d672dea9f56284e7a8ebabec037e04e7f3d19f4 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -1697,8 +1697,9 @@ static int __ip6_append_data(struct sock *sk, pskb_trim_unique(skb_prev, maxfraglen); } if (copy > 0 && - getfrag(from, data + transhdrlen, offset, - copy, fraggap, skb) < 0) { + INDIRECT_CALL_1(getfrag, ip_generic_getfrag, + from, data + transhdrlen, offset, + copy, fraggap, skb) < 0) { err = -EFAULT; kfree_skb(skb); goto error; @@ -1742,8 +1743,9 @@ static int __ip6_append_data(struct sock *sk, unsigned int off; off = skb->len; - if (getfrag(from, skb_put(skb, copy), - offset, copy, off, skb) < 0) { + if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag, + from, skb_put(skb, copy), + offset, copy, off, skb) < 0) { __skb_trim(skb, off); err = -EFAULT; goto error; @@ -1781,7 +1783,8 @@ static int __ip6_append_data(struct sock *sk, get_page(pfrag->page); } copy = min_t(int, copy, pfrag->size - pfrag->offset); - if (getfrag(from, + if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag, + from, page_address(pfrag->page) + pfrag->offset, offset, copy, skb->len, skb) < 0) goto error_efault;
UDP send path suffers from one indirect call to ip_generic_getfrag() We can use INDIRECT_CALL_1() to avoid it. Signed-off-by: Eric Dumazet <edumazet@google.com> --- Cc: Willem de Bruijn <willemb@google.com> Cc: Brian Vazquez <brianvv@google.com> --- net/ipv4/ip_output.c | 13 +++++++++---- net/ipv6/ip6_output.c | 13 ++++++++----- 2 files changed, 17 insertions(+), 9 deletions(-)