[dpdk-dev,v6,7/8] rte_mbuf.h: add and subtract explicitly to avoid promotion

Message ID 152686808848.58694.3396046717951220668.stgit@localhost.localdomain (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Andy Green May 21, 2018, 2:01 a.m. UTC
  /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
    In function 'rte_pktmbuf_prepend':
    /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
    1908:17: warning: conversion from 'int' to 'uint16_t'
    {aka 'short unsigned int'} may change value [-Wconversion]
      m->data_off -= len;
                     ^~~
    m->data_off is a uint16_t

            uint16_t data_off;

    len (a uint16_t) is promoted to an int using -=.  Do the
    subtraction explicitly and cast the result to uint16_t.

    -       m->data_off -= len;
    +       m->data_off = (uint16_t)(m->data_off - len);

    The below += or -= changes are solving the same thing.

    /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
    In function 'rte_pktmbuf_adj':
    /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
    1969:17: warning: conversion from 'int' to 'uint16_t'
    {aka 'short unsigned int'} may change value [-Wconversion]
      m->data_off += len;
                     ^~~
    /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
    In function 'rte_pktmbuf_chain':
    /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
    2082:19: warning: conversion from 'int' to 'uint16_t'
    {aka 'short unsigned int'} may change value [-Wconversion]
      head->nb_segs += tail->nb_segs;
                       ^~~~
    Also uint16_t

            uint16_t nb_segs;         /**< Number of segments. */

Fixes: 08b563ffb1 ("mbuf: replace data pointer by an offset")
Signed-off-by: Andy Green <andy@warmcat.com>
---
 lib/librte_mbuf/rte_mbuf.h |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
  

Comments

Bruce Richardson May 21, 2018, 1:10 p.m. UTC | #1
On Mon, May 21, 2018 at 10:01:28AM +0800, Andy Green wrote:
>    /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
>     In function 'rte_pktmbuf_prepend':
>     /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
>     1908:17: warning: conversion from 'int' to 'uint16_t'
>     {aka 'short unsigned int'} may change value [-Wconversion]
>       m->data_off -= len;
>                      ^~~
>     m->data_off is a uint16_t
> 
>             uint16_t data_off;
> 
>     len (a uint16_t) is promoted to an int using -=.  Do the
>     subtraction explicitly and cast the result to uint16_t.
> 
>     -       m->data_off -= len;
>     +       m->data_off = (uint16_t)(m->data_off - len);
> 
>     The below += or -= changes are solving the same thing.
> 
>     /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
>     In function 'rte_pktmbuf_adj':
>     /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
>     1969:17: warning: conversion from 'int' to 'uint16_t'
>     {aka 'short unsigned int'} may change value [-Wconversion]
>       m->data_off += len;
>                      ^~~
>     /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
>     In function 'rte_pktmbuf_chain':
>     /projects/lagopus/src/dpdk/build/include/rte_mbuf.h:
>     2082:19: warning: conversion from 'int' to 'uint16_t'
>     {aka 'short unsigned int'} may change value [-Wconversion]
>       head->nb_segs += tail->nb_segs;
>                        ^~~~
>     Also uint16_t
> 
>             uint16_t nb_segs;         /**< Number of segments. */
> 
> Fixes: 08b563ffb1 ("mbuf: replace data pointer by an offset")
> Signed-off-by: Andy Green <andy@warmcat.com>
> ---
>  lib/librte_mbuf/rte_mbuf.h |    6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
> index a0423a548..beb104c69 100644
> --- a/lib/librte_mbuf/rte_mbuf.h
> +++ b/lib/librte_mbuf/rte_mbuf.h
> @@ -1908,7 +1908,7 @@ static inline char *rte_pktmbuf_prepend(struct rte_mbuf *m,
>  	if (unlikely(len > rte_pktmbuf_headroom(m)))
>  		return NULL;
>  
> -	m->data_off -= len;
> +	m->data_off = (uint16_t)(m->data_off - len);
>  	m->data_len = (uint16_t)(m->data_len + len);
>  	m->pkt_len  = (m->pkt_len + len);
>  
Code change looks ok to me, again it wouldn't hurt to have a comment
explaining the absense of -=, but otherwise:

Acked-by: Bruce Richardson <bruce.richardson@intel.com>
  

Patch

diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index a0423a548..beb104c69 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -1908,7 +1908,7 @@  static inline char *rte_pktmbuf_prepend(struct rte_mbuf *m,
 	if (unlikely(len > rte_pktmbuf_headroom(m)))
 		return NULL;
 
-	m->data_off -= len;
+	m->data_off = (uint16_t)(m->data_off - len);
 	m->data_len = (uint16_t)(m->data_len + len);
 	m->pkt_len  = (m->pkt_len + len);
 
@@ -1969,7 +1969,7 @@  static inline char *rte_pktmbuf_adj(struct rte_mbuf *m, uint16_t len)
 		return NULL;
 
 	m->data_len = (uint16_t)(m->data_len - len);
-	m->data_off += len;
+	m->data_off = (uint16_t)(m->data_off + len);
 	m->pkt_len  = (m->pkt_len - len);
 	return (char *)m->buf_addr + m->data_off;
 }
@@ -2082,7 +2082,7 @@  static inline int rte_pktmbuf_chain(struct rte_mbuf *head, struct rte_mbuf *tail
 	cur_tail->next = tail;
 
 	/* accumulate number of segments and total length. */
-	head->nb_segs += tail->nb_segs;
+	head->nb_segs = (uint16_t)(head->nb_segs + tail->nb_segs);
 	head->pkt_len += tail->pkt_len;
 
 	/* pkt_len is only set in the head */