[dpdk-dev,v4,13/23] rte_mbuf.h: explicit casts to uint16 to avoid warnings

Message ID 152627463294.53156.15245682101037939156.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 14, 2018, 5:10 a.m. UTC
  Signed-off-by: Andy Green <andy@warmcat.com>
---
 lib/librte_mbuf/rte_mbuf.h |   15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)
  

Comments

Bruce Richardson May 17, 2018, 10:58 a.m. UTC | #1
On Mon, May 14, 2018 at 01:10:32PM +0800, Andy Green wrote:
> Signed-off-by: Andy Green <andy@warmcat.com>
> ---
>  lib/librte_mbuf/rte_mbuf.h |   15 ++++++++-------
>  1 file changed, 8 insertions(+), 7 deletions(-)
> 
> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
> index 169f3d3b0..3cd76abbc 100644
> --- a/lib/librte_mbuf/rte_mbuf.h
> +++ b/lib/librte_mbuf/rte_mbuf.h
> @@ -1580,7 +1580,7 @@ static inline void rte_pktmbuf_detach(struct rte_mbuf *m)
>  	mbuf_size = (uint32_t)sizeof(struct rte_mbuf) + priv_size;
>  	buf_len = rte_pktmbuf_data_room_size(mp);
>  
> -	m->priv_size = priv_size;
> +	m->priv_size = (uint16_t)priv_size;
>  	m->buf_addr = (char *)m + mbuf_size;
>  	m->buf_iova = rte_mempool_virt2iova(m) + mbuf_size;
>  	m->buf_len = (uint16_t)buf_len;

I think a better fix for this is to change priv_size to be uint16_t. There
is no reason for it to be a 32-bit value.


> @@ -1905,7 +1905,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);
>  

What is the error message here? The cast isn't wrong, it just seems like we
shouldn't need it. I suppose it's implicit promotion being done in the
subtraction operation.

> @@ -1966,7 +1966,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;
>  }
> @@ -2079,7 +2079,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 */
> @@ -2109,7 +2109,8 @@ rte_validate_tx_offload(const struct rte_mbuf *m)
>  		return 0;
>  
>  	if (ol_flags & PKT_TX_OUTER_IP_CKSUM)
> -		inner_l3_offset += m->outer_l2_len + m->outer_l3_len;
> +		inner_l3_offset += (unsigned int)(m->outer_l2_len +
> +						  m->outer_l3_len);
>  
>  	/* Headers are fragmented */
>  	if (rte_pktmbuf_data_len(m) < inner_l3_offset + m->l3_len + m->l4_len)
> @@ -2154,7 +2155,7 @@ rte_validate_tx_offload(const struct rte_mbuf *m)
>  static inline int
>  rte_pktmbuf_linearize(struct rte_mbuf *mbuf)
>  {
> -	int seg_len, copy_len;
> +	size_t seg_len, copy_len;
>  	struct rte_mbuf *m;
>  	struct rte_mbuf *m_next;
>  	char *buffer;
> @@ -2169,7 +2170,7 @@ rte_pktmbuf_linearize(struct rte_mbuf *mbuf)
>  		return -1;
>  
>  	buffer = rte_pktmbuf_mtod_offset(mbuf, char *, mbuf->data_len);
> -	mbuf->data_len = (uint16_t)(mbuf->pkt_len);
> +	mbuf->data_len = (uint16_t)mbuf->pkt_len;
>  
>  	/* Append data from next segments to the first one */
>  	m = mbuf->next;
>
  
Andy Green May 17, 2018, 1:28 p.m. UTC | #2
On 05/17/2018 06:58 PM, Bruce Richardson wrote:
> On Mon, May 14, 2018 at 01:10:32PM +0800, Andy Green wrote:
>> Signed-off-by: Andy Green <andy@warmcat.com>
>> ---
>>   lib/librte_mbuf/rte_mbuf.h |   15 ++++++++-------
>>   1 file changed, 8 insertions(+), 7 deletions(-)
>>
>> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
>> index 169f3d3b0..3cd76abbc 100644
>> --- a/lib/librte_mbuf/rte_mbuf.h
>> +++ b/lib/librte_mbuf/rte_mbuf.h
>> @@ -1580,7 +1580,7 @@ static inline void rte_pktmbuf_detach(struct rte_mbuf *m)
>>   	mbuf_size = (uint32_t)sizeof(struct rte_mbuf) + priv_size;
>>   	buf_len = rte_pktmbuf_data_room_size(mp);
>>   
>> -	m->priv_size = priv_size;
>> +	m->priv_size = (uint16_t)priv_size;
>>   	m->buf_addr = (char *)m + mbuf_size;
>>   	m->buf_iova = rte_mempool_virt2iova(m) + mbuf_size;
>>   	m->buf_len = (uint16_t)buf_len;
> 
> I think a better fix for this is to change priv_size to be uint16_t. There
> is no reason for it to be a 32-bit value.

OK.

>> @@ -1905,7 +1905,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);
>>   
> 
> What is the error message here? The cast isn't wrong, it just seems like we
> shouldn't need it. I suppose it's implicit promotion being done in the
> subtraction operation.

     /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;
                      ^~~

