* [dpdk-dev] [PATCH] net/mlx5: return RSS hash result in mbuf
2016-09-14 8:16 [dpdk-dev] [PATCH] net/mlx5: return RSS hash result in mbuf Nelio Laranjeiro
@ 2016-09-14 8:16 ` Nelio Laranjeiro
2016-09-23 9:15 ` Adrien Mazarguil
2016-09-27 14:11 ` Bruce Richardson
2016-09-27 14:53 ` [dpdk-dev] [PATCH v2] " Nelio Laranjeiro
` (2 subsequent siblings)
3 siblings, 2 replies; 12+ messages in thread
From: Nelio Laranjeiro @ 2016-09-14 8:16 UTC (permalink / raw)
To: dev; +Cc: Adrien Mazarguil
Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
---
drivers/net/mlx5/mlx5_rxq.c | 1 +
drivers/net/mlx5/mlx5_rxtx.c | 6 +++++-
drivers/net/mlx5/mlx5_rxtx.h | 2 ++
3 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index f6f4315..65c264b 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -926,6 +926,7 @@ rxq_ctrl_setup(struct rte_eth_dev *dev, struct rxq_ctrl *rxq_ctrl,
.rxq = {
.elts_n = log2above(desc),
.mp = mp,
+ .rss_hash = !!(priv->rxqs_n > 1),
},
};
struct ibv_exp_wq_attr mod;
diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
index b91b644..17ae5e4 100644
--- a/drivers/net/mlx5/mlx5_rxtx.c
+++ b/drivers/net/mlx5/mlx5_rxtx.c
@@ -1338,12 +1338,16 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
/* Update packet information. */
pkt->packet_type = 0;
pkt->ol_flags = 0;
+ if (rxq->rss_hash) {
+ pkt->hash.rss = ntohl(cqe->rx_hash_res);
+ pkt->ol_flags = PKT_RX_RSS_HASH;
+ }
if (rxq->csum | rxq->csum_l2tun | rxq->vlan_strip |
rxq->crc_present) {
if (rxq->csum) {
pkt->packet_type =
rxq_cq_to_pkt_type(cqe);
- pkt->ol_flags =
+ pkt->ol_flags |=
rxq_cq_to_ol_flags(rxq, cqe);
}
if (cqe->l4_hdr_type_etc &
diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
index 9828aef..e813f38 100644
--- a/drivers/net/mlx5/mlx5_rxtx.h
+++ b/drivers/net/mlx5/mlx5_rxtx.h
@@ -113,6 +113,8 @@ struct rxq {
unsigned int cqe_n:4; /* Log 2 of CQ elements. */
unsigned int elts_n:4; /* Log 2 of Mbufs. */
unsigned int port_id:8;
+ unsigned int rss_hash:1; /* RSS hash result is enabled. */
+ unsigned int :9; /* Remaining bits. */
volatile uint32_t *rq_db;
volatile uint32_t *cq_db;
uint16_t rq_ci;
--
2.1.4
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [dpdk-dev] [PATCH] net/mlx5: return RSS hash result in mbuf
2016-09-14 8:16 ` Nelio Laranjeiro
@ 2016-09-23 9:15 ` Adrien Mazarguil
2016-09-27 14:11 ` Bruce Richardson
1 sibling, 0 replies; 12+ messages in thread
From: Adrien Mazarguil @ 2016-09-23 9:15 UTC (permalink / raw)
To: Nelio Laranjeiro; +Cc: dev
On Wed, Sep 14, 2016 at 10:16:05AM +0200, Nelio Laranjeiro wrote:
> Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
Acked-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
> ---
> drivers/net/mlx5/mlx5_rxq.c | 1 +
> drivers/net/mlx5/mlx5_rxtx.c | 6 +++++-
> drivers/net/mlx5/mlx5_rxtx.h | 2 ++
> 3 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> index f6f4315..65c264b 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -926,6 +926,7 @@ rxq_ctrl_setup(struct rte_eth_dev *dev, struct rxq_ctrl *rxq_ctrl,
> .rxq = {
> .elts_n = log2above(desc),
> .mp = mp,
> + .rss_hash = !!(priv->rxqs_n > 1),
> },
> };
> struct ibv_exp_wq_attr mod;
> diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
> index b91b644..17ae5e4 100644
> --- a/drivers/net/mlx5/mlx5_rxtx.c
> +++ b/drivers/net/mlx5/mlx5_rxtx.c
> @@ -1338,12 +1338,16 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
> /* Update packet information. */
> pkt->packet_type = 0;
> pkt->ol_flags = 0;
> + if (rxq->rss_hash) {
> + pkt->hash.rss = ntohl(cqe->rx_hash_res);
> + pkt->ol_flags = PKT_RX_RSS_HASH;
> + }
> if (rxq->csum | rxq->csum_l2tun | rxq->vlan_strip |
> rxq->crc_present) {
> if (rxq->csum) {
> pkt->packet_type =
> rxq_cq_to_pkt_type(cqe);
> - pkt->ol_flags =
> + pkt->ol_flags |=
> rxq_cq_to_ol_flags(rxq, cqe);
> }
> if (cqe->l4_hdr_type_etc &
> diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
> index 9828aef..e813f38 100644
> --- a/drivers/net/mlx5/mlx5_rxtx.h
> +++ b/drivers/net/mlx5/mlx5_rxtx.h
> @@ -113,6 +113,8 @@ struct rxq {
> unsigned int cqe_n:4; /* Log 2 of CQ elements. */
> unsigned int elts_n:4; /* Log 2 of Mbufs. */
> unsigned int port_id:8;
> + unsigned int rss_hash:1; /* RSS hash result is enabled. */
> + unsigned int :9; /* Remaining bits. */
> volatile uint32_t *rq_db;
> volatile uint32_t *cq_db;
> uint16_t rq_ci;
> --
> 2.1.4
>
--
Adrien Mazarguil
6WIND
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [dpdk-dev] [PATCH] net/mlx5: return RSS hash result in mbuf
2016-09-14 8:16 ` Nelio Laranjeiro
2016-09-23 9:15 ` Adrien Mazarguil
@ 2016-09-27 14:11 ` Bruce Richardson
2016-09-27 14:29 ` Nélio Laranjeiro
1 sibling, 1 reply; 12+ messages in thread
From: Bruce Richardson @ 2016-09-27 14:11 UTC (permalink / raw)
To: Nelio Laranjeiro; +Cc: dev, Adrien Mazarguil
On Wed, Sep 14, 2016 at 10:16:05AM +0200, Nelio Laranjeiro wrote:
> Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> ---
> drivers/net/mlx5/mlx5_rxq.c | 1 +
> drivers/net/mlx5/mlx5_rxtx.c | 6 +++++-
> drivers/net/mlx5/mlx5_rxtx.h | 2 ++
> 3 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> index f6f4315..65c264b 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -926,6 +926,7 @@ rxq_ctrl_setup(struct rte_eth_dev *dev, struct rxq_ctrl *rxq_ctrl,
> .rxq = {
> .elts_n = log2above(desc),
> .mp = mp,
> + .rss_hash = !!(priv->rxqs_n > 1),
> },
Two comments on this:
1. I don't think the !! is needed, since this is a comparison which will result
in 0 or 1, rather than an int value that needs to be clamped to those values.
2. Why limit the use of RSS to when there is more than one RX queues? Sometimes
it might be useful to have a precomputed hash for a packet even when not
spreading packets among RX queues. For example, when using a single RX queue,
but doing a hash table lookup for each packet, the RSS value could be used
as the lookup hash.
/Bruce
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [dpdk-dev] [PATCH] net/mlx5: return RSS hash result in mbuf
2016-09-27 14:11 ` Bruce Richardson
@ 2016-09-27 14:29 ` Nélio Laranjeiro
0 siblings, 0 replies; 12+ messages in thread
From: Nélio Laranjeiro @ 2016-09-27 14:29 UTC (permalink / raw)
To: Bruce Richardson; +Cc: dev, Adrien Mazarguil
Hi Bruce,
On Tue, Sep 27, 2016 at 03:11:10PM +0100, Bruce Richardson wrote:
> On Wed, Sep 14, 2016 at 10:16:05AM +0200, Nelio Laranjeiro wrote:
> > Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> > ---
> > drivers/net/mlx5/mlx5_rxq.c | 1 +
> > drivers/net/mlx5/mlx5_rxtx.c | 6 +++++-
> > drivers/net/mlx5/mlx5_rxtx.h | 2 ++
> > 3 files changed, 8 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> > index f6f4315..65c264b 100644
> > --- a/drivers/net/mlx5/mlx5_rxq.c
> > +++ b/drivers/net/mlx5/mlx5_rxq.c
> > @@ -926,6 +926,7 @@ rxq_ctrl_setup(struct rte_eth_dev *dev, struct rxq_ctrl *rxq_ctrl,
> > .rxq = {
> > .elts_n = log2above(desc),
> > .mp = mp,
> > + .rss_hash = !!(priv->rxqs_n > 1),
> > },
>
> Two comments on this:
> 1. I don't think the !! is needed, since this is a comparison which will result
> in 0 or 1, rather than an int value that needs to be clamped to those values.
Ok for this one.
> 2. Why limit the use of RSS to when there is more than one RX queues? Sometimes
> it might be useful to have a precomputed hash for a packet even when not
> spreading packets among RX queues. For example, when using a single RX queue,
> but doing a hash table lookup for each packet, the RSS value could be used
> as the lookup hash.
>
> /Bruce
ConnectX-4 NICs does not return a hash value for a single queue as
software does not request RSS in this situation, that is why it is not
filled.
I will send a v2 to also fix a bug discovered since concerning the hash
result which is not retrieve from the right place when Completion Queue
Entry is compressed.
Regards,
--
Nélio Laranjeiro
6WIND
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v2] net/mlx5: return RSS hash result in mbuf
2016-09-14 8:16 [dpdk-dev] [PATCH] net/mlx5: return RSS hash result in mbuf Nelio Laranjeiro
2016-09-14 8:16 ` Nelio Laranjeiro
@ 2016-09-27 14:53 ` Nelio Laranjeiro
2016-09-27 17:03 ` Ferruh Yigit
2016-09-28 7:02 ` [dpdk-dev] [PATCH v3] " Nelio Laranjeiro
2016-09-28 12:11 ` [dpdk-dev] [PATCH v4] " Nelio Laranjeiro
3 siblings, 1 reply; 12+ messages in thread
From: Nelio Laranjeiro @ 2016-09-27 14:53 UTC (permalink / raw)
To: dev; +Cc: Bruce Richardson, Adrien Mazarguil
Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
---
doc/guides/nics/mlx5.rst | 1 +
drivers/net/mlx5/mlx5_rxq.c | 1 +
drivers/net/mlx5/mlx5_rxtx.c | 21 ++++++++++++++++-----
drivers/net/mlx5/mlx5_rxtx.h | 2 ++
4 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst
index 8923173..0d1fabb 100644
--- a/doc/guides/nics/mlx5.rst
+++ b/doc/guides/nics/mlx5.rst
@@ -88,6 +88,7 @@ Features
RTE_ETH_FDIR_REJECT).
- Secondary process TX is supported.
- KVM and VMware ESX SR-IOV modes are supported.
+- RSS hash result is supported.
Limitations
-----------
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index f6f4315..d32ad68 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -926,6 +926,7 @@ rxq_ctrl_setup(struct rte_eth_dev *dev, struct rxq_ctrl *rxq_ctrl,
.rxq = {
.elts_n = log2above(desc),
.mp = mp,
+ .rss_hash = priv->rxqs_n > 1,
},
};
struct ibv_exp_wq_attr mod;
diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
index e0ff47f..d3a427c 100644
--- a/drivers/net/mlx5/mlx5_rxtx.c
+++ b/drivers/net/mlx5/mlx5_rxtx.c
@@ -1128,6 +1128,8 @@ rxq_cq_to_pkt_type(volatile struct mlx5_cqe64 *cqe)
* Pointer to RX queue.
* @param cqe
* CQE to process.
+ * @param[out] rss_hash
+ * Packet RSS Hash result.
*
* @return
* Packet size in bytes (0 if there is none), -1 in case of completion
@@ -1135,7 +1137,7 @@ rxq_cq_to_pkt_type(volatile struct mlx5_cqe64 *cqe)
*/
static inline int
mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
- uint16_t cqe_cnt)
+ uint16_t cqe_cnt, uint32_t *rss_hash)
{
struct rxq_zip *zip = &rxq->zip;
uint16_t cqe_n = cqe_cnt + 1;
@@ -1148,6 +1150,7 @@ mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
(uintptr_t)(&(*rxq->cqes)[zip->ca & cqe_cnt].cqe64);
len = ntohl((*mc)[zip->ai & 7].byte_cnt);
+ *rss_hash = ntohl((*mc)[zip->ai & 7].rx_hash_result);
if ((++zip->ai & 7) == 0) {
/*
* Increment consumer index to skip the number of
@@ -1202,9 +1205,11 @@ mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
zip->cq_ci = rxq->cq_ci + zip->cqe_cnt;
/* Get packet size to return. */
len = ntohl((*mc)[0].byte_cnt);
+ *rss_hash = ntohl((*mc)[0].rx_hash_result);
zip->ai = 1;
} else {
len = ntohl(cqe->byte_cnt);
+ *rss_hash = ntohl(cqe->rx_hash_res);
}
/* Error while receiving packet. */
if (unlikely(MLX5_CQE_OPCODE(op_own) == MLX5_CQE_RESP_ERR))
@@ -1286,12 +1291,13 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
&(*rxq->cqes)[rxq->cq_ci & cqe_cnt].cqe64;
unsigned int i = 0;
unsigned int rq_ci = rxq->rq_ci << sges_n;
- int len;
while (pkts_n) {
unsigned int idx = rq_ci & wqe_cnt;
volatile struct mlx5_wqe_data_seg *wqe = &(*rxq->wqes)[idx];
struct rte_mbuf *rep = (*rxq->elts)[idx];
+ int len;
+ uint32_t rss_hash_res = 0;
if (pkt)
NEXT(seg) = rep;
@@ -1320,8 +1326,9 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
}
if (!pkt) {
cqe = &(*rxq->cqes)[rxq->cq_ci & cqe_cnt].cqe64;
- len = mlx5_rx_poll_len(rxq, cqe, cqe_cnt);
- if (len == 0) {
+ len = mlx5_rx_poll_len(rxq, cqe, cqe_cnt,
+ &rss_hash_res);
+ if (!len) {
rte_mbuf_refcnt_set(rep, 0);
__rte_mbuf_raw_free(rep);
break;
@@ -1338,12 +1345,16 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
/* Update packet information. */
pkt->packet_type = 0;
pkt->ol_flags = 0;
+ if (rxq->rss_hash) {
+ pkt->hash.rss = rss_hash_res;
+ pkt->ol_flags = PKT_RX_RSS_HASH;
+ }
if (rxq->csum | rxq->csum_l2tun | rxq->vlan_strip |
rxq->crc_present) {
if (rxq->csum) {
pkt->packet_type =
rxq_cq_to_pkt_type(cqe);
- pkt->ol_flags =
+ pkt->ol_flags |=
rxq_cq_to_ol_flags(rxq, cqe);
}
if (cqe->l4_hdr_type_etc &
diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
index 9828aef..e813f38 100644
--- a/drivers/net/mlx5/mlx5_rxtx.h
+++ b/drivers/net/mlx5/mlx5_rxtx.h
@@ -113,6 +113,8 @@ struct rxq {
unsigned int cqe_n:4; /* Log 2 of CQ elements. */
unsigned int elts_n:4; /* Log 2 of Mbufs. */
unsigned int port_id:8;
+ unsigned int rss_hash:1; /* RSS hash result is enabled. */
+ unsigned int :9; /* Remaining bits. */
volatile uint32_t *rq_db;
volatile uint32_t *cq_db;
uint16_t rq_ci;
--
2.1.4
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [dpdk-dev] [PATCH v2] net/mlx5: return RSS hash result in mbuf
2016-09-27 14:53 ` [dpdk-dev] [PATCH v2] " Nelio Laranjeiro
@ 2016-09-27 17:03 ` Ferruh Yigit
2016-09-28 7:01 ` Nélio Laranjeiro
0 siblings, 1 reply; 12+ messages in thread
From: Ferruh Yigit @ 2016-09-27 17:03 UTC (permalink / raw)
To: Nelio Laranjeiro, dev; +Cc: Bruce Richardson, Adrien Mazarguil
On 9/27/2016 3:53 PM, Nelio Laranjeiro wrote:
> Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
<...>
> @@ -1286,12 +1291,13 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
> &(*rxq->cqes)[rxq->cq_ci & cqe_cnt].cqe64;
> unsigned int i = 0;
> unsigned int rq_ci = rxq->rq_ci << sges_n;
> - int len;
>
> while (pkts_n) {
> unsigned int idx = rq_ci & wqe_cnt;
> volatile struct mlx5_wqe_data_seg *wqe = &(*rxq->wqes)[idx];
> struct rte_mbuf *rep = (*rxq->elts)[idx];
> + int len;
clang generates following warning, -it is quite detailed compiler message:
.../drivers/net/mlx5/mlx5_rxtx.c:1327:7: error: variable 'len' is used
uninitialized whenever 'if' condition is false
[-Werror,-Wsometimes-uninitialized]
if (!pkt) {
^~~~
.../drivers/net/mlx5/mlx5_rxtx.c:1384:7: note: uninitialized use occurs here
if (len > DATA_LEN(seg)) {
^~~
.../drivers/net/mlx5/mlx5_rxtx.c:1327:3: note: remove the 'if' if its
condition is always true
if (!pkt) {
^~~~~~~~~~
.../drivers/net/mlx5/mlx5_rxtx.c:1299:10: note: initialize the variable
'len' to silence this warning
int len;
^
= 0
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [dpdk-dev] [PATCH v2] net/mlx5: return RSS hash result in mbuf
2016-09-27 17:03 ` Ferruh Yigit
@ 2016-09-28 7:01 ` Nélio Laranjeiro
0 siblings, 0 replies; 12+ messages in thread
From: Nélio Laranjeiro @ 2016-09-28 7:01 UTC (permalink / raw)
To: Ferruh Yigit; +Cc: dev, Bruce Richardson, Adrien Mazarguil
On Tue, Sep 27, 2016 at 06:03:51PM +0100, Ferruh Yigit wrote:
> On 9/27/2016 3:53 PM, Nelio Laranjeiro wrote:
> > Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
>
> <...>
>
> > @@ -1286,12 +1291,13 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
> > &(*rxq->cqes)[rxq->cq_ci & cqe_cnt].cqe64;
> > unsigned int i = 0;
> > unsigned int rq_ci = rxq->rq_ci << sges_n;
> > - int len;
> >
> > while (pkts_n) {
> > unsigned int idx = rq_ci & wqe_cnt;
> > volatile struct mlx5_wqe_data_seg *wqe = &(*rxq->wqes)[idx];
> > struct rte_mbuf *rep = (*rxq->elts)[idx];
> > + int len;
>
> clang generates following warning, -it is quite detailed compiler message:
>
> .../drivers/net/mlx5/mlx5_rxtx.c:1327:7: error: variable 'len' is used
> uninitialized whenever 'if' condition is false
> [-Werror,-Wsometimes-uninitialized]
> if (!pkt) {
> ^~~~
> .../drivers/net/mlx5/mlx5_rxtx.c:1384:7: note: uninitialized use occurs here
> if (len > DATA_LEN(seg)) {
> ^~~
> .../drivers/net/mlx5/mlx5_rxtx.c:1327:3: note: remove the 'if' if its
> condition is always true
> if (!pkt) {
> ^~~~~~~~~~
> .../drivers/net/mlx5/mlx5_rxtx.c:1299:10: note: initialize the variable
> 'len' to silence this warning
> int len;
> ^
> = 0
Right, my version of clang don't report this error, the one from
ubuntu does.
I will fix it in a v3.
Thanks Ferruh,
--
Nélio Laranjeiro
6WIND
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v3] net/mlx5: return RSS hash result in mbuf
2016-09-14 8:16 [dpdk-dev] [PATCH] net/mlx5: return RSS hash result in mbuf Nelio Laranjeiro
2016-09-14 8:16 ` Nelio Laranjeiro
2016-09-27 14:53 ` [dpdk-dev] [PATCH v2] " Nelio Laranjeiro
@ 2016-09-28 7:02 ` Nelio Laranjeiro
2016-09-28 8:59 ` Adrien Mazarguil
2016-09-28 12:11 ` [dpdk-dev] [PATCH v4] " Nelio Laranjeiro
3 siblings, 1 reply; 12+ messages in thread
From: Nelio Laranjeiro @ 2016-09-28 7:02 UTC (permalink / raw)
To: dev; +Cc: Adrien Mazarguil, Bruce Richardson, Ferruh Yigit
Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
---
doc/guides/nics/mlx5.rst | 1 +
drivers/net/mlx5/mlx5_rxq.c | 1 +
drivers/net/mlx5/mlx5_rxtx.c | 21 ++++++++++++++++-----
drivers/net/mlx5/mlx5_rxtx.h | 2 ++
4 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst
index 8923173..0d1fabb 100644
--- a/doc/guides/nics/mlx5.rst
+++ b/doc/guides/nics/mlx5.rst
@@ -88,6 +88,7 @@ Features
RTE_ETH_FDIR_REJECT).
- Secondary process TX is supported.
- KVM and VMware ESX SR-IOV modes are supported.
+- RSS hash result is supported.
Limitations
-----------
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index f6f4315..d32ad68 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -926,6 +926,7 @@ rxq_ctrl_setup(struct rte_eth_dev *dev, struct rxq_ctrl *rxq_ctrl,
.rxq = {
.elts_n = log2above(desc),
.mp = mp,
+ .rss_hash = priv->rxqs_n > 1,
},
};
struct ibv_exp_wq_attr mod;
diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
index e0ff47f..4491ae8 100644
--- a/drivers/net/mlx5/mlx5_rxtx.c
+++ b/drivers/net/mlx5/mlx5_rxtx.c
@@ -1128,6 +1128,8 @@ rxq_cq_to_pkt_type(volatile struct mlx5_cqe64 *cqe)
* Pointer to RX queue.
* @param cqe
* CQE to process.
+ * @param[out] rss_hash
+ * Packet RSS Hash result.
*
* @return
* Packet size in bytes (0 if there is none), -1 in case of completion
@@ -1135,7 +1137,7 @@ rxq_cq_to_pkt_type(volatile struct mlx5_cqe64 *cqe)
*/
static inline int
mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
- uint16_t cqe_cnt)
+ uint16_t cqe_cnt, uint32_t *rss_hash)
{
struct rxq_zip *zip = &rxq->zip;
uint16_t cqe_n = cqe_cnt + 1;
@@ -1148,6 +1150,7 @@ mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
(uintptr_t)(&(*rxq->cqes)[zip->ca & cqe_cnt].cqe64);
len = ntohl((*mc)[zip->ai & 7].byte_cnt);
+ *rss_hash = ntohl((*mc)[zip->ai & 7].rx_hash_result);
if ((++zip->ai & 7) == 0) {
/*
* Increment consumer index to skip the number of
@@ -1202,9 +1205,11 @@ mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
zip->cq_ci = rxq->cq_ci + zip->cqe_cnt;
/* Get packet size to return. */
len = ntohl((*mc)[0].byte_cnt);
+ *rss_hash = ntohl((*mc)[0].rx_hash_result);
zip->ai = 1;
} else {
len = ntohl(cqe->byte_cnt);
+ *rss_hash = ntohl(cqe->rx_hash_res);
}
/* Error while receiving packet. */
if (unlikely(MLX5_CQE_OPCODE(op_own) == MLX5_CQE_RESP_ERR))
@@ -1286,12 +1291,13 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
&(*rxq->cqes)[rxq->cq_ci & cqe_cnt].cqe64;
unsigned int i = 0;
unsigned int rq_ci = rxq->rq_ci << sges_n;
- int len;
while (pkts_n) {
unsigned int idx = rq_ci & wqe_cnt;
volatile struct mlx5_wqe_data_seg *wqe = &(*rxq->wqes)[idx];
struct rte_mbuf *rep = (*rxq->elts)[idx];
+ int len = 0;
+ uint32_t rss_hash_res = 0;
if (pkt)
NEXT(seg) = rep;
@@ -1320,8 +1326,9 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
}
if (!pkt) {
cqe = &(*rxq->cqes)[rxq->cq_ci & cqe_cnt].cqe64;
- len = mlx5_rx_poll_len(rxq, cqe, cqe_cnt);
- if (len == 0) {
+ len = mlx5_rx_poll_len(rxq, cqe, cqe_cnt,
+ &rss_hash_res);
+ if (!len) {
rte_mbuf_refcnt_set(rep, 0);
__rte_mbuf_raw_free(rep);
break;
@@ -1338,12 +1345,16 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
/* Update packet information. */
pkt->packet_type = 0;
pkt->ol_flags = 0;
+ if (rxq->rss_hash) {
+ pkt->hash.rss = rss_hash_res;
+ pkt->ol_flags = PKT_RX_RSS_HASH;
+ }
if (rxq->csum | rxq->csum_l2tun | rxq->vlan_strip |
rxq->crc_present) {
if (rxq->csum) {
pkt->packet_type =
rxq_cq_to_pkt_type(cqe);
- pkt->ol_flags =
+ pkt->ol_flags |=
rxq_cq_to_ol_flags(rxq, cqe);
}
if (cqe->l4_hdr_type_etc &
diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
index 9828aef..e813f38 100644
--- a/drivers/net/mlx5/mlx5_rxtx.h
+++ b/drivers/net/mlx5/mlx5_rxtx.h
@@ -113,6 +113,8 @@ struct rxq {
unsigned int cqe_n:4; /* Log 2 of CQ elements. */
unsigned int elts_n:4; /* Log 2 of Mbufs. */
unsigned int port_id:8;
+ unsigned int rss_hash:1; /* RSS hash result is enabled. */
+ unsigned int :9; /* Remaining bits. */
volatile uint32_t *rq_db;
volatile uint32_t *cq_db;
uint16_t rq_ci;
--
2.1.4
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [dpdk-dev] [PATCH v3] net/mlx5: return RSS hash result in mbuf
2016-09-28 7:02 ` [dpdk-dev] [PATCH v3] " Nelio Laranjeiro
@ 2016-09-28 8:59 ` Adrien Mazarguil
0 siblings, 0 replies; 12+ messages in thread
From: Adrien Mazarguil @ 2016-09-28 8:59 UTC (permalink / raw)
To: Nelio Laranjeiro; +Cc: dev, Bruce Richardson, Ferruh Yigit
Hi all,
Actually while this patch may silence clang, it still contains a bug. len
must remain in the outer scope as its value must be preserved across
iterations. I forgot this while reading the original patch and wrongly
suggested Nelio to move it to in the inner loop, sorry about that.
In short clang properly detected the issue, this was not a false
positive. We should use it more often.
On Wed, Sep 28, 2016 at 09:02:15AM +0200, Nelio Laranjeiro wrote:
> Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> ---
> doc/guides/nics/mlx5.rst | 1 +
> drivers/net/mlx5/mlx5_rxq.c | 1 +
> drivers/net/mlx5/mlx5_rxtx.c | 21 ++++++++++++++++-----
> drivers/net/mlx5/mlx5_rxtx.h | 2 ++
> 4 files changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst
> index 8923173..0d1fabb 100644
> --- a/doc/guides/nics/mlx5.rst
> +++ b/doc/guides/nics/mlx5.rst
> @@ -88,6 +88,7 @@ Features
> RTE_ETH_FDIR_REJECT).
> - Secondary process TX is supported.
> - KVM and VMware ESX SR-IOV modes are supported.
> +- RSS hash result is supported.
>
> Limitations
> -----------
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> index f6f4315..d32ad68 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -926,6 +926,7 @@ rxq_ctrl_setup(struct rte_eth_dev *dev, struct rxq_ctrl *rxq_ctrl,
> .rxq = {
> .elts_n = log2above(desc),
> .mp = mp,
> + .rss_hash = priv->rxqs_n > 1,
> },
> };
> struct ibv_exp_wq_attr mod;
> diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
> index e0ff47f..4491ae8 100644
> --- a/drivers/net/mlx5/mlx5_rxtx.c
> +++ b/drivers/net/mlx5/mlx5_rxtx.c
> @@ -1128,6 +1128,8 @@ rxq_cq_to_pkt_type(volatile struct mlx5_cqe64 *cqe)
> * Pointer to RX queue.
> * @param cqe
> * CQE to process.
> + * @param[out] rss_hash
> + * Packet RSS Hash result.
> *
> * @return
> * Packet size in bytes (0 if there is none), -1 in case of completion
> @@ -1135,7 +1137,7 @@ rxq_cq_to_pkt_type(volatile struct mlx5_cqe64 *cqe)
> */
> static inline int
> mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
> - uint16_t cqe_cnt)
> + uint16_t cqe_cnt, uint32_t *rss_hash)
> {
> struct rxq_zip *zip = &rxq->zip;
> uint16_t cqe_n = cqe_cnt + 1;
> @@ -1148,6 +1150,7 @@ mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
> (uintptr_t)(&(*rxq->cqes)[zip->ca & cqe_cnt].cqe64);
>
> len = ntohl((*mc)[zip->ai & 7].byte_cnt);
> + *rss_hash = ntohl((*mc)[zip->ai & 7].rx_hash_result);
> if ((++zip->ai & 7) == 0) {
> /*
> * Increment consumer index to skip the number of
> @@ -1202,9 +1205,11 @@ mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
> zip->cq_ci = rxq->cq_ci + zip->cqe_cnt;
> /* Get packet size to return. */
> len = ntohl((*mc)[0].byte_cnt);
> + *rss_hash = ntohl((*mc)[0].rx_hash_result);
> zip->ai = 1;
> } else {
> len = ntohl(cqe->byte_cnt);
> + *rss_hash = ntohl(cqe->rx_hash_res);
> }
> /* Error while receiving packet. */
> if (unlikely(MLX5_CQE_OPCODE(op_own) == MLX5_CQE_RESP_ERR))
> @@ -1286,12 +1291,13 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
> &(*rxq->cqes)[rxq->cq_ci & cqe_cnt].cqe64;
> unsigned int i = 0;
> unsigned int rq_ci = rxq->rq_ci << sges_n;
> - int len;
>
> while (pkts_n) {
> unsigned int idx = rq_ci & wqe_cnt;
> volatile struct mlx5_wqe_data_seg *wqe = &(*rxq->wqes)[idx];
> struct rte_mbuf *rep = (*rxq->elts)[idx];
> + int len = 0;
> + uint32_t rss_hash_res = 0;
>
> if (pkt)
> NEXT(seg) = rep;
> @@ -1320,8 +1326,9 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
> }
> if (!pkt) {
> cqe = &(*rxq->cqes)[rxq->cq_ci & cqe_cnt].cqe64;
> - len = mlx5_rx_poll_len(rxq, cqe, cqe_cnt);
> - if (len == 0) {
> + len = mlx5_rx_poll_len(rxq, cqe, cqe_cnt,
> + &rss_hash_res);
> + if (!len) {
> rte_mbuf_refcnt_set(rep, 0);
> __rte_mbuf_raw_free(rep);
> break;
> @@ -1338,12 +1345,16 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
> /* Update packet information. */
> pkt->packet_type = 0;
> pkt->ol_flags = 0;
> + if (rxq->rss_hash) {
> + pkt->hash.rss = rss_hash_res;
> + pkt->ol_flags = PKT_RX_RSS_HASH;
> + }
> if (rxq->csum | rxq->csum_l2tun | rxq->vlan_strip |
> rxq->crc_present) {
> if (rxq->csum) {
> pkt->packet_type =
> rxq_cq_to_pkt_type(cqe);
> - pkt->ol_flags =
> + pkt->ol_flags |=
> rxq_cq_to_ol_flags(rxq, cqe);
> }
> if (cqe->l4_hdr_type_etc &
> diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
> index 9828aef..e813f38 100644
> --- a/drivers/net/mlx5/mlx5_rxtx.h
> +++ b/drivers/net/mlx5/mlx5_rxtx.h
> @@ -113,6 +113,8 @@ struct rxq {
> unsigned int cqe_n:4; /* Log 2 of CQ elements. */
> unsigned int elts_n:4; /* Log 2 of Mbufs. */
> unsigned int port_id:8;
> + unsigned int rss_hash:1; /* RSS hash result is enabled. */
> + unsigned int :9; /* Remaining bits. */
> volatile uint32_t *rq_db;
> volatile uint32_t *cq_db;
> uint16_t rq_ci;
> --
> 2.1.4
>
--
Adrien Mazarguil
6WIND
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v4] net/mlx5: return RSS hash result in mbuf
2016-09-14 8:16 [dpdk-dev] [PATCH] net/mlx5: return RSS hash result in mbuf Nelio Laranjeiro
` (2 preceding siblings ...)
2016-09-28 7:02 ` [dpdk-dev] [PATCH v3] " Nelio Laranjeiro
@ 2016-09-28 12:11 ` Nelio Laranjeiro
2016-10-12 15:12 ` Bruce Richardson
3 siblings, 1 reply; 12+ messages in thread
From: Nelio Laranjeiro @ 2016-09-28 12:11 UTC (permalink / raw)
To: dev; +Cc: Adrien Mazarguil, Bruce Richardson, Ferruh Yigit
Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
---
doc/guides/nics/mlx5.rst | 1 +
drivers/net/mlx5/mlx5_rxq.c | 1 +
drivers/net/mlx5/mlx5_rxtx.c | 21 ++++++++++++++++-----
drivers/net/mlx5/mlx5_rxtx.h | 2 ++
4 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst
index 8923173..0d1fabb 100644
--- a/doc/guides/nics/mlx5.rst
+++ b/doc/guides/nics/mlx5.rst
@@ -88,6 +88,7 @@ Features
RTE_ETH_FDIR_REJECT).
- Secondary process TX is supported.
- KVM and VMware ESX SR-IOV modes are supported.
+- RSS hash result is supported.
Limitations
-----------
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index f6f4315..d32ad68 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -926,6 +926,7 @@ rxq_ctrl_setup(struct rte_eth_dev *dev, struct rxq_ctrl *rxq_ctrl,
.rxq = {
.elts_n = log2above(desc),
.mp = mp,
+ .rss_hash = priv->rxqs_n > 1,
},
};
struct ibv_exp_wq_attr mod;
diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
index e0ff47f..729a89b 100644
--- a/drivers/net/mlx5/mlx5_rxtx.c
+++ b/drivers/net/mlx5/mlx5_rxtx.c
@@ -1128,6 +1128,8 @@ rxq_cq_to_pkt_type(volatile struct mlx5_cqe64 *cqe)
* Pointer to RX queue.
* @param cqe
* CQE to process.
+ * @param[out] rss_hash
+ * Packet RSS Hash result.
*
* @return
* Packet size in bytes (0 if there is none), -1 in case of completion
@@ -1135,7 +1137,7 @@ rxq_cq_to_pkt_type(volatile struct mlx5_cqe64 *cqe)
*/
static inline int
mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
- uint16_t cqe_cnt)
+ uint16_t cqe_cnt, uint32_t *rss_hash)
{
struct rxq_zip *zip = &rxq->zip;
uint16_t cqe_n = cqe_cnt + 1;
@@ -1148,6 +1150,7 @@ mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
(uintptr_t)(&(*rxq->cqes)[zip->ca & cqe_cnt].cqe64);
len = ntohl((*mc)[zip->ai & 7].byte_cnt);
+ *rss_hash = ntohl((*mc)[zip->ai & 7].rx_hash_result);
if ((++zip->ai & 7) == 0) {
/*
* Increment consumer index to skip the number of
@@ -1202,9 +1205,11 @@ mlx5_rx_poll_len(struct rxq *rxq, volatile struct mlx5_cqe64 *cqe,
zip->cq_ci = rxq->cq_ci + zip->cqe_cnt;
/* Get packet size to return. */
len = ntohl((*mc)[0].byte_cnt);
+ *rss_hash = ntohl((*mc)[0].rx_hash_result);
zip->ai = 1;
} else {
len = ntohl(cqe->byte_cnt);
+ *rss_hash = ntohl(cqe->rx_hash_res);
}
/* Error while receiving packet. */
if (unlikely(MLX5_CQE_OPCODE(op_own) == MLX5_CQE_RESP_ERR))
@@ -1286,12 +1291,13 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
&(*rxq->cqes)[rxq->cq_ci & cqe_cnt].cqe64;
unsigned int i = 0;
unsigned int rq_ci = rxq->rq_ci << sges_n;
- int len;
+ int len; /* keep its value across iterations. */
while (pkts_n) {
unsigned int idx = rq_ci & wqe_cnt;
volatile struct mlx5_wqe_data_seg *wqe = &(*rxq->wqes)[idx];
struct rte_mbuf *rep = (*rxq->elts)[idx];
+ uint32_t rss_hash_res = 0;
if (pkt)
NEXT(seg) = rep;
@@ -1320,8 +1326,9 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
}
if (!pkt) {
cqe = &(*rxq->cqes)[rxq->cq_ci & cqe_cnt].cqe64;
- len = mlx5_rx_poll_len(rxq, cqe, cqe_cnt);
- if (len == 0) {
+ len = mlx5_rx_poll_len(rxq, cqe, cqe_cnt,
+ &rss_hash_res);
+ if (!len) {
rte_mbuf_refcnt_set(rep, 0);
__rte_mbuf_raw_free(rep);
break;
@@ -1338,12 +1345,16 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
/* Update packet information. */
pkt->packet_type = 0;
pkt->ol_flags = 0;
+ if (rxq->rss_hash) {
+ pkt->hash.rss = rss_hash_res;
+ pkt->ol_flags = PKT_RX_RSS_HASH;
+ }
if (rxq->csum | rxq->csum_l2tun | rxq->vlan_strip |
rxq->crc_present) {
if (rxq->csum) {
pkt->packet_type =
rxq_cq_to_pkt_type(cqe);
- pkt->ol_flags =
+ pkt->ol_flags |=
rxq_cq_to_ol_flags(rxq, cqe);
}
if (cqe->l4_hdr_type_etc &
diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
index 9828aef..e813f38 100644
--- a/drivers/net/mlx5/mlx5_rxtx.h
+++ b/drivers/net/mlx5/mlx5_rxtx.h
@@ -113,6 +113,8 @@ struct rxq {
unsigned int cqe_n:4; /* Log 2 of CQ elements. */
unsigned int elts_n:4; /* Log 2 of Mbufs. */
unsigned int port_id:8;
+ unsigned int rss_hash:1; /* RSS hash result is enabled. */
+ unsigned int :9; /* Remaining bits. */
volatile uint32_t *rq_db;
volatile uint32_t *cq_db;
uint16_t rq_ci;
--
2.1.4
^ permalink raw reply [flat|nested] 12+ messages in thread