From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id F30142BF4 for ; Thu, 3 Jan 2019 09:15:31 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from yskoh@mellanox.com) with ESMTPS (AES256-SHA encrypted); 3 Jan 2019 10:15:27 +0200 Received: from scfae-sc-2.mti.labs.mlnx (scfae-sc-2.mti.labs.mlnx [10.101.0.96]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x038EJg5008603; Thu, 3 Jan 2019 10:15:25 +0200 From: Yongseok Koh To: Andy Green Cc: Bruce Richardson , dpdk stable Date: Thu, 3 Jan 2019 00:13:59 -0800 Message-Id: <20190103081400.14191-36-yskoh@mellanox.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190103081400.14191-1-yskoh@mellanox.com> References: <20190103081400.14191-1-yskoh@mellanox.com> Subject: [dpdk-stable] patch 'mbuf: avoid integer promotion in prepend/adj/chain' has been queued to LTS release 17.11.5 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 Jan 2019 08:15:32 -0000 Hi, FYI, your patch has been queued to LTS release 17.11.5 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 01/04/19. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. If the code is different (ie: not only metadata diffs), due for example to a change in context or macro names, please double check it. Thanks. Yongseok --- >>From 91f14efa3ea358957b7292d406fe1cf3627b4c78 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Tue, 22 May 2018 09:24:42 +0800 Subject: [PATCH] mbuf: avoid integer promotion in prepend/adj/chain [ upstream commit 9d0b59f84e1170b12a128cdcccab5711f25b5dd8 ] GCC 8.1 warned: In function 'rte_pktmbuf_prepend': 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. The below += or -= changes are solving the same thing. In function 'rte_pktmbuf_adj': rte_mbuf.h:1969:17: warning: conversion from 'int' to 'uint16_t' {aka 'short unsigned int'} may change value [-Wconversion] m->data_off += len; ^~~ In function 'rte_pktmbuf_chain': 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: 08b563ffb19d ("mbuf: replace data pointer by an offset") Fixes: 1a60a0daa6e4 ("mbuf: fix segments number type increase") Signed-off-by: Andy Green Acked-by: Bruce Richardson --- 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 8c63a9fdb..e6fd86f29 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -1666,7 +1666,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); @@ -1726,8 +1729,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; } @@ -1839,8 +1845,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 */ -- 2.11.0 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2019-01-02 23:59:13.975320321 -0800 +++ 0036-mbuf-avoid-integer-promotion-in-prepend-adj-chain.patch 2019-01-02 23:59:12.105818000 -0800 @@ -1,8 +1,10 @@ -From 9d0b59f84e1170b12a128cdcccab5711f25b5dd8 Mon Sep 17 00:00:00 2001 +From 91f14efa3ea358957b7292d406fe1cf3627b4c78 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Tue, 22 May 2018 09:24:42 +0800 Subject: [PATCH] mbuf: avoid integer promotion in prepend/adj/chain +[ upstream commit 9d0b59f84e1170b12a128cdcccab5711f25b5dd8 ] + GCC 8.1 warned: In function 'rte_pktmbuf_prepend': @@ -36,7 +38,6 @@ Fixes: 08b563ffb19d ("mbuf: replace data pointer by an offset") Fixes: 1a60a0daa6e4 ("mbuf: fix segments number type increase") -Cc: stable@dpdk.org Signed-off-by: Andy Green Acked-by: Bruce Richardson @@ -45,10 +46,10 @@ 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 +index 8c63a9fdb..e6fd86f29 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, +@@ -1666,7 +1666,10 @@ static inline char *rte_pktmbuf_prepend(struct rte_mbuf *m, if (unlikely(len > rte_pktmbuf_headroom(m))) return NULL; @@ -60,7 +61,7 @@ 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) +@@ -1726,8 +1729,11 @@ static inline char *rte_pktmbuf_adj(struct rte_mbuf *m, uint16_t len) if (unlikely(len > m->data_len)) return NULL; @@ -73,7 +74,7 @@ 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 +@@ -1839,8 +1845,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;