[dpdk-dev,v3,05/11] compress/isal: add queue pair related ops

Message ID 1523972132-6894-6-git-send-email-lee.daly@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Pablo de Lara Guarch
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Daly, Lee April 17, 2018, 1:35 p.m. UTC
  Signed-off-by: Lee Daly <lee.daly@intel.com>
---
 drivers/compress/isal/isal_compress_pmd_ops.c     | 110 +++++++++++++++++++++-
 drivers/compress/isal/isal_compress_pmd_private.h |   2 +
 2 files changed, 110 insertions(+), 2 deletions(-)
  

Comments

De Lara Guarch, Pablo April 24, 2018, 9:56 a.m. UTC | #1
> -----Original Message-----
> From: Daly, Lee
> Sent: Tuesday, April 17, 2018 2:35 PM
> To: dev@dpdk.org
> Cc: De Lara Guarch, Pablo <pablo.de.lara.guarch@intel.com>; Tucker, Greg B
> <greg.b.tucker@intel.com>; Jain, Deepak K <deepak.k.jain@intel.com>; Trahe,
> Fiona <fiona.trahe@intel.com>; Daly, Lee <lee.daly@intel.com>
> Subject: [PATCH v3 05/11] compress/isal: add queue pair related ops
> 
> Signed-off-by: Lee Daly <lee.daly@intel.com>
> ---
>  drivers/compress/isal/isal_compress_pmd_ops.c     | 110
> +++++++++++++++++++++-
>  drivers/compress/isal/isal_compress_pmd_private.h |   2 +
>  2 files changed, 110 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/compress/isal/isal_compress_pmd_ops.c
> b/drivers/compress/isal/isal_compress_pmd_ops.c
> index 2e9381d..73e4c84 100644
> --- a/drivers/compress/isal/isal_compress_pmd_ops.c
> +++ b/drivers/compress/isal/isal_compress_pmd_ops.c
> @@ -4,6 +4,7 @@
> 
>  #include <rte_common.h>
>  #include <rte_compressdev_pmd.h>
> +#include <rte_malloc.h>
> 
>  #include "isal_compress_pmd_private.h"
> 
> @@ -102,6 +103,111 @@ isal_comp_pmd_info_get(struct rte_compressdev
> *dev __rte_unused,
>  	}
>  }
> 
> +
> +/** Release queue pair */
> +static int
> +isal_comp_pmd_qp_release(struct rte_compressdev *dev, uint16_t qp_id) {
> +struct isal_comp_qp *qp = dev->data->queue_pairs[qp_id];
> +
> +	if (qp == NULL)
> +		return -EINVAL;
> +
> +	if (dev->data->queue_pairs[qp_id] != NULL)
> +		rte_free(dev->data->queue_pairs[qp_id]);
> +
> +	return 0;
> +}
> +
> +/** Create a ring to place process packets on */ static struct rte_ring
> +* isal_comp_pmd_qp_create_processed_pkts_ring(struct isal_comp_qp *qp,
> +		unsigned int ring_size, int socket_id) {
> +	struct rte_ring *r;
> +
> +	r = rte_ring_lookup(qp->name);
> +	if (r) {
> +		if (rte_ring_get_size(r) >= ring_size) {
> +			ISAL_PMD_LOG(DEBUG,
> +				"Reusing existing ring %s for processed
> packets",
> +				qp->name);
> +			return r;
> +		}
> +
> +			ISAL_PMD_LOG(ERR,
> +					"Unable to reuse existing ring %s for
> processed packets",

Remove one tab here, as the line is too long.

> +			 qp->name);
> +		return NULL;
> +	}
> +
> +	return rte_ring_create(qp->name, ring_size, socket_id,
> +			RING_F_SP_ENQ | RING_F_SC_DEQ);
> +}
> +
> +/** set a unique name for the queue pair based on it's name, dev_id and

"its"

> +qp_id */ static int isal_comp_pmd_qp_set_unique_name(struct
> +rte_compressdev *dev, struct isal_comp_qp *qp) {
> +	unsigned int n = snprintf(qp->name, sizeof(qp->name),
> +			"isal_compression_pmd_%u_qp_%u",
> +			dev->data->dev_id, qp->id);

Better to use strlcpy.

> +
> +	if (n >= sizeof(qp->name))
> +		return -1;
> +
> +	return 0;
> +}
  
