[dpdk-dev,v2,18/30] net/mlx5: use flow to enable all multi mode
Checks
Commit Message
RSS hash configuration is currently ignored by the PMD, this commits
removes the RSS feature on promiscuous mode.
This functionality will be added in a later commit.
Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
---
drivers/net/mlx5/mlx5.h | 1 -
drivers/net/mlx5/mlx5_rxmode.c | 52 ++++++++++++++---------------------------
drivers/net/mlx5/mlx5_rxq.c | 7 ++----
drivers/net/mlx5/mlx5_rxtx.h | 3 ---
drivers/net/mlx5/mlx5_trigger.c | 2 ++
5 files changed, 22 insertions(+), 43 deletions(-)
Comments
On Thu, Oct 05, 2017 at 02:49:50PM +0200, Nelio Laranjeiro wrote:
> RSS hash configuration is currently ignored by the PMD, this commits
> removes the RSS feature on promiscuous mode.
A mistake? "promiscuous" -> "all multi"
>
> This functionality will be added in a later commit.
>
> Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> ---
Acked-by: Yongseok Koh <yskoh@mellanox.com>
Thanks
@@ -108,7 +108,6 @@ struct priv {
/* Device properties. */
uint16_t mtu; /* Configured MTU. */
uint8_t port; /* Physical port number. */
- unsigned int allmulti_req:1; /* All multicast mode requested. */
unsigned int hw_csum:1; /* Checksum offload is supported. */
unsigned int hw_csum_l2tun:1; /* Same for L2 tunnels. */
unsigned int hw_vlan_strip:1; /* VLAN stripping is supported. */
@@ -53,18 +53,6 @@
/* Initialization data for special flows. */
static const struct special_flow_init special_flow_init[] = {
- [HASH_RXQ_FLOW_TYPE_ALLMULTI] = {
- .dst_mac_val = "\x01\x00\x00\x00\x00\x00",
- .dst_mac_mask = "\x01\x00\x00\x00\x00\x00",
- .hash_types =
- 1 << HASH_RXQ_UDPV4 |
- 1 << HASH_RXQ_IPV4 |
- 1 << HASH_RXQ_UDPV6 |
- 1 << HASH_RXQ_IPV6 |
- 1 << HASH_RXQ_ETH |
- 0,
- .per_vlan = 0,
- },
[HASH_RXQ_FLOW_TYPE_BROADCAST] = {
.dst_mac_val = "\xff\xff\xff\xff\xff\xff",
.dst_mac_mask = "\xff\xff\xff\xff\xff\xff",
@@ -332,7 +320,7 @@ priv_special_flow_enable_all(struct priv *priv)
if (priv->isolated)
return 0;
- for (flow_type = HASH_RXQ_FLOW_TYPE_ALLMULTI;
+ for (flow_type = HASH_RXQ_FLOW_TYPE_BROADCAST;
flow_type != HASH_RXQ_FLOW_TYPE_MAC;
++flow_type) {
int ret;
@@ -359,7 +347,7 @@ priv_special_flow_disable_all(struct priv *priv)
{
enum hash_rxq_flow_type flow_type;
- for (flow_type = HASH_RXQ_FLOW_TYPE_ALLMULTI;
+ for (flow_type = HASH_RXQ_FLOW_TYPE_BROADCAST;
flow_type != HASH_RXQ_FLOW_TYPE_MAC;
++flow_type)
priv_special_flow_disable(priv, flow_type);
@@ -416,19 +404,17 @@ mlx5_promiscuous_disable(struct rte_eth_dev *dev)
void
mlx5_allmulticast_enable(struct rte_eth_dev *dev)
{
- struct priv *priv = dev->data->dev_private;
- int ret;
+ struct rte_flow_item_eth eth = {
+ .dst.addr_bytes = "\x01\x00\x00\x00\x00\x00",
+ .src.addr_bytes = "\x01\x00\x00\x00\x00\x00",
+ .type = 0,
+ };
if (mlx5_is_secondary())
return;
-
- priv_lock(priv);
- priv->allmulti_req = 1;
- ret = priv_rehash_flows(priv);
- if (ret)
- ERROR("error while enabling allmulticast mode: %s",
- strerror(ret));
- priv_unlock(priv);
+ dev->data->all_multicast = 1;
+ if (dev->data->dev_started)
+ claim_zero(mlx5_ctrl_flow(dev, ð, ð, 1));
}
/**
@@ -440,17 +426,15 @@ mlx5_allmulticast_enable(struct rte_eth_dev *dev)
void
mlx5_allmulticast_disable(struct rte_eth_dev *dev)
{
- struct priv *priv = dev->data->dev_private;
- int ret;
+ struct rte_flow_item_eth eth = {
+ .dst.addr_bytes = "\x01\x00\x00\x00\x00\x00",
+ .src.addr_bytes = "\x01\x00\x00\x00\x00\x00",
+ .type = 0,
+ };
if (mlx5_is_secondary())
return;
-
- priv_lock(priv);
- priv->allmulti_req = 0;
- ret = priv_rehash_flows(priv);
- if (ret)
- ERROR("error while disabling allmulticast mode: %s",
- strerror(ret));
- priv_unlock(priv);
+ dev->data->all_multicast = 0;
+ if (dev->data->dev_started)
+ claim_zero(mlx5_ctrl_flow(dev, ð, ð, 0));
}
@@ -571,16 +571,13 @@ priv_destroy_hash_rxqs(struct priv *priv)
int
priv_allow_flow_type(struct priv *priv, enum hash_rxq_flow_type type)
{
+ (void)priv;
switch (type) {
- case HASH_RXQ_FLOW_TYPE_ALLMULTI:
- return !!priv->allmulti_req;
case HASH_RXQ_FLOW_TYPE_BROADCAST:
case HASH_RXQ_FLOW_TYPE_IPV6MULTI:
- /* If allmulti is enabled, broadcast and ipv6multi
- * are unnecessary. */
- return !priv->allmulti_req;
case HASH_RXQ_FLOW_TYPE_MAC:
return 1;
+ return 1;
default:
/* Unsupported flow type is not allowed. */
return 0;
@@ -237,7 +237,6 @@ struct special_flow_init {
};
enum hash_rxq_flow_type {
- HASH_RXQ_FLOW_TYPE_ALLMULTI,
HASH_RXQ_FLOW_TYPE_BROADCAST,
HASH_RXQ_FLOW_TYPE_IPV6MULTI,
HASH_RXQ_FLOW_TYPE_MAC,
@@ -248,8 +247,6 @@ static inline const char *
hash_rxq_flow_type_str(enum hash_rxq_flow_type flow_type)
{
switch (flow_type) {
- case HASH_RXQ_FLOW_TYPE_ALLMULTI:
- return "allmulticast";
case HASH_RXQ_FLOW_TYPE_BROADCAST:
return "broadcast";
case HASH_RXQ_FLOW_TYPE_IPV6MULTI:
@@ -165,6 +165,8 @@ mlx5_dev_start(struct rte_eth_dev *dev)
}
if (dev->data->promiscuous)
mlx5_promiscuous_enable(dev);
+ else if (dev->data->all_multicast)
+ mlx5_allmulticast_enable(dev);
err = priv_flow_start(priv, &priv->ctrl_flows);
if (err) {
ERROR("%p: an error occurred while configuring control flows:"