compress/isal: check allocation in queue setup
[dpdk.git] / drivers / compress / isal / isal_compress_pmd_ops.c
index 0738fb9..7d03749 100644 (file)
 static const struct rte_compressdev_capabilities isal_pmd_capabilities[] = {
        {
                .algo = RTE_COMP_ALGO_DEFLATE,
-               .comp_feature_flags =   RTE_COMP_FF_SHAREABLE_PRIV_XFORM |
+               .comp_feature_flags =   RTE_COMP_FF_OOP_SGL_IN_SGL_OUT |
+                                       RTE_COMP_FF_OOP_SGL_IN_LB_OUT |
+                                       RTE_COMP_FF_OOP_LB_IN_SGL_OUT |
+                                       RTE_COMP_FF_SHAREABLE_PRIV_XFORM |
                                        RTE_COMP_FF_HUFFMAN_FIXED |
-                                       RTE_COMP_FF_HUFFMAN_DYNAMIC,
+                                       RTE_COMP_FF_HUFFMAN_DYNAMIC |
+                                       RTE_COMP_FF_CRC32_CHECKSUM |
+                                       RTE_COMP_FF_ADLER32_CHECKSUM,
                .window_size = {
                        .min = 15,
                        .max = 15,
@@ -130,10 +135,18 @@ isal_comp_pmd_info_get(struct rte_compressdev *dev __rte_unused,
 {
        if (dev_info != NULL) {
                dev_info->capabilities = isal_pmd_capabilities;
-               dev_info->feature_flags = RTE_COMPDEV_FF_CPU_AVX512 |
-                               RTE_COMPDEV_FF_CPU_AVX2 |
-                               RTE_COMPDEV_FF_CPU_AVX |
-                               RTE_COMPDEV_FF_CPU_SSE;
+
+               /* Check CPU for supported vector instruction and set
+                * feature_flags
+                */
+               if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F))
+                       dev_info->feature_flags |= RTE_COMPDEV_FF_CPU_AVX512;
+               else if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2))
+                       dev_info->feature_flags |= RTE_COMPDEV_FF_CPU_AVX2;
+               else if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX))
+                       dev_info->feature_flags |= RTE_COMPDEV_FF_CPU_AVX;
+               else
+                       dev_info->feature_flags |= RTE_COMPDEV_FF_CPU_SSE;
        }
 }
 
@@ -158,15 +171,12 @@ isal_comp_pmd_qp_release(struct rte_compressdev *dev, uint16_t qp_id)
        if (qp == NULL)
                return -EINVAL;
 
-       if (qp->stream != NULL)
-               rte_free(qp->stream);
-
-       if (qp->stream->level_buf != NULL)
+       if (qp->stream)
                rte_free(qp->stream->level_buf);
 
-       if (qp->state != NULL)
-               rte_free(qp->state);
-
+       rte_free(qp->state);
+       rte_ring_free(qp->processed_pkts);
+       rte_free(qp->stream);
        rte_free(qp);
        dev->data->queue_pairs[qp_id] = NULL;
 
@@ -206,7 +216,7 @@ 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",
+                       "isal_comp_pmd_%u_qp_%u",
                        dev->data->dev_id, qp->id);
 
        if (n >= sizeof(qp->name))
@@ -239,16 +249,27 @@ isal_comp_pmd_qp_setup(struct rte_compressdev *dev, uint16_t qp_id,
        qp->stream = rte_zmalloc_socket("Isa-l compression stream ",
                        sizeof(struct isal_zstream),  RTE_CACHE_LINE_SIZE,
                        socket_id);
-
+       if (qp->stream == NULL) {
+               ISAL_PMD_LOG(ERR, "Failed to allocate compression stream memory");
+               goto qp_setup_cleanup;
+       }
        /* Initialize memory for compression level buffer */
        qp->stream->level_buf = rte_zmalloc_socket("Isa-l compression lev_buf",
                        ISAL_DEF_LVL3_DEFAULT, RTE_CACHE_LINE_SIZE,
                        socket_id);
+       if (qp->stream->level_buf == NULL) {
+               ISAL_PMD_LOG(ERR, "Failed to allocate compression level_buf memory");
+               goto qp_setup_cleanup;
+       }
 
        /* Initialize memory for decompression state structure */
        qp->state = rte_zmalloc_socket("Isa-l decompression state",
                        sizeof(struct inflate_state), RTE_CACHE_LINE_SIZE,
                        socket_id);
+       if (qp->state == NULL) {
+               ISAL_PMD_LOG(ERR, "Failed to allocate decompression state memory");
+               goto qp_setup_cleanup;
+       }
 
        qp->id = qp_id;
        dev->data->queue_pairs[qp_id] = qp;
@@ -274,8 +295,11 @@ isal_comp_pmd_qp_setup(struct rte_compressdev *dev, uint16_t qp_id,
        return 0;
 
 qp_setup_cleanup:
-       if (qp)
-               rte_free(qp);
+       if (qp->stream)
+               rte_free(qp->stream->level_buf);
+       rte_free(qp->stream);
+       rte_free(qp->state);
+       rte_free(qp);
 
        return -1;
 }