Daly, Lee April 26, 2018, 4:44 p.m. UTC | #2
<...>
> > -----Original Message-----
> > From: Daly, Lee
> > Sent: Tuesday, April 17, 2018 2:35 PM
> > To: dev@dpdk.org
> > Cc: De Lara Guarch, Pablo <pablo.de.lara.guarch@intel.com>; Tucker,
> > Greg B <greg.b.tucker@intel.com>; Jain, Deepak K
> > <deepak.k.jain@intel.com>; Trahe, Fiona <fiona.trahe@intel.com>; Daly,
> > Lee <lee.daly@intel.com>
> > Subject: [PATCH v3 05/11] compress/isal: add queue pair related ops
> >
> > Signed-off-by: Lee Daly <lee.daly@intel.com>
> > ---
> >  drivers/compress/isal/isal_compress_pmd_ops.c     | 110
> > +++++++++++++++++++++-
> >  drivers/compress/isal/isal_compress_pmd_private.h |   2 +
> >  2 files changed, 110 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/compress/isal/isal_compress_pmd_ops.c
> > b/drivers/compress/isal/isal_compress_pmd_ops.c
> > index 2e9381d..73e4c84 100644
> > --- a/drivers/compress/isal/isal_compress_pmd_ops.c

//snip

> 
> > +qp_id */ static int isal_comp_pmd_qp_set_unique_name(struct
> > +rte_compressdev *dev, struct isal_comp_qp *qp) {
> > +	unsigned int n = snprintf(qp->name, sizeof(qp->name),
> > +			"isal_compression_pmd_%u_qp_%u",
> > +			dev->data->dev_id, qp->id);
> 
> Better to use strlcpy.

[Lee] I believe snprintf to be a better fit due to the fact strlcpy doesn't handle variable arguments as inputs, i.e 
	"snprintf(dst, length, "%s", src)" 
	"strlcpy(dst, src, length)"
To complete this action with strlcpy would cause more overhead, and snprintf() is still safe as it always null terminates.

> 
> > +
> > +	if (n >= sizeof(qp->name))
> > +		return -1;
> > +
> > +	return 0;
> > +}
  

Patch

diff --git a/drivers/compress/isal/isal_compress_pmd_ops.c b/drivers/compress/isal/isal_compress_pmd_ops.c
index 2e9381d..73e4c84 100644
--- a/drivers/compress/isal/isal_compress_pmd_ops.c
+++ b/drivers/compress/isal/isal_compress_pmd_ops.c
@@ -4,6 +4,7 @@ 
 
 #include <rte_common.h>
 #include <rte_compressdev_pmd.h>
+#include <rte_malloc.h>
 
 #include "isal_compress_pmd_private.h"
 
@@ -102,6 +103,111 @@  isal_comp_pmd_info_get(struct rte_compressdev *dev __rte_unused,
 	}
 }
 
