[dpdk-dev,v2,2/4] examples/ip_pipeline: fix build for x86_64 without SSE4.2

Message ID 1455605170-16137-3-git-send-email-thomas.monjalon@6wind.com (mailing list archive)
State Accepted, archived
Headers

Commit Message

Thomas Monjalon Feb. 16, 2016, 6:46 a.m. UTC
  The compiler cannot use _mm_crc32_u64:

examples/ip_pipeline/pipeline/hash_func.h:165:9:
error: implicit declaration of function '_mm_crc32_u64' is invalid in C99

Fixes: 947024a26df7 ("examples/ip_pipeline: rework passthrough pipeline")

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 examples/ip_pipeline/pipeline/hash_func.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  

Comments

Cristian Dumitrescu March 30, 2016, 1:24 p.m. UTC | #1
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> Sent: Tuesday, February 16, 2016 6:46 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2 2/4] examples/ip_pipeline: fix build for
> x86_64 without SSE4.2
> 
> The compiler cannot use _mm_crc32_u64:
> 
> examples/ip_pipeline/pipeline/hash_func.h:165:9:
> error: implicit declaration of function '_mm_crc32_u64' is invalid in C99
> 
> Fixes: 947024a26df7 ("examples/ip_pipeline: rework passthrough pipeline")
> 
> Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
> ---
>  examples/ip_pipeline/pipeline/hash_func.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/examples/ip_pipeline/pipeline/hash_func.h
> b/examples/ip_pipeline/pipeline/hash_func.h
> index 7846300..1953ad4 100644
> --- a/examples/ip_pipeline/pipeline/hash_func.h
> +++ b/examples/ip_pipeline/pipeline/hash_func.h
> @@ -152,7 +152,7 @@ hash_xor_key64(void *key, __rte_unused uint32_t
> key_size, uint64_t seed)
>  	return (xor0 >> 32) ^ xor0;
>  }
> 
> -#if defined(__x86_64__)
> +#if defined(__x86_64__) && defined(RTE_CPUFLAG_SSE4_2)
> 
>  #include <x86intrin.h>
> 
> --
> 2.7.0

Hi Thomas,

This is not the correct fix, as RTE_CPUFLAG_SSE4_2 is a flag that can only be tested at run-time (as result of calling function rte_cpu_get_flag_enabled()), not at build-time.

The reason it appears to fix the build issue you are mentioning is the fact that this change results in disabling the  __x86_64__ code branch.

We need to revert this patch and look for a better option.

What is the compiler that generates the build issue you are mentioning? We could not reproduce it with gcc 5 (gcc 5.3.1).

Thanks,
Cristian
  
Cristian Dumitrescu March 30, 2016, 1:57 p.m. UTC | #2
> -----Original Message-----
> From: Dumitrescu, Cristian
> Sent: Wednesday, March 30, 2016 2:24 PM
> To: 'Thomas Monjalon' <thomas.monjalon@6wind.com>; dev@dpdk.org
> Cc: Singh, Jasvinder <jasvinder.singh@intel.com>; Zhang, Roy Fan
> <roy.fan.zhang@intel.com>; Hunt, David <david.hunt@intel.com>
> Subject: RE: [dpdk-dev] [PATCH v2 2/4] examples/ip_pipeline: fix build for
> x86_64 without SSE4.2
> Importance: High
> 
> 
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > Sent: Tuesday, February 16, 2016 6:46 AM
> > To: dev@dpdk.org
> > Subject: [dpdk-dev] [PATCH v2 2/4] examples/ip_pipeline: fix build for
> > x86_64 without SSE4.2
> >
> > The compiler cannot use _mm_crc32_u64:
> >
> > examples/ip_pipeline/pipeline/hash_func.h:165:9:
> > error: implicit declaration of function '_mm_crc32_u64' is invalid in C99
> >
> > Fixes: 947024a26df7 ("examples/ip_pipeline: rework passthrough
> pipeline")
> >
> > Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
> > ---
> >  examples/ip_pipeline/pipeline/hash_func.h | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/examples/ip_pipeline/pipeline/hash_func.h
> > b/examples/ip_pipeline/pipeline/hash_func.h
> > index 7846300..1953ad4 100644
> > --- a/examples/ip_pipeline/pipeline/hash_func.h
> > +++ b/examples/ip_pipeline/pipeline/hash_func.h
> > @@ -152,7 +152,7 @@ hash_xor_key64(void *key, __rte_unused uint32_t
> > key_size, uint64_t seed)
> >  	return (xor0 >> 32) ^ xor0;
> >  }
> >
> > -#if defined(__x86_64__)
> > +#if defined(__x86_64__) && defined(RTE_CPUFLAG_SSE4_2)
> >
> >  #include <x86intrin.h>
> >
> > --
> > 2.7.0
> 
> Hi Thomas,
> 
> This is not the correct fix, as RTE_CPUFLAG_SSE4_2 is a flag that can only be
> tested at run-time (as result of calling function rte_cpu_get_flag_enabled()),
> not at build-time.
> 
> The reason it appears to fix the build issue you are mentioning is the fact that
> this change results in disabling the  __x86_64__ code branch.
> 
> We need to revert this patch and look for a better option.
> 
> What is the compiler that generates the build issue you are mentioning? We
> could not reproduce it with gcc 5 (gcc 5.3.1).
> 
> Thanks,
> Cristian

