> Subject: [PATCH v6 11/39] ethdev: use C11 alignas
> 
> The current location used for __rte_aligned(a) for alignment of types
> and variables is not compatible with MSVC. There is only a single
> location accepted by both toolchains.
> 
> For variables standard C11 offers alignas(a) supported by conformant
> compilers i.e. both MSVC and GCC.
> 
> For types the standard offers no alignment facility that compatibly
> interoperates with C and C++ but may be achieved by relocating the
> placement of __rte_aligned(a) to the aforementioned location accepted
> by all currently supported toolchains.
> 
> To allow alignment for both compilers do the following:
> 
> * Move __rte_aligned from the end of {struct,union} definitions to
>   be between {struct,union} and tag.
> 
>   The placement between {struct,union} and the tag allows the desired
>   alignment to be imparted on the type regardless of the toolchain being
>   used for all of GCC, LLVM, MSVC compilers building both C and C++.
> 
> * Replace use of __rte_aligned(a) on variables/fields with alignas(a).
> 
> Signed-off-by: Tyler Retzlaff <roret...@linux.microsoft.com>
> Acked-by: Morten Brørup <m...@smartsharesystems.com>
> ---
>  lib/ethdev/ethdev_driver.h   |  8 ++++----
>  lib/ethdev/rte_ethdev.h      | 16 ++++++++--------
>  lib/ethdev/rte_ethdev_core.h |  4 ++--
>  lib/ethdev/rte_flow_driver.h |  4 ++--
>  4 files changed, 16 insertions(+), 16 deletions(-)
> 
> diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
> index 0e4c1f0..bab3a8c 100644
> --- a/lib/ethdev/ethdev_driver.h
> +++ b/lib/ethdev/ethdev_driver.h
> @@ -48,7 +48,7 @@ struct rte_eth_rxtx_callback {
>   * memory. This split allows the function pointer and driver data to be per-
>   * process, while the actual configuration data for the device is shared.
>   */
> -struct rte_eth_dev {
> +struct __rte_cache_aligned rte_eth_dev {
>       eth_rx_burst_t rx_pkt_burst; /**< Pointer to PMD receive function */
>       eth_tx_burst_t tx_pkt_burst; /**< Pointer to PMD transmit function */
> 
> @@ -93,7 +93,7 @@ struct rte_eth_dev {
> 
>       enum rte_eth_dev_state state; /**< Flag indicating the port state */
>       void *security_ctx; /**< Context for security ops */
> -} __rte_cache_aligned;
> +};
> 
>  struct rte_eth_dev_sriov;
>  struct rte_eth_dev_owner;
> @@ -104,7 +104,7 @@ struct rte_eth_dev {
>   * device. This structure is safe to place in shared memory to be common
>   * among different processes in a multi-process configuration.
>   */
> -struct rte_eth_dev_data {
> +struct __rte_cache_aligned rte_eth_dev_data {
>       char name[RTE_ETH_NAME_MAX_LEN]; /**< Unique identifier name */
> 
>       void **rx_queues; /**< Array of pointers to Rx queues */
> @@ -190,7 +190,7 @@ struct rte_eth_dev_data {
>       uint16_t backer_port_id;
> 
>       pthread_mutex_t flow_ops_mutex; /**< rte_flow ops mutex */
> -} __rte_cache_aligned;
> +};
> 
>  /**
>   * @internal
> diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
> index ed27360..2a92953 100644
> --- a/lib/ethdev/rte_ethdev.h
> +++ b/lib/ethdev/rte_ethdev.h
> @@ -333,12 +333,12 @@ struct rte_eth_stats {
>   * A structure used to retrieve link-level information of an Ethernet port.
>   */
>  __extension__
> -struct rte_eth_link {
> +struct __rte_aligned(8) rte_eth_link {
>       uint32_t link_speed;        /**< RTE_ETH_SPEED_NUM_ */
>       uint16_t link_duplex  : 1;  /**< RTE_ETH_LINK_[HALF/FULL]_DUPLEX */
>       uint16_t link_autoneg : 1;  /**< RTE_ETH_LINK_[AUTONEG/FIXED] */
>       uint16_t link_status  : 1;  /**< RTE_ETH_LINK_[DOWN/UP] */
> -} __rte_aligned(8);      /**< aligned for atomic64 read/write */
> +};      /**< aligned for atomic64 read/write */
> 
>  /**@{@name Link negotiation
>   * Constants used in link management.
> @@ -1836,7 +1836,7 @@ struct rte_eth_dev_info {
>   * Ethernet device Rx queue information structure.
>   * Used to retrieve information about configured queue.
>   */
> -struct rte_eth_rxq_info {
> +struct __rte_cache_min_aligned rte_eth_rxq_info {
>       struct rte_mempool *mp;     /**< mempool used by that queue. */
>       struct rte_eth_rxconf conf; /**< queue config parameters. */
>       uint8_t scattered_rx;       /**< scattered packets Rx supported. */
> @@ -1850,17 +1850,17 @@ struct rte_eth_rxq_info {
>        * Value 0 means that the threshold monitoring is disabled.
>        */
>       uint8_t avail_thresh;
> -} __rte_cache_min_aligned;
> +};
> 
>  /**
>   * Ethernet device Tx queue information structure.
>   * Used to retrieve information about configured queue.
>   */
> -struct rte_eth_txq_info {
> +struct __rte_cache_min_aligned rte_eth_txq_info {
>       struct rte_eth_txconf conf; /**< queue config parameters. */
>       uint16_t nb_desc;           /**< configured number of TXDs. */
>       uint8_t queue_state;        /**< one of RTE_ETH_QUEUE_STATE_*. */
> -} __rte_cache_min_aligned;
> +};
> 
>  /**
>   * @warning
> @@ -1870,7 +1870,7 @@ struct rte_eth_txq_info {
>   * Used to retrieve Rx queue information when Tx queue reusing mbufs and 
> moving
>   * them into Rx mbuf ring.
>   */
> -struct rte_eth_recycle_rxq_info {
> +struct __rte_cache_min_aligned rte_eth_recycle_rxq_info {
>       struct rte_mbuf **mbuf_ring; /**< mbuf ring of Rx queue. */
>       struct rte_mempool *mp;     /**< mempool of Rx queue. */
>       uint16_t *refill_head;      /**< head of Rx queue refilling mbufs. */
> @@ -1884,7 +1884,7 @@ struct rte_eth_recycle_rxq_info {
>        * Value 0 means that PMD drivers have no requirement for this.
>        */
>       uint16_t refill_requirement;
> -} __rte_cache_min_aligned;
> +};
> 
>  /* Generic Burst mode flag definition, values can be ORed. */
> 
> diff --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
> index a18f242..e55fb42 100644
> --- a/lib/ethdev/rte_ethdev_core.h
> +++ b/lib/ethdev/rte_ethdev_core.h
> @@ -84,7 +84,7 @@ struct rte_ethdev_qdata {
>   * On 64-bit systems contents of this structure occupy exactly two 64B lines.
>   * On 32-bit systems contents of this structure fits into one 64B line.
>   */
> -struct rte_eth_fp_ops {
> +struct __rte_cache_aligned rte_eth_fp_ops {
> 
>       /**@{*/
>       /**
> @@ -124,7 +124,7 @@ struct rte_eth_fp_ops {
>       uintptr_t reserved2[1];
>       /**@}*/
> 
> -} __rte_cache_aligned;
> +};
> 
>  extern struct rte_eth_fp_ops rte_eth_fp_ops[RTE_MAX_ETHPORTS];
> 
> diff --git a/lib/ethdev/rte_flow_driver.h b/lib/ethdev/rte_flow_driver.h
> index 3c702e3..506d126 100644
> --- a/lib/ethdev/rte_flow_driver.h
> +++ b/lib/ethdev/rte_flow_driver.h
> @@ -432,7 +432,7 @@ typedef int 
> (*rte_flow_async_action_list_handle_query_update_t)(
>   *
>   * Fast path async flow functions are held in a flat array, one entry per 
> ethdev.
>   */
> -struct rte_flow_fp_ops {
> +struct __rte_cache_aligned rte_flow_fp_ops {
>       rte_flow_async_create_t async_create;
>       rte_flow_async_create_by_index_t async_create_by_index;
>       rte_flow_async_actions_update_t async_actions_update;
> @@ -447,7 +447,7 @@ struct rte_flow_fp_ops {
>       rte_flow_async_action_list_handle_create_t 
> async_action_list_handle_create;
>       rte_flow_async_action_list_handle_destroy_t 
> async_action_list_handle_destroy;
>       rte_flow_async_action_list_handle_query_update_t 
> async_action_list_handle_query_update;
> -} __rte_cache_aligned;
> +};
> 
>  /**
>   * @internal
> --

Acked-by: Konstantin Ananyev <konstantin.anan...@huawei.com>
 

> 1.8.3.1

Reply via email to