[10/10] net/mlx5: reorganize rte flow structure
Checks
Commit Message
Currently, the rte flow structure is not fully aligned and has some
bits wasted. The members can be optimized and reorganized to save
memory.
1. The drv_type uses only limited bits, change the type to 2 bits what
it needs.
2. Align the hairpin_flow_id, drv_type, fdir, copy_applied to 32 bits.
As hairpin never uses the full 32 bits.
3. The RSS queue number type is 16 bits, combine it with the 16 bits
meter id has a better organize for the struct.
4. __rte_packed helps tight up the structure memory layout.
The optimization totally helps save 20 bytes for the structure.
Signed-off-by: Suanming Mou <suanmingm@mellanox.com>
---
drivers/net/mlx5/mlx5.c | 3 ++-
drivers/net/mlx5/mlx5_flow.h | 19 +++++++++++--------
2 files changed, 13 insertions(+), 9 deletions(-)
@@ -764,7 +764,8 @@ struct mlx5_flow_id_pool *
goto error;
}
}
- sh->flow_id_pool = mlx5_flow_id_pool_alloc(UINT32_MAX);
+ sh->flow_id_pool = mlx5_flow_id_pool_alloc
+ ((1 << HAIRPIN_FLOW_ID_BITS) - 1);
if (!sh->flow_id_pool) {
DRV_LOG(ERR, "can't create flow id pool");
err = ENOMEM;
@@ -760,22 +760,25 @@ struct mlx5_fdir_flow {
struct rte_flow *flow; /* Pointer to flow. */
};
+#define HAIRPIN_FLOW_ID_BITS 28
+
/* Flow structure. */
struct rte_flow {
TAILQ_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. */
- enum mlx5_flow_drv_type drv_type; /**< Driver type. */
- struct mlx5_flow_rss_queue rss; /**< RSS queue context. */
- uint32_t counter; /**< Holds flow counter. */
- uint32_t mreg_copy;
- /**< Index to metadata register copy table resource. */
- uint16_t meter; /**< Holds flow meter id. */
uint32_t dev_handles;
/**< Device flow handles that are part of the flow. */
+ uint32_t drv_type:2; /**< Driver type. */
uint32_t fdir:1; /**< Identifier of associated FDIR if any. */
- uint32_t hairpin_flow_id; /**< The flow id used for hairpin. */
+ uint32_t hairpin_flow_id:HAIRPIN_FLOW_ID_BITS;
+ /**< The flow id used for hairpin. */
uint32_t copy_applied:1; /**< The MARK copy Flow os applied. */
+ uint32_t mreg_copy;
+ /**< Index to metadata register copy table resource. */
+ uint32_t counter; /**< Holds flow counter. */
+ uint16_t meter; /**< Holds flow meter id. */
+ struct mlx5_flow_rss_queue rss; /**< RSS queue context. */
uint32_t idx; /**< Index to the rte flow allocated from indexed pool. */
-};
+} __rte_packed;
typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev,
const struct rte_flow_attr *attr,