From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <andy@warmcat.com>
Received: from mail.warmcat.com (mail.warmcat.com [163.172.24.82])
 by dpdk.org (Postfix) with ESMTP id 5516F2BAA
 for <dev@dpdk.org>; Tue, 22 May 2018 03:24:46 +0200 (CEST)
From: Andy Green <andy@warmcat.com>
To: dev@dpdk.org
Cc: thomas@monjalon.net
Date: Tue, 22 May 2018 09:24:42 +0800
Message-ID: <152695228241.111551.3452110086254916700.stgit@localhost.localdomain>
In-Reply-To: <152695215195.111551.10652921922687464367.stgit@localhost.localdomain>
References: <152695215195.111551.10652921922687464367.stgit@localhost.localdomain>
User-Agent: StGit/unknown-version
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
Subject: [dpdk-dev] [PATCH v7 7/8] rte_mbuf.h: add and subtract explicitly
 to avoid promotion
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Tue, 22 May 2018 01:24:46 -0000

   /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>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
 lib/librte_mbuf/rte_mbuf.h |   17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 0e89a6927..e136d12b7 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -1908,7 +1908,10 @@ static inline char *rte_pktmbuf_prepend(struct rte_mbuf *m,
 	if (unlikely(len > rte_pktmbuf_headroom(m)))
 		return NULL;
 
-	m->data_off -= len;
+	/* NB: elaborating the subtraction like this instead of using
+	 *     -= allows us to ensure the result type is uint16_t
+	 *     avoiding compiler warnings on gcc 8.1 at least */
+	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);
 
@@ -1968,8 +1971,11 @@ static inline char *rte_pktmbuf_adj(struct rte_mbuf *m, uint16_t len)
 	if (unlikely(len > m->data_len))
 		return NULL;
 
+	/* NB: elaborating the addition like this instead of using
+	 *     += allows us to ensure the result type is uint16_t
+	 *     avoiding compiler warnings on gcc 8.1 at least */
 	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;
 }
@@ -2081,8 +2087,11 @@ static inline int rte_pktmbuf_chain(struct rte_mbuf *head, struct rte_mbuf *tail
 	cur_tail = rte_pktmbuf_lastseg(head);
 	cur_tail->next = tail;
 
-	/* accumulate number of segments and total length. */
-	head->nb_segs += tail->nb_segs;
+	/* accumulate number of segments and total length.
+	 * NB: elaborating the addition like this instead of using
+	 *     -= allows us to ensure the result type is uint16_t
+	 *     avoiding compiler warnings on gcc 8.1 at least */
+	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 */