All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ipv6: suppress sparse warnings in IP6_ECN_set_ce()
@ 2016-08-11 10:04 Johannes Berg
  2016-08-11 21:26 ` Eric Dumazet
  0 siblings, 1 reply; 3+ messages in thread
From: Johannes Berg @ 2016-08-11 10:04 UTC (permalink / raw)
  To: netdev; +Cc: Eric Dumazet, Johannes Berg

From: Johannes Berg <johannes.berg@intel.com>

Use the correct type for these manipulations, which is __wsum,
instead of using __be32. This doesn't really change anything
since __wsum really *is* __be32, but removes the address space
warnings from sparse.

Cc: Eric Dumazet <edumazet@google.com>
Fixes: 34ae6a1aa054 ("ipv6: update skb->csum when CE mark is propagated")
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 include/net/inet_ecn.h | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h
index 0dc0a51da38f..89aa4e73fc37 100644
--- a/include/net/inet_ecn.h
+++ b/include/net/inet_ecn.h
@@ -119,14 +119,14 @@ struct ipv6hdr;
  */
 static inline int IP6_ECN_set_ce(struct sk_buff *skb, struct ipv6hdr *iph)
 {
-	__be32 from, to;
+	__wsum from, to;
 
 	if (INET_ECN_is_not_ect(ipv6_get_dsfield(iph)))
 		return 0;
 
-	from = *(__be32 *)iph;
-	to = from | htonl(INET_ECN_CE << 20);
-	*(__be32 *)iph = to;
+	from = *(__wsum *)iph;
+	to = from | (__force __wsum)htonl(INET_ECN_CE << 20);
+	*(__wsum *)iph = to;
 	if (skb->ip_summed == CHECKSUM_COMPLETE)
 		skb->csum = csum_add(csum_sub(skb->csum, from), to);
 	return 1;
-- 
2.8.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] ipv6: suppress sparse warnings in IP6_ECN_set_ce()
  2016-08-11 10:04 [PATCH] ipv6: suppress sparse warnings in IP6_ECN_set_ce() Johannes Berg
@ 2016-08-11 21:26 ` Eric Dumazet
  2016-08-12  5:43   ` Johannes Berg
  0 siblings, 1 reply; 3+ messages in thread
From: Eric Dumazet @ 2016-08-11 21:26 UTC (permalink / raw)
  To: Johannes Berg; +Cc: netdev, Eric Dumazet, Johannes Berg

On Thu, 2016-08-11 at 12:04 +0200, Johannes Berg wrote:
> From: Johannes Berg <johannes.berg@intel.com>
> 
> Use the correct type for these manipulations, which is __wsum,
> instead of using __be32. This doesn't really change anything
> since __wsum really *is* __be32, but removes the address space
> warnings from sparse.
> 
> Cc: Eric Dumazet <edumazet@google.com>
> Fixes: 34ae6a1aa054 ("ipv6: update skb->csum when CE mark is propagated")
> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
> ---
>  include/net/inet_ecn.h | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h
> index 0dc0a51da38f..89aa4e73fc37 100644
> --- a/include/net/inet_ecn.h
> +++ b/include/net/inet_ecn.h
> @@ -119,14 +119,14 @@ struct ipv6hdr;
>   */
>  static inline int IP6_ECN_set_ce(struct sk_buff *skb, struct ipv6hdr *iph)
>  {
> -	__be32 from, to;
> +	__wsum from, to;
>  
>  	if (INET_ECN_is_not_ect(ipv6_get_dsfield(iph)))
>  		return 0;
>  
> -	from = *(__be32 *)iph;
> -	to = from | htonl(INET_ECN_CE << 20);
> -	*(__be32 *)iph = to;
> +	from = *(__wsum *)iph;

Well, 4 first bytes of iph are not a __wsum technically speaking :(

> +	to = from | (__force __wsum)htonl(INET_ECN_CE << 20);

Hmm... this is a bit convoluted.
Doing a OR operation on a __wsum seems strange to me.

> +	*(__wsum *)iph = to;
>  	if (skb->ip_summed == CHECKSUM_COMPLETE)
>  		skb->csum = csum_add(csum_sub(skb->csum, from), to);
>  	return 1;



What about something like that ?

No big deal, but this looks a bit cleaner to me.

Thanks.

diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h
index 0dc0a51da38faacab2ea275681f5f70e09a6c79e..dce2d586d9cecb9e9de381aa0926f3e3d3ec9568 100644
--- a/include/net/inet_ecn.h
+++ b/include/net/inet_ecn.h
@@ -128,7 +128,8 @@ static inline int IP6_ECN_set_ce(struct sk_buff *skb, struct ipv6hdr *iph)
 	to = from | htonl(INET_ECN_CE << 20);
 	*(__be32 *)iph = to;
 	if (skb->ip_summed == CHECKSUM_COMPLETE)
-		skb->csum = csum_add(csum_sub(skb->csum, from), to);
+		skb->csum = csum_add(csum_sub(skb->csum, (__force __wsum)from),
+				     (__force __wsum)to);
 	return 1;
 }
 

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] ipv6: suppress sparse warnings in IP6_ECN_set_ce()
  2016-08-11 21:26 ` Eric Dumazet
