From patchwork Wed Sep 14 11:53:52 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?N=C3=A9lio_Laranjeiro?= X-Patchwork-Id: 15800 X-Patchwork-Delegate: bruce.richardson@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 118218E72; Wed, 14 Sep 2016 13:54:39 +0200 (CEST) Received: from mail-wm0-f54.google.com (mail-wm0-f54.google.com [74.125.82.54]) by dpdk.org (Postfix) with ESMTP id 2F5A88E5A for ; Wed, 14 Sep 2016 13:54:33 +0200 (CEST) Received: by mail-wm0-f54.google.com with SMTP id k186so1953898wmd.0 for ; Wed, 14 Sep 2016 04:54:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=xsRQdpPUv0kt06qyfOmBmqRqdMDQDpfYN5eyNq8CDgQ=; b=LIR+TmDGuplpJqjRctuJwEUgSH0gULHGPJDWCeIbcetC5tIADd5N6SIOFr6LbxBoeS iI4g7M57ZMfx4R53+IuC6ESHg6cU3h/fzGMD+3GdZvpOsRaP+mbO5sMituyC1vaKVp4G EKuLv4Tpx/TVwqZenZMQuinr6IYGfYiA3nuby994R07hX0Jw4voX8WdelrpajnrK//9h lnXpM4Er5ts2Jd3psP/yA/a/mH/UMFGN/XbVAfbMWnQz+wWgnuFEWPaNIuVqFiYOzPpV UUNf9v18E/wBGZm+oe/B3p1i887a6+paPPu5h46JLbzpgkkPESR0fdjd5DNrVe2mNE/n haug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=xsRQdpPUv0kt06qyfOmBmqRqdMDQDpfYN5eyNq8CDgQ=; b=WtsLVIYI96lomXhJTRDfMXxAmmMVJic/2yb4WTyfPXOyjwLJOqMA0zj/B5dlewH5y9 vp9vkRcpXCKroUlyY7Hzi1sBiHtKeJARZYjDegzzJHZw+civ98mtr0gF7a6uXuRpe9+E wyiF3TEPdHZmvP5hWsg5PNUh5ZYywtohwH2e5eXqqo89QfVU5/ZDxj7jxiei12Uhy8nF pP1a6i7SpMxYe3QTNo6QNo39dCn2hF68xEqEAUMJPEqmiuMSxpxWq76+75wvssDpi3Bf /klUnlFOxMJWGJIsKA67a+II4uD/N355HyWOTN0q/svInJM65Pl+PnT7vXKlHjJvsqoq UxMw== X-Gm-Message-State: AE9vXwOF4miAKmMMvuLKsXboFL/W+WzLsKlUAKQA1CqpIvZxe/2ruCRG4QpN4HzJz6mxp2Om X-Received: by 10.28.154.83 with SMTP id c80mr2903007wme.48.1473854072942; Wed, 14 Sep 2016 04:54:32 -0700 (PDT) Received: from ping.vm.6wind.com (guy78-3-82-239-227-177.fbx.proxad.net. [82.239.227.177]) by smtp.gmail.com with ESMTPSA id m133sm10417332wmg.0.2016.09.14.04.54.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 14 Sep 2016 04:54:32 -0700 (PDT) From: Nelio Laranjeiro To: dev@dpdk.org Cc: Yaacov Hazan , Adrien Mazarguil Date: Wed, 14 Sep 2016 13:53:52 +0200 Message-Id: <76d61db6eca37db111ab24bc5656805e917ff04f.1473851528.git.nelio.laranjeiro@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH V2 5/8] net/mlx5: fix support for flow director drop mode X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Yaacov Hazan Packet rejection was routed to a polled queue. This patch route them to a dummy queue which is not polled. Fixes: 76f5c99e6840 ("mlx5: support flow director") Signed-off-by: Yaacov Hazan Signed-off-by: Adrien Mazarguil Signed-off-by: Nelio Laranjeiro --- doc/guides/nics/mlx5.rst | 3 ++- drivers/net/mlx5/mlx5.h | 1 + drivers/net/mlx5/mlx5_fdir.c | 41 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst index 5c10cd3..8923173 100644 --- a/doc/guides/nics/mlx5.rst +++ b/doc/guides/nics/mlx5.rst @@ -84,7 +84,8 @@ Features - Promiscuous mode. - Multicast promiscuous mode. - Hardware checksum offloads. -- Flow director (RTE_FDIR_MODE_PERFECT and RTE_FDIR_MODE_PERFECT_MAC_VLAN). +- Flow director (RTE_FDIR_MODE_PERFECT, RTE_FDIR_MODE_PERFECT_MAC_VLAN and + RTE_ETH_FDIR_REJECT). - Secondary process TX is supported. - KVM and VMware ESX SR-IOV modes are supported. diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index fa78623..8349e5b 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -134,6 +134,7 @@ struct priv { unsigned int (*reta_idx)[]; /* RETA index table. */ unsigned int reta_idx_n; /* RETA index size. */ struct fdir_filter_list *fdir_filter_list; /* Flow director rules. */ + struct fdir_queue *fdir_drop_queue; /* Flow director drop queue. */ rte_spinlock_t lock; /* Lock for control functions. */ }; diff --git a/drivers/net/mlx5/mlx5_fdir.c b/drivers/net/mlx5/mlx5_fdir.c index 802669b..25c8c52 100644 --- a/drivers/net/mlx5/mlx5_fdir.c +++ b/drivers/net/mlx5/mlx5_fdir.c @@ -75,6 +75,7 @@ struct fdir_flow_desc { struct mlx5_fdir_filter { LIST_ENTRY(mlx5_fdir_filter) next; uint16_t queue; /* Queue assigned to if FDIR match. */ + enum rte_eth_fdir_behavior behavior; struct fdir_flow_desc desc; struct ibv_exp_flow *flow; }; @@ -567,6 +568,33 @@ priv_get_fdir_queue(struct priv *priv, uint16_t idx) } /** + * Get or flow director drop queue. Create it if it does not exist. + * + * @param priv + * Private structure. + * + * @return + * Flow director drop queue on success, NULL otherwise. + */ +static struct fdir_queue * +priv_get_fdir_drop_queue(struct priv *priv) +{ + struct fdir_queue *fdir_queue = priv->fdir_drop_queue; + + if (fdir_queue == NULL) { + unsigned int socket = SOCKET_ID_ANY; + + /* Select a known NUMA socket if possible. */ + if (priv->rxqs_n && (*priv->rxqs)[0]) + socket = container_of((*priv->rxqs)[0], + struct rxq_ctrl, rxq)->socket; + fdir_queue = priv_fdir_queue_create(priv, NULL, socket); + priv->fdir_drop_queue = fdir_queue; + } + return fdir_queue; +} + +/** * Enable flow director filter and create steering rules. * * @param priv @@ -588,7 +616,11 @@ priv_fdir_filter_enable(struct priv *priv, return 0; /* Get fdir_queue for specific queue. */ - fdir_queue = priv_get_fdir_queue(priv, mlx5_fdir_filter->queue); + if (mlx5_fdir_filter->behavior == RTE_ETH_FDIR_REJECT) + fdir_queue = priv_get_fdir_drop_queue(priv); + else + fdir_queue = priv_get_fdir_queue(priv, + mlx5_fdir_filter->queue); if (fdir_queue == NULL) { ERROR("failed to create flow director rxq for queue %d", @@ -707,6 +739,10 @@ priv_fdir_disable(struct priv *priv) priv_fdir_queue_destroy(priv, rxq_ctrl->fdir_queue); rxq_ctrl->fdir_queue = NULL; } + if (priv->fdir_drop_queue) { + priv_fdir_queue_destroy(priv, priv->fdir_drop_queue); + priv->fdir_drop_queue = NULL; + } } /** @@ -807,8 +843,9 @@ priv_fdir_filter_add(struct priv *priv, return err; } - /* Set queue. */ + /* Set action parameters. */ mlx5_fdir_filter->queue = fdir_filter->action.rx_queue; + mlx5_fdir_filter->behavior = fdir_filter->action.behavior; /* Convert to mlx5 filter descriptor. */ fdir_filter_to_flow_desc(fdir_filter,