* [PATCH] net: fix bogus cast in skb_pagelen() and use unsigned variables
@ 2016-11-19 1:08 Alexey Dobriyan
2016-11-20 3:12 ` David Miller
2016-11-23 12:49 ` David Laight
0 siblings, 2 replies; 4+ messages in thread
From: Alexey Dobriyan @ 2016-11-19 1:08 UTC (permalink / raw)
To: davem; +Cc: netdev
1) cast to "int" is unnecessary:
u8 will be promoted to int before decrementing,
small positive numbers fit into "int", so their values won't be changed
during promotion.
Once everything is int including loop counters, signedness doesn't
matter: 32-bit operations will stay 32-bit operations.
But! Someone tried to make this loop smart by making everything of
the same type apparently in an attempt to optimise it.
Do the optimization, just differently.
Do the cast where it matters. :^)
2) frag size is unsigned entity and sum of fragments sizes is also
unsigned.
Make everything unsigned, leave no MOVSX instruction behind.
add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-4 (-4)
function old new delta
skb_cow_data 835 834 -1
ip_do_fragment 2549 2548 -1
ip6_fragment 3130 3128 -2
Total: Before=154865032, After=154865028, chg -0.00%
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
---
include/linux/skbuff.h | 6 +++---
net/ipv4/ip_output.c | 2 +-
net/ipv6/ip6_output.c | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1799,11 +1799,11 @@ static inline unsigned int skb_headlen(const struct sk_buff *skb)
return skb->len - skb->data_len;
}
-static inline int skb_pagelen(const struct sk_buff *skb)
+static inline unsigned int skb_pagelen(const struct sk_buff *skb)
{
- int i, len = 0;
+ unsigned int i, len = 0;
- for (i = (int)skb_shinfo(skb)->nr_frags - 1; i >= 0; i--)
+ for (i = skb_shinfo(skb)->nr_frags - 1; (int)i >= 0; i--)
len += skb_frag_size(&skb_shinfo(skb)->frags[i]);
return len + skb_headlen(skb);
}
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -581,7 +581,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
*/
if (skb_has_frag_list(skb)) {
struct sk_buff *frag, *frag2;
- int first_len = skb_pagelen(skb);
+ unsigned int first_len = skb_pagelen(skb);
if (first_len - hlen > mtu ||
((first_len - hlen) & 7) ||
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -625,7 +625,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
hroom = LL_RESERVED_SPACE(rt->dst.dev);
if (skb_has_frag_list(skb)) {
- int first_len = skb_pagelen(skb);
+ unsigned int first_len = skb_pagelen(skb);
struct sk_buff *frag2;
if (first_len - hlen > mtu ||
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] net: fix bogus cast in skb_pagelen() and use unsigned variables
2016-11-19 1:08 [PATCH] net: fix bogus cast in skb_pagelen() and use unsigned variables Alexey Dobriyan
@ 2016-11-20 3:12 ` David Miller
2016-11-23 12:49 ` David Laight
1 sibling, 0 replies; 4+ messages in thread
From: David Miller @ 2016-11-20 3:12 UTC (permalink / raw)
To: adobriyan; +Cc: netdev
From: Alexey Dobriyan <adobriyan@gmail.com>
Date: Sat, 19 Nov 2016 04:08:08 +0300
> 1) cast to "int" is unnecessary:
> u8 will be promoted to int before decrementing,
> small positive numbers fit into "int", so their values won't be changed
> during promotion.
>
> Once everything is int including loop counters, signedness doesn't
> matter: 32-bit operations will stay 32-bit operations.
>
> But! Someone tried to make this loop smart by making everything of
> the same type apparently in an attempt to optimise it.
> Do the optimization, just differently.
> Do the cast where it matters. :^)
>
> 2) frag size is unsigned entity and sum of fragments sizes is also
> unsigned.
>
> Make everything unsigned, leave no MOVSX instruction behind.
...
> Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Applied to net-next.
^ permalink raw reply [flat|nested] 4+ messages in thread
* RE: [PATCH] net: fix bogus cast in skb_pagelen() and use unsigned variables
2016-11-19 1:08 [PATCH] net: fix bogus cast in skb_pagelen() and use unsigned variables Alexey Dobriyan
2016-11-20 3:12 ` David Miller
@ 2016-11-23 12:49 ` David Laight
2016-11-23 15:35 ` Alexey Dobriyan
1 sibling, 1 reply; 4+ messages in thread
From: David Laight @ 2016-11-23 12:49 UTC (permalink / raw)
To: 'Alexey Dobriyan', davem@davemloft.net; +Cc: netdev@vger.kernel.org
From: Alexey Dobriyan
> Sent: 19 November 2016 01:08
...
> - for (i = (int)skb_shinfo(skb)->nr_frags - 1; i >= 0; i--)
> + for (i = skb_shinfo(skb)->nr_frags - 1; (int)i >= 0; i--)
> len += skb_frag_size(&skb_shinfo(skb)->frags[i]);
Think I'd use:
for (i = skb_shinfo(skb)->nr_frags; i-- != 0; )
David
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] net: fix bogus cast in skb_pagelen() and use unsigned variables
2016-11-23 12:49 ` David Laight
@ 2016-11-23 15:35 ` Alexey Dobriyan
0 siblings, 0 replies; 4+ messages in thread
From: Alexey Dobriyan @ 2016-11-23 15:35 UTC (permalink / raw)
To: David Laight; +Cc: davem@davemloft.net, netdev@vger.kernel.org
On Wed, Nov 23, 2016 at 3:49 PM, David Laight <David.Laight@aculab.com> wrote:
> From: Alexey Dobriyan
>> Sent: 19 November 2016 01:08
> ...
>> - for (i = (int)skb_shinfo(skb)->nr_frags - 1; i >= 0; i--)
>> + for (i = skb_shinfo(skb)->nr_frags - 1; (int)i >= 0; i--)
>> len += skb_frag_size(&skb_shinfo(skb)->frags[i]);
>
> Think I'd use:
> for (i = skb_shinfo(skb)->nr_frags; i-- != 0; )
This kind of diverges from canonical loop form:
for (init; temination condition: iterator)
by shifting everything into termination part.
A
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-11-23 15:35 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-19 1:08 [PATCH] net: fix bogus cast in skb_pagelen() and use unsigned variables Alexey Dobriyan
2016-11-20 3:12 ` David Miller
2016-11-23 12:49 ` David Laight
2016-11-23 15:35 ` Alexey Dobriyan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).