+
+/** Release queue pair */
+static int
+isal_comp_pmd_qp_release(struct rte_compressdev *dev, uint16_t qp_id)
+{
+struct isal_comp_qp *qp = dev->data->queue_pairs[qp_id];
+
+	if (qp == NULL)
+		return -EINVAL;
+
+	if (dev->data->queue_pairs[qp_id] != NULL)
+		rte_free(dev->data->queue_pairs[qp_id]);
+
+	return 0;
+}
+
+/** Create a ring to place process packets on */
+static struct rte_ring *
+isal_comp_pmd_qp_create_processed_pkts_ring(struct isal_comp_qp *qp,
+		unsigned int ring_size, int socket_id)
+{
+	struct rte_ring *r;
+
+	r = rte_ring_lookup(qp->name);
+	if (r) {
+		if (rte_ring_get_size(r) >= ring_size) {
+			ISAL_PMD_LOG(DEBUG,
+				"Reusing existing ring %s for processed packets",
+				qp->name);
+			return r;
+		}
+
+			ISAL_PMD_LOG(ERR,
+					"Unable to reuse existing ring %s for processed packets",
+			 qp->name);
+		return NULL;
+	}
+
+	return rte_ring_create(qp->name, ring_size, socket_id,
+			RING_F_SP_ENQ | RING_F_SC_DEQ);
+}
+
+/** set a unique name for the queue pair based on it's name, dev_id and qp_id */
+static int
+isal_comp_pmd_qp_set_unique_name(struct rte_compressdev *dev,
+struct isal_comp_qp *qp)
+{
+	unsigned int n = snprintf(qp->name, sizeof(qp->name),
+			"isal_compression_pmd_%u_qp_%u",
+			dev->data->dev_id, qp->id);
+
+	if (n >= sizeof(qp->name))
+		return -1;
+
+	return 0;
+}
+
+/* Setup a queue pair */
+static int
+isal_comp_pmd_qp_setup(struct rte_compressdev *dev, uint16_t qp_id,
+		uint32_t max_inflight_ops, int socket_id)
+{
+	struct isal_comp_qp *qp = NULL;
+	int retval;
+
+	/* Free memory prior to re-allocation if needed. */
+	if (dev->data->queue_pairs[qp_id] != NULL)
+		isal_comp_pmd_qp_release(dev, qp_id);
+
+	/* Allocate the queue pair data structure. */
+	qp = rte_zmalloc_socket("Isa-l compression PMD Queue Pair", sizeof(*qp),
+					RTE_CACHE_LINE_SIZE, socket_id);
+	if (qp == NULL) {
+		ISAL_PMD_LOG(ERR, "Failed to allocate queue pair memory");
+		return (-ENOMEM);
+	}
+
+	qp->id = qp_id;
+	dev->data->queue_pairs[qp_id] = qp;
+
+	retval = isal_comp_pmd_qp_set_unique_name(dev, qp);
+	if (retval) {
+		ISAL_PMD_LOG(ERR, "Failed to create unique name for isal "
+				"compression device");
+		goto qp_setup_cleanup;
+	}
+
+	qp->processed_pkts = isal_comp_pmd_qp_create_processed_pkts_ring(qp,
+			max_inflight_ops, socket_id);
+	if (qp->processed_pkts == NULL) {
+		ISAL_PMD_LOG(ERR, "Failed to create unique name for isal "
+				"compression device");
+		goto qp_setup_cleanup;
+	}
+
+	memset(&qp->qp_stats, 0, sizeof(qp->qp_stats));
+	return 0;
+
+qp_setup_cleanup:
+	if (qp)
+		rte_free(qp);
+
+	return -1;
+}
+
 /** Set private xform data*/
 static int
 isal_comp_pmd_priv_xform_create(struct rte_compressdev *dev,
@@ -157,8 +263,8 @@  struct rte_compressdev_ops isal_pmd_ops = {
 
 		.dev_infos_get		= isal_comp_pmd_info_get,
 
-		.queue_pair_setup	= NULL,
-		.queue_pair_release	= NULL,
+		.queue_pair_setup	= isal_comp_pmd_qp_setup,
+		.queue_pair_release	= isal_comp_pmd_qp_release,
 
 		.private_xform_create	= isal_comp_pmd_priv_xform_create,
 		.private_xform_free	= isal_comp_pmd_priv_xform_free,
diff --git a/drivers/compress/isal/isal_compress_pmd_private.h b/drivers/compress/isal/isal_compress_pmd_private.h
index 5c27939..05679b8 100644
--- a/drivers/compress/isal/isal_compress_pmd_private.h
+++ b/drivers/compress/isal/isal_compress_pmd_private.h
@@ -24,6 +24,8 @@  struct isal_comp_qp {
 	uint16_t id;
 	/* Unique Queue Pair Name */
 	char name[RTE_COMPRESSDEV_NAME_MAX_LEN];
+	/* Ring for placing process packets */
+	struct rte_ring *processed_pkts;
 	/* Queue pair statistics */
 	struct rte_compressdev_stats qp_stats;
 	/* Number of free elements on ring */