X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fmlx5%2Fmlx5_vlan.c;h=290503acc5eb9632a6d0c32a613f1bc810d9f86b;hb=b142387b07600c320683255d237b9109299883d5;hp=fb52d8f0d529aa13a50b8acf129dd86ceba2969a;hpb=c12671e3b7a211e6aad1681842aaea24934da30e;p=dpdk.git diff --git a/drivers/net/mlx5/mlx5_vlan.c b/drivers/net/mlx5/mlx5_vlan.c index fb52d8f0d5..290503acc5 100644 --- a/drivers/net/mlx5/mlx5_vlan.c +++ b/drivers/net/mlx5/mlx5_vlan.c @@ -5,40 +5,19 @@ #include #include -#include #include #include - -/* - * Not needed by this file; included to work around the lack of off_t - * definition for mlx5dv.h with unpatched rdma-core versions. - */ -#include - -/* Verbs headers do not support -pedantic. */ -#ifdef PEDANTIC -#pragma GCC diagnostic ignored "-Wpedantic" -#endif -#include -#include -#ifdef PEDANTIC -#pragma GCC diagnostic error "-Wpedantic" -#endif - #include #include #include #include -#include -#include - #include "mlx5.h" #include "mlx5_autoconf.h" #include "mlx5_rxtx.h" -#include "mlx5_nl.h" #include "mlx5_utils.h" +#include "mlx5_devx.h" /** * DPDK callback to configure a VLAN filter. @@ -61,7 +40,7 @@ mlx5_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) DRV_LOG(DEBUG, "port %u %s VLAN filter ID %" PRIu16, dev->data->port_id, (on ? "enable" : "disable"), vlan_id); - assert(priv->vlan_filter_n <= RTE_DIM(priv->vlan_filter)); + MLX5_ASSERT(priv->vlan_filter_n <= RTE_DIM(priv->vlan_filter)); for (i = 0; (i != priv->vlan_filter_n); ++i) if (priv->vlan_filter[i] == vlan_id) break; @@ -71,7 +50,7 @@ mlx5_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) return -rte_errno; } if (i < priv->vlan_filter_n) { - assert(priv->vlan_filter_n != 0); + MLX5_ASSERT(priv->vlan_filter_n != 0); /* Enabling an existing VLAN filter has no effect. */ if (on) goto out; @@ -83,7 +62,7 @@ mlx5_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) (priv->vlan_filter_n - i)); priv->vlan_filter[priv->vlan_filter_n] = 0; } else { - assert(i == priv->vlan_filter_n); + MLX5_ASSERT(i == priv->vlan_filter_n); /* Disabling an unknown VLAN filter has no effect. */ if (!on) goto out; @@ -114,10 +93,6 @@ mlx5_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue, int on) struct mlx5_rxq_data *rxq = (*priv->rxqs)[queue]; struct mlx5_rxq_ctrl *rxq_ctrl = container_of(rxq, struct mlx5_rxq_ctrl, rxq); - struct ibv_wq_attr mod; - uint16_t vlan_offloads = - (on ? IBV_WQ_FLAGS_CVLAN_STRIPPING : 0) | - 0; int ret = 0; /* Validate hw support */ @@ -132,30 +107,14 @@ mlx5_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue, int on) dev->data->port_id, queue); return; } - DRV_LOG(DEBUG, "port %u set VLAN offloads 0x%x for port %uqueue %d", - dev->data->port_id, vlan_offloads, rxq->port_id, queue); + DRV_LOG(DEBUG, "port %u set VLAN stripping offloads %d for port %uqueue %d", + dev->data->port_id, on, rxq->port_id, queue); if (!rxq_ctrl->obj) { /* Update related bits in RX queue. */ rxq->vlan_strip = !!on; return; } - if (rxq_ctrl->obj->type == MLX5_RXQ_OBJ_TYPE_IBV) { - mod = (struct ibv_wq_attr){ - .attr_mask = IBV_WQ_ATTR_FLAGS, - .flags_mask = IBV_WQ_FLAGS_CVLAN_STRIPPING, - .flags = vlan_offloads, - }; - ret = mlx5_glue->modify_wq(rxq_ctrl->obj->wq, &mod); - } else if (rxq_ctrl->obj->type == MLX5_RXQ_OBJ_TYPE_DEVX_RQ) { - struct mlx5_devx_modify_rq_attr rq_attr; - - memset(&rq_attr, 0, sizeof(rq_attr)); - rq_attr.rq_state = MLX5_RQC_STATE_RDY; - rq_attr.state = MLX5_RQC_STATE_RDY; - rq_attr.vsd = (on ? 0 : 1); - rq_attr.modify_bitmask = MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_VSD; - ret = mlx5_devx_cmd_modify_rq(rxq_ctrl->obj->rq, &rq_attr); - } + ret = priv->obj_ops.rxq_obj_modify_vlan_strip(rxq_ctrl->obj, on); if (ret) { DRV_LOG(ERR, "port %u failed to modify object %d stripping " "mode: %s", dev->data->port_id, @@ -198,132 +157,3 @@ mlx5_vlan_offload_set(struct rte_eth_dev *dev, int mask) } return 0; } - -/* - * Release VLAN network device, created for VM workaround. - * - * @param[in] dev - * Ethernet device object, Netlink context provider. - * @param[in] vlan - * Object representing the network device to release. - */ -void mlx5_vlan_vmwa_release(struct rte_eth_dev *dev, - struct mlx5_vf_vlan *vlan) -{ - struct mlx5_priv *priv = dev->data->dev_private; - struct mlx5_nl_vlan_vmwa_context *vmwa = priv->vmwa_context; - struct mlx5_nl_vlan_dev *vlan_dev = &vmwa->vlan_dev[0]; - - assert(vlan->created); - assert(priv->vmwa_context); - if (!vlan->created || !vmwa) - return; - vlan->created = 0; - assert(vlan_dev[vlan->tag].refcnt); - if (--vlan_dev[vlan->tag].refcnt == 0 && - vlan_dev[vlan->tag].ifindex) { - mlx5_nl_vlan_vmwa_delete(vmwa, vlan_dev[vlan->tag].ifindex); - vlan_dev[vlan->tag].ifindex = 0; - } -} - -/** - * Acquire VLAN interface with specified tag for VM workaround. - * - * @param[in] dev - * Ethernet device object, Netlink context provider. - * @param[in] vlan - * Object representing the network device to acquire. - */ -void mlx5_vlan_vmwa_acquire(struct rte_eth_dev *dev, - struct mlx5_vf_vlan *vlan) -{ - struct mlx5_priv *priv = dev->data->dev_private; - struct mlx5_nl_vlan_vmwa_context *vmwa = priv->vmwa_context; - struct mlx5_nl_vlan_dev *vlan_dev = &vmwa->vlan_dev[0]; - - assert(!vlan->created); - assert(priv->vmwa_context); - if (vlan->created || !vmwa) - return; - if (vlan_dev[vlan->tag].refcnt == 0) { - assert(!vlan_dev[vlan->tag].ifindex); - vlan_dev[vlan->tag].ifindex = - mlx5_nl_vlan_vmwa_create(vmwa, vmwa->vf_ifindex, - vlan->tag); - } - if (vlan_dev[vlan->tag].ifindex) { - vlan_dev[vlan->tag].refcnt++; - vlan->created = 1; - } -} - -/* - * Create per ethernet device VLAN VM workaround context - */ -struct mlx5_nl_vlan_vmwa_context * -mlx5_vlan_vmwa_init(struct rte_eth_dev *dev, uint32_t ifindex) -{ - struct mlx5_priv *priv = dev->data->dev_private; - struct mlx5_dev_config *config = &priv->config; - struct mlx5_nl_vlan_vmwa_context *vmwa; - enum rte_hypervisor hv_type; - - /* Do not engage workaround over PF. */ - if (!config->vf) - return NULL; - /* Check whether there is desired virtual environment */ - hv_type = rte_hypervisor_get(); - switch (hv_type) { - case RTE_HYPERVISOR_UNKNOWN: - case RTE_HYPERVISOR_VMWARE: - /* - * The "white list" of configurations - * to engage the workaround. - */ - break; - default: - /* - * The configuration is not found in the "white list". - * We should not engage the VLAN workaround. - */ - return NULL; - } - vmwa = rte_zmalloc(__func__, sizeof(*vmwa), sizeof(uint32_t)); - if (!vmwa) { - DRV_LOG(WARNING, - "Can not allocate memory" - " for VLAN workaround context"); - return NULL; - } - vmwa->nl_socket = mlx5_nl_init(NETLINK_ROUTE); - if (vmwa->nl_socket < 0) { - DRV_LOG(WARNING, - "Can not create Netlink socket" - " for VLAN workaround context"); - rte_free(vmwa); - return NULL; - } - vmwa->nl_sn = random(); - vmwa->vf_ifindex = ifindex; - /* Cleanup for existing VLAN devices. */ - return vmwa; -} - -/* - * Destroy per ethernet device VLAN VM workaround context - */ -void mlx5_vlan_vmwa_exit(struct mlx5_nl_vlan_vmwa_context *vmwa) -{ - unsigned int i; - - /* Delete all remaining VLAN devices. */ - for (i = 0; i < RTE_DIM(vmwa->vlan_dev); i++) { - if (vmwa->vlan_dev[i].ifindex) - mlx5_nl_vlan_vmwa_delete(vmwa, - vmwa->vlan_dev[i].ifindex); - } - if (vmwa->nl_socket >= 0) - close(vmwa->nl_socket); - rte_free(vmwa); -}