I think the correct fix is:
#if defined(__x86_64__) && (defined(RTE_MACHINE_CPUFLAG_SSE4_2) || defined(RTE_MACHINE_CPUFLAG_CRC32))

We'll test it and send a patch asap.

Thanks,
Cristian
  
Thomas Monjalon March 30, 2016, 1:58 p.m. UTC | #3
2016-03-30 13:24, Dumitrescu, Cristian:
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > The compiler cannot use _mm_crc32_u64:
> > 
> > examples/ip_pipeline/pipeline/hash_func.h:165:9:
> > error: implicit declaration of function '_mm_crc32_u64' is invalid in C99
> > 
> > Fixes: 947024a26df7 ("examples/ip_pipeline: rework passthrough pipeline")
> > 
> > Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
[...]
> > -#if defined(__x86_64__)
> > +#if defined(__x86_64__) && defined(RTE_CPUFLAG_SSE4_2)
> 
> Hi Thomas,
> 
> This is not the correct fix, as RTE_CPUFLAG_SSE4_2 is a flag that can
> only be tested at run-time (as result of calling function
> rte_cpu_get_flag_enabled()), not at build-time.

Yes you're right. It is an error, the word MACHINE is missing.
The flag should be RTE_MACHINE_CPUFLAG_SSE4_2.

> The reason it appears to fix the build issue you are mentioning is the fact
> that this change results in disabling the  __x86_64__ code branch.
> 
> We need to revert this patch and look for a better option.
> 
> What is the compiler that generates the build issue you are mentioning?
> We could not reproduce it with gcc 5 (gcc 5.3.1).

It fails with gcc-5.2.0 and clang-3.6.2 for machine "default".
  
Thomas Monjalon March 30, 2016, 2:06 p.m. UTC | #4
2016-03-30 13:57, Dumitrescu, Cristian:
> I think the correct fix is:
> #if defined(__x86_64__) && (defined(RTE_MACHINE_CPUFLAG_SSE4_2) || defined(RTE_MACHINE_CPUFLAG_CRC32))
> 
> We'll test it and send a patch asap.

I had prepared this patch. Please be inspired:

    examples/ip_pipeline: fix SSE4.2 optimization branch
    
    The branch was disabled because of a typo in the SSE4.2 flag.
    Change also the x86_64 flag to use a DPDK one.
    
    Fixes: 28377375c6c0 ("examples/ip_pipeline: fix build for x86_64 without SSE4.2")

-#if defined(__x86_64__) && defined(RTE_CPUFLAG_SSE4_2)
+#if defined(RTE_ARCH_X86_64) && defined(RTE_MACHINE_CPUFLAG_SSE4_2)
  