@ 2016-08-12  5:43   ` Johannes Berg
  0 siblings, 0 replies; 3+ messages in thread
From: Johannes Berg @ 2016-08-12  5:43 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: netdev, Eric Dumazet

On Thu, 2016-08-11 at 23:26 +0200, Eric Dumazet wrote:
> On Thu, 2016-08-11 at 12:04 +0200, Johannes Berg wrote:
> > 
> > From: Johannes Berg <johannes.berg@intel.com>
> > 
> > Use the correct type for these manipulations, which is __wsum,
> > instead of using __be32. This doesn't really change anything
> > since __wsum really *is* __be32, but removes the address space
> > warnings from sparse.
> > 
> > Cc: Eric Dumazet <edumazet@google.com>
> > Fixes: 34ae6a1aa054 ("ipv6: update skb->csum when CE mark is
> > propagated")
> > Signed-off-by: Johannes Berg <johannes.berg@intel.com>
> > ---
> >  include/net/inet_ecn.h | 8 ++++----
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> > 
> > diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h
> > index 0dc0a51da38f..89aa4e73fc37 100644
> > --- a/include/net/inet_ecn.h
> > +++ b/include/net/inet_ecn.h
> > @@ -119,14 +119,14 @@ struct ipv6hdr;
> >   */
> >  static inline int IP6_ECN_set_ce(struct sk_buff *skb, struct
> > ipv6hdr *iph)
> >  {
> > -	__be32 from, to;
> > +	__wsum from, to;
> >  
> >  	if (INET_ECN_is_not_ect(ipv6_get_dsfield(iph)))
> >  		return 0;
> >  
> > -	from = *(__be32 *)iph;
> > -	to = from | htonl(INET_ECN_CE << 20);
> > -	*(__be32 *)iph = to;
> > +	from = *(__wsum *)iph;
> 
> Well, 4 first bytes of iph are not a __wsum technically speaking :(
> 
> > 
> > +	to = from | (__force __wsum)htonl(INET_ECN_CE << 20);
> 
> Hmm... this is a bit convoluted.
> Doing a OR operation on a __wsum seems strange to me.

Yeah, I was a bit torn.

> > +	*(__wsum *)iph = to;
> >  	if (skb->ip_summed == CHECKSUM_COMPLETE)
> >  		skb->csum = csum_add(csum_sub(skb->csum, from),
> > to);
> >  	return 1;
> 
> 
> 
> What about something like that ?
> 
> No big deal, but this looks a bit cleaner to me.
> 
> Thanks.
> 
> diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h
> index
> 0dc0a51da38faacab2ea275681f5f70e09a6c79e..dce2d586d9cecb9e9de381aa092
> 6f3e3d3ec9568 100644
> --- a/include/net/inet_ecn.h
> +++ b/include/net/inet_ecn.h
> @@ -128,7 +128,8 @@ static inline int IP6_ECN_set_ce(struct sk_buff
> *skb, struct ipv6hdr *iph)
>  	to = from | htonl(INET_ECN_CE << 20);
>  	*(__be32 *)iph = to;
>  	if (skb->ip_summed == CHECKSUM_COMPLETE)
> -		skb->csum = csum_add(csum_sub(skb->csum, from), to);
> +		skb->csum = csum_add(csum_sub(skb->csum, (__force
> __wsum)from),
> +				     (__force __wsum)to);
> 

I had exactly this originally, but then thought maybe using the right
type would be nicer. I'll send out this one again as v2, since you
prefer that.

johannes

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-08-12  5:44 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-11 10:04 [PATCH] ipv6: suppress sparse warnings in IP6_ECN_set_ce() Johannes Berg
2016-08-11 21:26 ` Eric Dumazet
2016-08-12  5:43   ` Johannes Berg

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.