All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ajit Khaparde <ajit.khaparde@broadcom.com>
To: Piotr Kubaj <pkubaj@freebsd.org>
Cc: Nicolas Chautru <nicolas.chautru@intel.com>,
	declan.doherty@intel.com,
	 Somnath Kotur <somnath.kotur@broadcom.com>,
	Beilei Xing <beilei.xing@intel.com>, Jeff Guo <jia.guo@intel.com>,
	Haiyue Wang <haiyue.wang@intel.com>,
	 Jiawen Wu <jiawenwu@trustnetic.com>,
	Jian Wang <jianwang@trustnetic.com>,
	 David Christensen <drc@linux.vnet.ibm.com>,
	dpdk-dev <dev@dpdk.org>
Subject: Re: [dpdk-dev] [PATCH] ppc64le: fix build with Clang and without glibc
Date: Thu, 11 Mar 2021 12:58:04 -0800	[thread overview]
Message-ID: <CACZ4nhsJL2v1E=O_3mp3u0o9C0Q3cgenmbNC0Pt2F-UATfaiqg@mail.gmail.com> (raw)
In-Reply-To: <20210311161140.70534-1-pkubaj@FreeBSD.org>

[-- Attachment #1: Type: text/plain, Size: 16638 bytes --]

On Thu, Mar 11, 2021 at 8:11 AM Piotr Kubaj <pkubaj@freebsd.org> wrote:
>
> There are couple of issues when building with Clang:
> 1. vector is a keyword and should not be used in code. I undefined it,
> but it would probably be better to just change the variable name.
> 2. vector long is deprecated by Clang and should not be used. I switched
> here to vector int.
> 3. Additionally, sys/platform/ppc.h is glibc-dependant and is not
> available in other libc's. Use the portable method of reading TBR when
> glibc is not used.  Taken from
> https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/powerpc/sys/platform/ppc.h
>
> Signed-off-by: Piotr Kubaj <pkubaj@FreeBSD.org>
> ---
>  app/test-bbdev/test_bbdev_vector.h            |  3 +
>  .../cperf_test_vector_parsing.h               |  3 +
>  app/test-crypto-perf/cperf_test_verify.c      |  3 +
>  drivers/net/bnxt/bnxt_irq.h                   |  3 +
>  drivers/net/i40e/i40e_rxtx_vec_altivec.c      | 70 +++++++++----------
>  drivers/net/ixgbe/ixgbe_ethdev.c              |  3 +
>  drivers/net/ixgbe/ixgbe_rxtx.c                |  3 +
>  drivers/net/txgbe/txgbe_ethdev.c              |  3 +
>  lib/librte_eal/ppc/include/rte_altivec.h      |  3 +
>  lib/librte_eal/ppc/include/rte_cycles.h       |  8 +++
>  10 files changed, 67 insertions(+), 35 deletions(-)
>
> diff --git a/app/test-bbdev/test_bbdev_vector.h b/app/test-bbdev/test_bbdev_vector.h
> index 4e5dbf5d5..665443fa8 100644
> --- a/app/test-bbdev/test_bbdev_vector.h
> +++ b/app/test-bbdev/test_bbdev_vector.h
> @@ -71,6 +71,9 @@ struct test_bbdev_vector {
>  };
>
>  /* fills test vector parameters based on test file */
> +#if defined(__clang__) && defined(__powerpc64__)
> +#undef vector
> +#endif
>  int
>  test_bbdev_vector_read(const char *filename,
>                 struct test_bbdev_vector *vector);
> diff --git a/app/test-crypto-perf/cperf_test_vector_parsing.h b/app/test-crypto-perf/cperf_test_vector_parsing.h
> index 247b14221..76a86cea5 100644
> --- a/app/test-crypto-perf/cperf_test_vector_parsing.h
> +++ b/app/test-crypto-perf/cperf_test_vector_parsing.h
> @@ -18,6 +18,9 @@
>   * @return
>   *   0 on success, (-1) on error.
>   */
> +#if defined(__clang__) && defined(__powerpc64__)
> +#undef vector
> +#endif
>  int
>  free_test_vector(struct cperf_test_vector *vector, struct cperf_options *opts);
>
> diff --git a/app/test-crypto-perf/cperf_test_verify.c b/app/test-crypto-perf/cperf_test_verify.c
> index 2939aeaa9..14010a5a2 100644
> --- a/app/test-crypto-perf/cperf_test_verify.c
> +++ b/app/test-crypto-perf/cperf_test_verify.c
> @@ -91,6 +91,9 @@ cperf_verify_test_constructor(struct rte_mempool *sess_mp,
>         return NULL;
>  }
>
> +#if defined(__clang__) && defined(__powerpc64__)
> +#undef vector
> +#endif
>  static int
>  cperf_verify_op(struct rte_crypto_op *op,
>                 const struct cperf_options *options,
> diff --git a/drivers/net/bnxt/bnxt_irq.h b/drivers/net/bnxt/bnxt_irq.h
> index 7b02f3097..59a9c4224 100644
> --- a/drivers/net/bnxt/bnxt_irq.h
> +++ b/drivers/net/bnxt/bnxt_irq.h
> @@ -8,6 +8,9 @@
>
>  struct bnxt_irq {
>         rte_intr_callback_fn    handler;
> +#if defined(__clang__) && defined(__powerpc64__)
> +#undef vector
> +#endif
For bnxt PMD, I can submit a patch to rename vector.
Thanks for bringing this up.

>         unsigned int            vector;
>         uint8_t                 requested;
>         char                    name[RTE_ETH_NAME_MAX_LEN + 2];
> diff --git a/drivers/net/i40e/i40e_rxtx_vec_altivec.c b/drivers/net/i40e/i40e_rxtx_vec_altivec.c
> index 1ad74646d..d4230a68b 100644
> --- a/drivers/net/i40e/i40e_rxtx_vec_altivec.c
> +++ b/drivers/net/i40e/i40e_rxtx_vec_altivec.c
> @@ -27,10 +27,10 @@ i40e_rxq_rearm(struct i40e_rx_queue *rxq)
>         struct i40e_rx_entry *rxep = &rxq->sw_ring[rxq->rxrearm_start];
>         struct rte_mbuf *mb0, *mb1;
>
> -       vector unsigned long hdr_room = (vector unsigned long){
> +       vector unsigned int hdr_room = (vector unsigned int){
>                                                 RTE_PKTMBUF_HEADROOM,
>                                                 RTE_PKTMBUF_HEADROOM};
> -       vector unsigned long dma_addr0, dma_addr1;
> +       vector unsigned int dma_addr0, dma_addr1;
>
>         rxdp = rxq->rx_ring + rxq->rxrearm_start;
>
> @@ -40,11 +40,11 @@ i40e_rxq_rearm(struct i40e_rx_queue *rxq)
>                                  RTE_I40E_RXQ_REARM_THRESH) < 0) {
>                 if (rxq->rxrearm_nb + RTE_I40E_RXQ_REARM_THRESH >=
>                     rxq->nb_rx_desc) {
> -                       dma_addr0 = (vector unsigned long){};
> +                       dma_addr0 = (vector unsigned int){};
>                         for (i = 0; i < RTE_I40E_DESCS_PER_LOOP; i++) {
>                                 rxep[i].mbuf = &rxq->fake_mbuf;
>                                 vec_st(dma_addr0, 0,
> -                                      (vector unsigned long *)&rxdp[i].read);
> +                                      (vector unsigned int *)&rxdp[i].read);
>                         }
>                 }
>                 rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed +=
> @@ -54,7 +54,7 @@ i40e_rxq_rearm(struct i40e_rx_queue *rxq)
>
>         /* Initialize the mbufs in vector, process 2 mbufs in one loop */
>         for (i = 0; i < RTE_I40E_RXQ_REARM_THRESH; i += 2, rxep += 2) {
> -               vector unsigned long vaddr0, vaddr1;
> +               vector unsigned int vaddr0, vaddr1;
>                 uintptr_t p0, p1;
>
>                 mb0 = rxep[0].mbuf;
> @@ -72,8 +72,8 @@ i40e_rxq_rearm(struct i40e_rx_queue *rxq)
>                 *(uint64_t *)p1 = rxq->mbuf_initializer;
>
>                 /* load buf_addr(lo 64bit) and buf_iova(hi 64bit) */
> -               vaddr0 = vec_ld(0, (vector unsigned long *)&mb0->buf_addr);
> -               vaddr1 = vec_ld(0, (vector unsigned long *)&mb1->buf_addr);
> +               vaddr0 = vec_ld(0, (vector unsigned int *)&mb0->buf_addr);
> +               vaddr1 = vec_ld(0, (vector unsigned int *)&mb1->buf_addr);
>
>                 /* convert pa to dma_addr hdr/data */
>                 dma_addr0 = vec_mergel(vaddr0, vaddr0);
> @@ -84,8 +84,8 @@ i40e_rxq_rearm(struct i40e_rx_queue *rxq)
>                 dma_addr1 = vec_add(dma_addr1, hdr_room);
>
>                 /* flush desc with pa dma_addr */
> -               vec_st(dma_addr0, 0, (vector unsigned long *)&rxdp++->read);
> -               vec_st(dma_addr1, 0, (vector unsigned long *)&rxdp++->read);
> +               vec_st(dma_addr0, 0, (vector unsigned int *)&rxdp++->read);
> +               vec_st(dma_addr1, 0, (vector unsigned int *)&rxdp++->read);
>         }
>
>         rxq->rxrearm_start += RTE_I40E_RXQ_REARM_THRESH;
> @@ -102,7 +102,7 @@ i40e_rxq_rearm(struct i40e_rx_queue *rxq)
>  }
>
>  static inline void
> -desc_to_olflags_v(vector unsigned long descs[4], struct rte_mbuf **rx_pkts)
> +desc_to_olflags_v(vector unsigned int descs[4], struct rte_mbuf **rx_pkts)
>  {
>         vector unsigned int vlan0, vlan1, rss, l3_l4e;
>
> @@ -169,14 +169,14 @@ desc_to_olflags_v(vector unsigned long descs[4], struct rte_mbuf **rx_pkts)
>  #define PKTLEN_SHIFT     10
>
>  static inline void
> -desc_to_ptype_v(vector unsigned long descs[4], struct rte_mbuf **rx_pkts,
> +desc_to_ptype_v(vector unsigned int descs[4], struct rte_mbuf **rx_pkts,
>                 uint32_t *ptype_tbl)
>  {
> -       vector unsigned long ptype0 = vec_mergel(descs[0], descs[1]);
> -       vector unsigned long ptype1 = vec_mergel(descs[2], descs[3]);
> +       vector unsigned int ptype0 = vec_mergel(descs[0], descs[1]);
> +       vector unsigned int ptype1 = vec_mergel(descs[2], descs[3]);
>
> -       ptype0 = vec_sr(ptype0, (vector unsigned long){30, 30});
> -       ptype1 = vec_sr(ptype1, (vector unsigned long){30, 30});
> +       ptype0 = vec_sr(ptype0, (vector unsigned int){30, 30});
> +       ptype1 = vec_sr(ptype1, (vector unsigned int){30, 30});
>
>         rx_pkts[0]->packet_type =
>                 ptype_tbl[(*(vector unsigned char *)&ptype0)[0]];
> @@ -214,7 +214,7 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
>                 rxq->crc_len, /* sub crc on data_len */
>                 0, 0, 0       /* ignore non-length fields */
>                 };
> -       vector unsigned long dd_check, eop_check;
> +       vector unsigned int dd_check, eop_check;
>
>         /* nb_pkts has to be floor-aligned to RTE_I40E_DESCS_PER_LOOP */
>         nb_pkts = RTE_ALIGN_FLOOR(nb_pkts, RTE_I40E_DESCS_PER_LOOP);
> @@ -240,11 +240,11 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
>                 return 0;
>
>         /* 4 packets DD mask */
> -       dd_check = (vector unsigned long){0x0000000100000001ULL,
> +       dd_check = (vector unsigned int){0x0000000100000001ULL,
>                                           0x0000000100000001ULL};
>
>         /* 4 packets EOP mask */
> -       eop_check = (vector unsigned long){0x0000000200000002ULL,
> +       eop_check = (vector unsigned int){0x0000000200000002ULL,
>                                            0x0000000200000002ULL};
>
>         /* mask to shuffle from desc. to mbuf */
> @@ -274,35 +274,35 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
>         for (pos = 0, nb_pkts_recd = 0; pos < nb_pkts;
>                         pos += RTE_I40E_DESCS_PER_LOOP,
>                         rxdp += RTE_I40E_DESCS_PER_LOOP) {
> -               vector unsigned long descs[RTE_I40E_DESCS_PER_LOOP];
> +               vector unsigned int descs[RTE_I40E_DESCS_PER_LOOP];
>                 vector unsigned char pkt_mb1, pkt_mb2, pkt_mb3, pkt_mb4;
>                 vector unsigned short staterr, sterr_tmp1, sterr_tmp2;
> -               vector unsigned long mbp1, mbp2; /* two mbuf pointer
> +               vector unsigned int mbp1, mbp2; /* two mbuf pointer
>                                                   * in one XMM reg.
>                                                   */
>
>                 /* B.1 load 1 mbuf point */
> -               mbp1 = *(vector unsigned long *)&sw_ring[pos];
> +               mbp1 = *(vector unsigned int *)&sw_ring[pos];
>                 /* Read desc statuses backwards to avoid race condition */
>                 /* A.1 load 4 pkts desc */
> -               descs[3] = *(vector unsigned long *)(rxdp + 3);
> +               descs[3] = *(vector unsigned int *)(rxdp + 3);
>                 rte_compiler_barrier();
>
>                 /* B.2 copy 2 mbuf point into rx_pkts  */
> -               *(vector unsigned long *)&rx_pkts[pos] = mbp1;
> +               *(vector unsigned int *)&rx_pkts[pos] = mbp1;
>
>                 /* B.1 load 1 mbuf point */
> -               mbp2 = *(vector unsigned long *)&sw_ring[pos + 2];
> +               mbp2 = *(vector unsigned int *)&sw_ring[pos + 2];
>
> -               descs[2] = *(vector unsigned long *)(rxdp + 2);
> +               descs[2] = *(vector unsigned int *)(rxdp + 2);
>                 rte_compiler_barrier();
>                 /* B.1 load 2 mbuf point */
> -               descs[1] = *(vector unsigned long *)(rxdp + 1);
> +               descs[1] = *(vector unsigned int *)(rxdp + 1);
>                 rte_compiler_barrier();
> -               descs[0] = *(vector unsigned long *)(rxdp);
> +               descs[0] = *(vector unsigned int *)(rxdp);
>
>                 /* B.2 copy 2 mbuf point into rx_pkts  */
> -               *(vector unsigned long *)&rx_pkts[pos + 2] =  mbp2;
> +               *(vector unsigned int *)&rx_pkts[pos + 2] =  mbp2;
>
>                 if (split_packet) {
>                         rte_mbuf_prefetch_part2(rx_pkts[pos]);
> @@ -324,8 +324,8 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
>                         (vector unsigned int){0, 0, 0, PKTLEN_SHIFT});
>
>                 /* merge the now-aligned packet length fields back in */
> -               descs[3] = (vector unsigned long)len3;
> -               descs[2] = (vector unsigned long)len2;
> +               descs[3] = (vector unsigned int)len3;
> +               descs[2] = (vector unsigned int)len2;
>
>                 /* D.1 pkt 3,4 convert format from desc to pktmbuf */
>                 pkt_mb4 = vec_perm((vector unsigned char)descs[3],
> @@ -354,8 +354,8 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
>                         (vector unsigned int){0, 0, 0, PKTLEN_SHIFT});
>
>                 /* merge the now-aligned packet length fields back in */
> -               descs[1] = (vector unsigned long)len1;
> -               descs[0] = (vector unsigned long)len0;
> +               descs[1] = (vector unsigned int)len1;
> +               descs[0] = (vector unsigned int)len0;
>
>                 /* D.1 pkt 1,2 convert format from desc to pktmbuf */
>                 pkt_mb2 = vec_perm((vector unsigned char)descs[1],
> @@ -432,7 +432,7 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
>
>                 /* C.4 calc avaialbe number of desc */
>                 var = __builtin_popcountll((vec_ld(0,
> -                       (vector unsigned long *)&staterr)[0]));
> +                       (vector unsigned int *)&staterr)[0]));
>                 nb_pkts_recd += var;
>                 if (likely(var != RTE_I40E_DESCS_PER_LOOP))
>                         break;
> @@ -533,9 +533,9 @@ vtx1(volatile struct i40e_tx_desc *txdp,
>                 ((uint64_t)flags  << I40E_TXD_QW1_CMD_SHIFT) |
>                 ((uint64_t)pkt->data_len << I40E_TXD_QW1_TX_BUF_SZ_SHIFT));
>
> -       vector unsigned long descriptor = (vector unsigned long){
> +       vector unsigned int descriptor = (vector unsigned int){
>                 pkt->buf_iova + pkt->data_off, high_qw};
> -       *(vector unsigned long *)txdp = descriptor;
> +       *(vector unsigned int *)txdp = descriptor;
>  }
>
>  static inline void
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
> index 761a0f26b..59ffe92ea 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -5597,6 +5597,9 @@ ixgbe_vt_check(struct ixgbe_hw *hw)
>  static uint32_t
>  ixgbe_uta_vector(struct ixgbe_hw *hw, struct rte_ether_addr *uc_addr)
>  {
> +#if defined(__clang__) && defined(__powerpc64__)
> +#undef vector
> +#endif
>         uint32_t vector = 0;
>
>         switch (hw->mac.mc_filter_type) {
> diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
> index 7d23bab29..88d71131e 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
> @@ -4740,6 +4740,9 @@ ixgbe_get_rscctl_maxdesc(struct rte_mempool *pool)
>   * @vector the MSIX vector for this queue
>   * @type RX/TX/MISC
>   */
> +#if defined(__clang__) && defined(__powerpc64__)
> +#undef vector
> +#endif
>  static void
>  ixgbe_set_ivar(struct rte_eth_dev *dev, u8 entry, u8 vector, s8 type)
>  {
> diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
> index 90137d0ce..2747246a1 100644
> --- a/drivers/net/txgbe/txgbe_ethdev.c
> +++ b/drivers/net/txgbe/txgbe_ethdev.c
> @@ -3382,6 +3382,9 @@ txgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
>  static uint32_t
>  txgbe_uta_vector(struct txgbe_hw *hw, struct rte_ether_addr *uc_addr)
>  {
> +#if defined(__clang__) && defined(__powerpc64__)
> +#undef vector
> +#endif
>         uint32_t vector = 0;
>
>         switch (hw->mac.mc_filter_type) {
> diff --git a/lib/librte_eal/ppc/include/rte_altivec.h b/lib/librte_eal/ppc/include/rte_altivec.h
> index 1551a9454..3fcc819c1 100644
> --- a/lib/librte_eal/ppc/include/rte_altivec.h
> +++ b/lib/librte_eal/ppc/include/rte_altivec.h
> @@ -7,6 +7,9 @@
>  #define _RTE_ALTIVEC_H_
>
>  /* To include altivec.h, GCC version must be >= 4.8 */
> +#ifdef __clang__
> +#define vector __vector
> +#endif
>  #include <altivec.h>
>
>  /*
> diff --git a/lib/librte_eal/ppc/include/rte_cycles.h b/lib/librte_eal/ppc/include/rte_cycles.h
> index 5585f9273..9925d1d0d 100644
> --- a/lib/librte_eal/ppc/include/rte_cycles.h
> +++ b/lib/librte_eal/ppc/include/rte_cycles.h
> @@ -10,7 +10,9 @@
>  extern "C" {
>  #endif
>
> +#ifdef __GLIBC__
>  #include <sys/platform/ppc.h>
> +#endif
>
>  #include "generic/rte_cycles.h"
>
> @@ -26,7 +28,13 @@ extern "C" {
>  static inline uint64_t
>  rte_rdtsc(void)
>  {
> +#ifdef __GLIBC__
>         return __ppc_get_timebase();
> +#else
> +       uint64_t __tb;
> +       __asm__ volatile ("mfspr %0, 268" : "=r" (__tb));
> +       return __tb;
> +#endif
>  }
>
>  static inline uint64_t
> --
> 2.30.1
>

  reply	other threads:[~2021-03-11 20:58 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-11 16:11 [dpdk-dev] [PATCH] ppc64le: fix build with Clang and without glibc Piotr Kubaj
2021-03-11 20:58 ` Ajit Khaparde [this message]
2021-03-15 19:48 ` David Christensen
2021-03-22 20:14   ` Piotr Kubaj
2021-03-22 23:42   ` Piotr Kubaj
2021-05-05 14:58     ` David Marchand
     [not found]       ` <YJMes69UJORrjT1G@KGPE-D16>
2021-05-07 20:28         ` David Christensen
2021-05-07 20:30         ` David Christensen
     [not found]           ` <YJXae53gvmmXwY4n@KGPE-D16>
2021-05-11 14:02             ` David Marchand

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CACZ4nhsJL2v1E=O_3mp3u0o9C0Q3cgenmbNC0Pt2F-UATfaiqg@mail.gmail.com' \
    --to=ajit.khaparde@broadcom.com \
    --cc=beilei.xing@intel.com \
    --cc=declan.doherty@intel.com \
    --cc=dev@dpdk.org \
    --cc=drc@linux.vnet.ibm.com \
    --cc=haiyue.wang@intel.com \
    --cc=jia.guo@intel.com \
    --cc=jianwang@trustnetic.com \
    --cc=jiawenwu@trustnetic.com \
    --cc=nicolas.chautru@intel.com \
    --cc=pkubaj@freebsd.org \
    --cc=somnath.kotur@broadcom.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.