[PATCH v6 11/39] ethdev: use C11 alignas
Konstantin Ananyev
konstantin.ananyev at huawei.com
Tue Feb 27 10:39:16 CET 2024
> 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 <roretzla at linux.microsoft.com>
> Acked-by: Morten Brørup <mb at 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.ananyev at huawei.com>
> 1.8.3.1
More information about the dev
mailing list