Cristian Dumitrescu March 30, 2016, 2:15 p.m. UTC | #5
> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Wednesday, March 30, 2016 3:07 PM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> Cc: dev@dpdk.org; Singh, Jasvinder <jasvinder.singh@intel.com>; Zhang,
> Roy Fan <roy.fan.zhang@intel.com>; Hunt, David <david.hunt@intel.com>
> Subject: Re: [dpdk-dev] [PATCH v2 2/4] examples/ip_pipeline: fix build for
> x86_64 without SSE4.2
> 
> 2016-03-30 13:57, Dumitrescu, Cristian:
> > I think the correct fix is:
> > #if defined(__x86_64__) && (defined(RTE_MACHINE_CPUFLAG_SSE4_2)
> || defined(RTE_MACHINE_CPUFLAG_CRC32))
> >
> > We'll test it and send a patch asap.
> 
> I had prepared this patch. Please be inspired:
> 
>     examples/ip_pipeline: fix SSE4.2 optimization branch
> 
>     The branch was disabled because of a typo in the SSE4.2 flag.
>     Change also the x86_64 flag to use a DPDK one.
> 
>     Fixes: 28377375c6c0 ("examples/ip_pipeline: fix build for x86_64 without
> SSE4.2")
> 
> -#if defined(__x86_64__) && defined(RTE_CPUFLAG_SSE4_2)
> +#if defined(RTE_ARCH_X86_64) &&
> defined(RTE_MACHINE_CPUFLAG_SSE4_2)

Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
  
Thomas Monjalon March 30, 2016, 3:50 p.m. UTC | #6
2016-03-30 14:15, Dumitrescu, Cristian:
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > 2016-03-30 13:57, Dumitrescu, Cristian:
> > > I think the correct fix is:
> > > #if defined(__x86_64__) && (defined(RTE_MACHINE_CPUFLAG_SSE4_2)
> > || defined(RTE_MACHINE_CPUFLAG_CRC32))
> > >
> > > We'll test it and send a patch asap.
> > 
> > I had prepared this patch. Please be inspired:
> > 
> >     examples/ip_pipeline: fix SSE4.2 optimization branch
> > 
> >     The branch was disabled because of a typo in the SSE4.2 flag.
> >     Change also the x86_64 flag to use a DPDK one.
> > 
> >     Fixes: 28377375c6c0 ("examples/ip_pipeline: fix build for x86_64 without
> > SSE4.2")
> > 
> > -#if defined(__x86_64__) && defined(RTE_CPUFLAG_SSE4_2)
> > +#if defined(RTE_ARCH_X86_64) &&
> > defined(RTE_MACHINE_CPUFLAG_SSE4_2)
> 
> Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>

I thought you wanted to send a patch with another CPUFLAG (CRC32)?
  
Cristian Dumitrescu March 30, 2016, 4:31 p.m. UTC | #7
> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Wednesday, March 30, 2016 4:50 PM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> Cc: dev@dpdk.org; Singh, Jasvinder <jasvinder.singh@intel.com>; Zhang,
> Roy Fan <roy.fan.zhang@intel.com>; Hunt, David <david.hunt@intel.com>
> Subject: Re: [dpdk-dev] [PATCH v2 2/4] examples/ip_pipeline: fix build for
> x86_64 without SSE4.2
> 
> 2016-03-30 14:15, Dumitrescu, Cristian:
> > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > 2016-03-30 13:57, Dumitrescu, Cristian:
> > > > I think the correct fix is:
> > > > #if defined(__x86_64__) &&
> (defined(RTE_MACHINE_CPUFLAG_SSE4_2)
> > > || defined(RTE_MACHINE_CPUFLAG_CRC32))
> > > >
> > > > We'll test it and send a patch asap.
> > >
> > > I had prepared this patch. Please be inspired:
> > >
> > >     examples/ip_pipeline: fix SSE4.2 optimization branch
> > >
> > >     The branch was disabled because of a typo in the SSE4.2 flag.
> > >     Change also the x86_64 flag to use a DPDK one.
> > >
> > >     Fixes: 28377375c6c0 ("examples/ip_pipeline: fix build for x86_64
> without
> > > SSE4.2")
> > >
> > > -#if defined(__x86_64__) && defined(RTE_CPUFLAG_SSE4_2)
> > > +#if defined(RTE_ARCH_X86_64) &&
> > > defined(RTE_MACHINE_CPUFLAG_SSE4_2)
> >
> > Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> 
> I thought you wanted to send a patch with another CPUFLAG (CRC32)?

The extra flag is good, but not absolutely required, as SSE4.2 implies support for CRC32 instruction.

The CRC32 flag might be useful when a CPU architecture other than Intel supports the CRC32 instruction, but I am not sure whether such CPU architecture exists. Anyway, the SSE4.2 || CRC32 pattern is already present in several DPDK files, so I was looking to observe it as well.

I thought you considered the CRC32 flag to be redundant and decided to remove it on purpose.

I am OK if you want to go ahead with your patch right now, otherwise we can send a patch tomorrow?

Thanks,
Cristian
  

Patch

diff --git a/examples/ip_pipeline/pipeline/hash_func.h b/examples/ip_pipeline/pipeline/hash_func.h
index 7846300..1953ad4 100644
--- a/examples/ip_pipeline/pipeline/hash_func.h
+++ b/examples/ip_pipeline/pipeline/hash_func.h
@@ -152,7 +152,7 @@  hash_xor_key64(void *key, __rte_unused uint32_t key_size, uint64_t seed)
 	return (xor0 >> 32) ^ xor0;
 }
 
-#if defined(__x86_64__)
+#if defined(__x86_64__) && defined(RTE_CPUFLAG_SSE4_2)
 
 #include <x86intrin.h>