[dpdk-dev,v3,05/11] compress/isal: add queue pair related ops
Checks
Commit Message
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
> -----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;
> +}
<...>
> > -----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;
> > +}
@@ -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,
@@ -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 */