I have added all the original warnings to the patch.

-Andy

>> @@ -1966,7 +1966,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;
>>   }
>> @@ -2079,7 +2079,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 */
>> @@ -2109,7 +2109,8 @@ rte_validate_tx_offload(const struct rte_mbuf *m)
>>   		return 0;
>>   
>>   	if (ol_flags & PKT_TX_OUTER_IP_CKSUM)
>> -		inner_l3_offset += m->outer_l2_len + m->outer_l3_len;
>> +		inner_l3_offset += (unsigned int)(m->outer_l2_len +
>> +						  m->outer_l3_len);
>>   
>>   	/* Headers are fragmented */
>>   	if (rte_pktmbuf_data_len(m) < inner_l3_offset + m->l3_len + m->l4_len)
>> @@ -2154,7 +2155,7 @@ rte_validate_tx_offload(const struct rte_mbuf *m)
>>   static inline int
>>   rte_pktmbuf_linearize(struct rte_mbuf *mbuf)
>>   {
>> -	int seg_len, copy_len;
>> +	size_t seg_len, copy_len;
>>   	struct rte_mbuf *m;
>>   	struct rte_mbuf *m_next;
>>   	char *buffer;
>> @@ -2169,7 +2170,7 @@ rte_pktmbuf_linearize(struct rte_mbuf *mbuf)
>>   		return -1;
>>   
>>   	buffer = rte_pktmbuf_mtod_offset(mbuf, char *, mbuf->data_len);
>> -	mbuf->data_len = (uint16_t)(mbuf->pkt_len);
>> +	mbuf->data_len = (uint16_t)mbuf->pkt_len;
>>   
>>   	/* Append data from next segments to the first one */
>>   	m = mbuf->next;
>>
  

Patch

diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 169f3d3b0..3cd76abbc 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -1580,7 +1580,7 @@  static inline void rte_pktmbuf_detach(struct rte_mbuf *m)
 	mbuf_size = (uint32_t)sizeof(struct rte_mbuf) + priv_size;
 	buf_len = rte_pktmbuf_data_room_size(mp);
 
-	m->priv_size = priv_size;
+	m->priv_size = (uint16_t)priv_size;
 	m->buf_addr = (char *)m + mbuf_size;
 	m->buf_iova = rte_mempool_virt2iova(m) + mbuf_size;
 	m->buf_len = (uint16_t)buf_len;
@@ -1905,7 +1905,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);
 
@@ -1966,7 +1966,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;
 }
@@ -2079,7 +2079,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 */
@@ -2109,7 +2109,8 @@  rte_validate_tx_offload(const struct rte_mbuf *m)
 		return 0;
 
 	if (ol_flags & PKT_TX_OUTER_IP_CKSUM)
-		inner_l3_offset += m->outer_l2_len + m->outer_l3_len;
+		inner_l3_offset += (unsigned int)(m->outer_l2_len +
+						  m->outer_l3_len);
 
 	/* Headers are fragmented */
 	if (rte_pktmbuf_data_len(m) < inner_l3_offset + m->l3_len + m->l4_len)
@@ -2154,7 +2155,7 @@  rte_validate_tx_offload(const struct rte_mbuf *m)
 static inline int
 rte_pktmbuf_linearize(struct rte_mbuf *mbuf)
 {
-	int seg_len, copy_len;
+	size_t seg_len, copy_len;
 	struct rte_mbuf *m;
 	struct rte_mbuf *m_next;
 	char *buffer;
@@ -2169,7 +2170,7 @@  rte_pktmbuf_linearize(struct rte_mbuf *mbuf)
 		return -1;
 
 	buffer = rte_pktmbuf_mtod_offset(mbuf, char *, mbuf->data_len);
-	mbuf->data_len = (uint16_t)(mbuf->pkt_len);
+	mbuf->data_len = (uint16_t)mbuf->pkt_len;
 
 	/* Append data from next segments to the first one */
 	m = mbuf->next;