Thread (19 messages) 19 messages, 4 authors, 2021-10-25

Re: [dpdk-dev] [PATCH 2/3] mbuf: avoid cast-align warning in pktmbuf mtod offset macro

From: Olivier Matz <hidden>
Date: 2021-07-30 11:10:20

Hi Eli,

On Thu, Jul 29, 2021 at 10:13:45AM +0300, Eli Britstein wrote:
On 7/28/2021 6:28 PM, Olivier Matz wrote:
quoted
External email: Use caution opening links or attachments


On Tue, Jul 13, 2021 at 09:49:09AM +0300, Eli Britstein wrote:
quoted
In rte_pktmbuf_mtod_offset macro, there is a casting from char * to type
't', which may cause cast-align warning when using gcc flags
'-Werror -Wcast-align':

.../include/rte_mbuf_core.h:723:3: error: cast increases required alignment
     of target type [-Werror=cast-align]
   723 |  ((t)((char *)(m)->buf_addr + (m)->data_off + (o)))
       |   ^

As the code assumes correct alignment, add first a (void *) casting, to
avoid the warning.

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: Eli Britstein <redacted>
My initial thinking was that it's the problem of the application: if
-Werror=cast-align is used, it is up to the application to cast the
return value of rte_pktmbuf_mtod_offset() to (void *) before casting it
to the network type.

But, if I understand correctly, the problem is not about the application
code itself, but about inlined code in the header files of dpdk
(i.e. compiling an empty C file that just includes the dpdk headers with
-Werror=cast-align). Is it correct? If yes I think it should be
highlighted in the commit log.
I think yes, though in this specific patch it is not even an inline
function, but a macro.

However, I don't have a synthetic application example to show those
warnings, thus didn't put such in the commit msg.
For this patch, I think it would be useful to have a way to reproduce
the issue first, so we can check whether it is the proper place to fix
the problem.

To me, it is assumed in the DPDK project that we can mmap a network
structure on mbuf data (maybe I'm wrong?). If an external application
like OVS wants to use -Werror=cast-align, it has to cast the result of
calls to rte_pktmbuf_mtod() family.

The only corner cases are DPDK header files which have static inline
functions or macro that forces the use of rte_pktmbuf_mtod() family
without a cast (like for your patch 1/3), because it cannot be fixed in
the external project.

I think we have to make our header files compliant to projects that want
to use -Werror=cast-align, like we do to make our header files compliant
to C++.

What you suggest in this patch forces the cast to (void *) for all users
of rte_pktmbuf_mtod() family. This could be a problem for projects that
want to see these warnings.

Would it be possible instead to add a cast in DPDK headers, in inline
functions that make use of these mtod functions?

Regards,
Olivier


quoted
Out of curiosity, how did you find the errors? I mean, is it possible
that some casts are missing some other headers, or is this patchset
exhaustive?
Currently OVS-DPDK is compiled only with -Wno-cast-align.

Following complaint that a recent commit introduced a degradation in OVS
[1], I compiled OVS without this warning deprecation.
The fixes in OVS are [2] and [3] (already merged). The fixes in DPDK are in
this patch-set.

[1] https://mail.openvswitch.org/pipermail/ovs-dev/2021-July/385084.html
[2] https://mail.openvswitch.org/pipermail/ovs-dev/2021-July/386278.html
    e8cccd3a3589 ("netdev-offload-dpdk: Fix IPv6 rewrite cast-align
warning.")
[3] https://mail.openvswitch.org/pipermail/ovs-dev/2021-July/386279.html
    1f7f557603a5 ("netdev-offload-dpdk: Fix vxlan vni cast-align warnings.")
quoted
Thanks,
Olivier

quoted
---
  lib/mbuf/rte_mbuf_core.h | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/mbuf/rte_mbuf_core.h b/lib/mbuf/rte_mbuf_core.h
index bb38d7f581..dabdeee604 100644
--- a/lib/mbuf/rte_mbuf_core.h
+++ b/lib/mbuf/rte_mbuf_core.h
@@ -720,7 +720,7 @@ struct rte_mbuf_ext_shared_info {
   *   The type to cast the result into.
   */
  #define rte_pktmbuf_mtod_offset(m, t, o)     \
-     ((t)((char *)(m)->buf_addr + (m)->data_off + (o)))
+     ((t)(void *)((char *)(m)->buf_addr + (m)->data_off + (o)))

  /**
   * A macro that points to the start of the data in the mbuf.
--
2.28.0.2311.g225365fb51
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help