> @@ -1701,12 +1696,8 @@ static inline void
>  rte_eth_linkstatus_get(const struct rte_eth_dev *dev,
>                      struct rte_eth_link *link)
>  {
> -     RTE_ATOMIC(uint64_t) *src = (uint64_t __rte_atomic *)&(dev->data-
> >dev_link);
> -     uint64_t *dst = (uint64_t *)link;
> -
> -     RTE_BUILD_BUG_ON(sizeof(*link) != sizeof(uint64_t));
> -
> -     *dst = rte_atomic_load_explicit(src, rte_memory_order_seq_cst);
> +     link->val64 = rte_atomic_load_explicit(&dev->data->dev_link.val64,
> +                                            rte_memory_order_seq_cst);
>  }

rte_eth_linkstatus_get() may be called by rte_eth_link_get():
https://elixir.bootlin.com/dpdk/v24.03/source/lib/ethdev/rte_ethdev.c#L2986

The application may call rte_eth_link_get() with the "link" parameter pointing 
to memory shared by other threads.

So link->val64 must be stored atomically:
rte_atomic_store_explicit(&link->val64,
                rte_atomic_load_explicit(&dev->data->dev_link.val64,
                rte_memory_order_seq_cst),
                rte_memory_order_seq_cst);

With the above modification,
Acked-by: Morten Brørup <m...@smartsharesystems.com>

Reply via email to