get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/105304/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 105304,
    "url": "http://patchwork.dpdk.org/api/patches/105304/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20211221110953.707476-1-ganapati.kundapura@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20211221110953.707476-1-ganapati.kundapura@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211221110953.707476-1-ganapati.kundapura@intel.com",
    "date": "2021-12-21T11:09:53",
    "name": "[v1] eventdev/crypto_adapter: move crypto ops to circular buffer",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "479d474954052ce44d3f33e5fe46ea35cc717aa6",
    "submitter": {
        "id": 2287,
        "url": "http://patchwork.dpdk.org/api/people/2287/?format=api",
        "name": "Ganapati Kundapura",
        "email": "ganapati.kundapura@intel.com"
    },
    "delegate": {
        "id": 310,
        "url": "http://patchwork.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20211221110953.707476-1-ganapati.kundapura@intel.com/mbox/",
    "series": [
        {
            "id": 20997,
            "url": "http://patchwork.dpdk.org/api/series/20997/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=20997",
            "date": "2021-12-21T11:09:53",
            "name": "[v1] eventdev/crypto_adapter: move crypto ops to circular buffer",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/20997/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/105304/comments/",
    "check": "fail",
    "checks": "http://patchwork.dpdk.org/api/patches/105304/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 4AAA5A034E;\n\tTue, 21 Dec 2021 12:10:01 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id BB58F40040;\n\tTue, 21 Dec 2021 12:10:00 +0100 (CET)",
            "from mga14.intel.com (mga14.intel.com [192.55.52.115])\n by mails.dpdk.org (Postfix) with ESMTP id 16C074003C\n for <dev@dpdk.org>; Tue, 21 Dec 2021 12:09:58 +0100 (CET)",
            "from orsmga008.jf.intel.com ([10.7.209.65])\n by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 21 Dec 2021 03:09:57 -0800",
            "from txandevlnx322.an.intel.com ([10.123.117.44])\n by orsmga008.jf.intel.com with ESMTP; 21 Dec 2021 03:09:56 -0800"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1640084999; x=1671620999;\n h=from:to:cc:subject:date:message-id:mime-version:\n content-transfer-encoding;\n bh=nD15gEAY7CCpRzHDgfpAR4B5zWCrG+g06XVdVbgx41A=;\n b=Lw4ukFX3Bg6AGE0UYadFFNYNfuxYLKGyb24IMm2c6FKwPZSfgktmy1B5\n Z8FxV0eSnM6wsxoy7YBHtc7GC5HSQ559p5oFm1GKrW7exw59sklLy/ntW\n 6IpUS69cloG7uR129SXy9f4MKamI+rDnSUnWqg0rS2eCXZDcp+oTIm7Cp\n DMguUrTXtVVbieuAh+n+yJ729Wwhs+bnasaNyIrinXU3H5dppSAUWg8q/\n uUshiborcZFjKn7m3u1JqRLOwQDvtSekw0PxpoqmVM/ZT496lnIDR1ng7\n EkYup4N/HngqudyvZbVBFW/TJGvx18QO8ExNfErc+16u6hiWmdUiWKSaR w==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10204\"; a=\"240598462\"",
            "E=Sophos;i=\"5.88,223,1635231600\"; d=\"scan'208\";a=\"240598462\"",
            "E=Sophos;i=\"5.88,223,1635231600\"; d=\"scan'208\";a=\"521209899\""
        ],
        "X-ExtLoop1": "1",
        "From": "Ganapati Kundapura <ganapati.kundapura@intel.com>",
        "To": "jay.jayatheerthan@intel.com,\n\tjerinjacobk@gmail.com,\n\tdev@dpdk.org",
        "Cc": "abhinandan.gujjar@intel.com",
        "Subject": "[PATCH v1] eventdev/crypto_adapter: move crypto ops to circular\n buffer",
        "Date": "Tue, 21 Dec 2021 05:09:53 -0600",
        "Message-Id": "<20211221110953.707476-1-ganapati.kundapura@intel.com>",
        "X-Mailer": "git-send-email 2.23.0",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Move crypto ops to circular buffer to retain crypto\nops when cryptodev/eventdev are temporarily full\n\nUpdate crypto adapter caps get to return SW_CAP if\nPMD callback is not registered\n\nSigned-off-by: Ganapati Kundapura <ganapati.kundapura@intel.com>",
    "diff": "diff --git a/lib/eventdev/rte_event_crypto_adapter.c b/lib/eventdev/rte_event_crypto_adapter.c\nindex d840803..4469a89 100644\n--- a/lib/eventdev/rte_event_crypto_adapter.c\n+++ b/lib/eventdev/rte_event_crypto_adapter.c\n@@ -25,11 +25,27 @@\n #define CRYPTO_ADAPTER_MEM_NAME_LEN 32\n #define CRYPTO_ADAPTER_MAX_EV_ENQ_RETRIES 100\n \n+#define CRYPTO_ADAPTER_OPS_BUFFER_SZ (BATCH_SIZE + BATCH_SIZE)\n+#define CRYPTO_ADAPTER_BUFFER_SZ 1024\n+\n /* Flush an instance's enqueue buffers every CRYPTO_ENQ_FLUSH_THRESHOLD\n  * iterations of eca_crypto_adapter_enq_run()\n  */\n #define CRYPTO_ENQ_FLUSH_THRESHOLD 1024\n \n+struct crypto_ops_circular_buffer {\n+\t/* index of head element in circular buffer */\n+\tuint16_t head;\n+\t/* index of tail element in circular buffer */\n+\tuint16_t tail;\n+\t/* number elements in buffer */\n+\tuint16_t count;\n+\t/* size of circular buffer */\n+\tuint16_t size;\n+\t/* Pointer to hold rte_crypto_ops for batching */\n+\tstruct rte_crypto_op **op_buffer;\n+} __rte_cache_aligned;\n+\n struct event_crypto_adapter {\n \t/* Event device identifier */\n \tuint8_t eventdev_id;\n@@ -47,6 +63,8 @@ struct event_crypto_adapter {\n \tstruct crypto_device_info *cdevs;\n \t/* Loop counter to flush crypto ops */\n \tuint16_t transmit_loop_count;\n+\t/* Circular buffer for batching crypto ops to eventdev */\n+\tstruct crypto_ops_circular_buffer ebuf;\n \t/* Per instance stats structure */\n \tstruct rte_event_crypto_adapter_stats crypto_stats;\n \t/* Configuration callback for rte_service configuration */\n@@ -93,8 +111,8 @@ struct crypto_device_info {\n struct crypto_queue_pair_info {\n \t/* Set to indicate queue pair is enabled */\n \tbool qp_enabled;\n-\t/* Pointer to hold rte_crypto_ops for batching */\n-\tstruct rte_crypto_op **op_buffer;\n+\t/* Circular buffer for batching crypto ops to cdev */\n+\tstruct crypto_ops_circular_buffer cbuf;\n \t/* No of crypto ops accumulated */\n \tuint8_t len;\n } __rte_cache_aligned;\n@@ -141,6 +159,77 @@ eca_init(void)\n \treturn 0;\n }\n \n+static inline bool\n+eca_circular_buffer_batch_ready(struct crypto_ops_circular_buffer *bufp)\n+{\n+\treturn bufp->count >= BATCH_SIZE;\n+}\n+\n+static inline void\n+eca_circular_buffer_free(struct crypto_ops_circular_buffer *bufp)\n+{\n+\trte_free(bufp->op_buffer);\n+}\n+\n+static inline int\n+eca_circular_buffer_init(const char *name,\n+\t\t\t struct crypto_ops_circular_buffer *bufp,\n+\t\t\t uint16_t sz)\n+{\n+\tbufp->op_buffer = rte_zmalloc(name,\n+\t\t\t\t      sizeof(struct rte_crypto_op *) * sz,\n+\t\t\t\t      0);\n+\tif (bufp->op_buffer == NULL)\n+\t\treturn -ENOMEM;\n+\n+\tbufp->size = sz;\n+\treturn 0;\n+}\n+\n+static inline int\n+eca_circular_buffer_add(struct crypto_ops_circular_buffer *bufp,\n+\t\t\tstruct rte_crypto_op *op)\n+{\n+\tuint16_t *tailp = &bufp->tail;\n+\n+\tbufp->op_buffer[*tailp] = op;\n+\t*tailp = (*tailp + 1) % bufp->size;\n+\tbufp->count++;\n+\n+\treturn 0;\n+}\n+\n+static inline int\n+eca_circular_buffer_flush_to_cdev(struct crypto_ops_circular_buffer *bufp,\n+\t\t\t\t  uint8_t cdev_id, uint16_t qp_id,\n+\t\t\t\t  uint16_t *nb_ops_flushed)\n+{\n+\tuint16_t n = 0;\n+\tuint16_t *headp = &bufp->head;\n+\tuint16_t *tailp = &bufp->tail;\n+\tstruct rte_crypto_op **ops = bufp->op_buffer;\n+\n+\tif (*tailp > *headp)\n+\t\tn = *tailp - *headp;\n+\telse if (*tailp < *headp)\n+\t\tn = bufp->size - *headp;\n+\telse {\n+\t\t*nb_ops_flushed = 0;\n+\t\treturn 0;  /* buffer empty */\n+\t}\n+\n+\t*nb_ops_flushed = rte_cryptodev_enqueue_burst(cdev_id, qp_id,\n+\t\t\t\t\t\t      &ops[*headp], n);\n+\tbufp->count -= *nb_ops_flushed;\n+\tif (!bufp->count) {\n+\t\t*headp = 0;\n+\t\t*tailp = 0;\n+\t} else\n+\t\t*headp = (*headp + *nb_ops_flushed) % bufp->size;\n+\n+\treturn *nb_ops_flushed == n ? 0 : -1;\n+}\n+\n static inline struct event_crypto_adapter *\n eca_id_to_adapter(uint8_t id)\n {\n@@ -237,10 +326,19 @@ rte_event_crypto_adapter_create_ext(uint8_t id, uint8_t dev_id,\n \t\treturn -ENOMEM;\n \t}\n \n+\tif (eca_circular_buffer_init(\"eca_edev_circular_buffer\",\n+\t\t\t\t     &adapter->ebuf,\n+\t\t\t\t     CRYPTO_ADAPTER_BUFFER_SZ)) {\n+\t\tRTE_EDEV_LOG_ERR(\"Failed to get mem for edev buffer\");\n+\t\trte_free(adapter);\n+\t\treturn -ENOMEM;\n+\t}\n+\n \tret = rte_event_dev_info_get(dev_id, &dev_info);\n \tif (ret < 0) {\n \t\tRTE_EDEV_LOG_ERR(\"Failed to get info for eventdev %d: %s!\",\n \t\t\t\t dev_id, dev_info.driver_name);\n+\t\teca_circular_buffer_free(&adapter->ebuf);\n \t\trte_free(adapter);\n \t\treturn ret;\n \t}\n@@ -259,6 +357,7 @@ rte_event_crypto_adapter_create_ext(uint8_t id, uint8_t dev_id,\n \t\t\t\t\tsocket_id);\n \tif (adapter->cdevs == NULL) {\n \t\tRTE_EDEV_LOG_ERR(\"Failed to get mem for crypto devices\\n\");\n+\t\teca_circular_buffer_free(&adapter->ebuf);\n \t\trte_free(adapter);\n \t\treturn -ENOMEM;\n \t}\n@@ -337,11 +436,10 @@ eca_enq_to_cryptodev(struct event_crypto_adapter *adapter, struct rte_event *ev,\n \tstruct crypto_queue_pair_info *qp_info = NULL;\n \tstruct rte_crypto_op *crypto_op;\n \tunsigned int i, n;\n-\tuint16_t qp_id, len, ret;\n+\tuint16_t qp_id, len, nb_enqueued = 0;\n \tuint8_t cdev_id;\n \n \tlen = 0;\n-\tret = 0;\n \tn = 0;\n \tstats->event_deq_count += cnt;\n \n@@ -367,7 +465,7 @@ eca_enq_to_cryptodev(struct event_crypto_adapter *adapter, struct rte_event *ev,\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\tlen = qp_info->len;\n-\t\t\tqp_info->op_buffer[len] = crypto_op;\n+\t\t\teca_circular_buffer_add(&qp_info->cbuf, crypto_op);\n \t\t\tlen++;\n \t\t} else if (crypto_op->sess_type == RTE_CRYPTO_OP_SESSIONLESS &&\n \t\t\t\tcrypto_op->private_data_offset) {\n@@ -383,7 +481,7 @@ eca_enq_to_cryptodev(struct event_crypto_adapter *adapter, struct rte_event *ev,\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\tlen = qp_info->len;\n-\t\t\tqp_info->op_buffer[len] = crypto_op;\n+\t\t\teca_circular_buffer_add(&qp_info->cbuf, crypto_op);\n \t\t\tlen++;\n \t\t} else {\n \t\t\trte_pktmbuf_free(crypto_op->sym->m_src);\n@@ -391,18 +489,16 @@ eca_enq_to_cryptodev(struct event_crypto_adapter *adapter, struct rte_event *ev,\n \t\t\tcontinue;\n \t\t}\n \n-\t\tif (len == BATCH_SIZE) {\n-\t\t\tstruct rte_crypto_op **op_buffer = qp_info->op_buffer;\n-\t\t\tret = rte_cryptodev_enqueue_burst(cdev_id,\n+\t\tif (eca_circular_buffer_batch_ready(&qp_info->cbuf)) {\n+\t\t\teca_circular_buffer_flush_to_cdev(&qp_info->cbuf,\n+\t\t\t\t\t\t\t  cdev_id,\n \t\t\t\t\t\t\t  qp_id,\n-\t\t\t\t\t\t\t  op_buffer,\n-\t\t\t\t\t\t\t  BATCH_SIZE);\n+\t\t\t\t\t\t\t  &nb_enqueued);\n+\t\t\tstats->crypto_enq_count += nb_enqueued;\n \n-\t\t\tstats->crypto_enq_count += ret;\n-\n-\t\t\twhile (ret < len) {\n+\t\t\twhile (nb_enqueued < len) {\n \t\t\t\tstruct rte_crypto_op *op;\n-\t\t\t\top = op_buffer[ret++];\n+\t\t\t\top = qp_info->cbuf.op_buffer[nb_enqueued++];\n \t\t\t\tstats->crypto_enq_fail++;\n \t\t\t\trte_pktmbuf_free(op->sym->m_src);\n \t\t\t\trte_crypto_op_free(op);\n@@ -413,7 +509,8 @@ eca_enq_to_cryptodev(struct event_crypto_adapter *adapter, struct rte_event *ev,\n \n \t\tif (qp_info)\n \t\t\tqp_info->len = len;\n-\t\tn += ret;\n+\n+\t\tn += nb_enqueued;\n \t}\n \n \treturn n;\n@@ -425,14 +522,12 @@ eca_crypto_enq_flush(struct event_crypto_adapter *adapter)\n \tstruct rte_event_crypto_adapter_stats *stats = &adapter->crypto_stats;\n \tstruct crypto_device_info *curr_dev;\n \tstruct crypto_queue_pair_info *curr_queue;\n-\tstruct rte_crypto_op **op_buffer;\n \tstruct rte_cryptodev *dev;\n \tuint8_t cdev_id;\n \tuint16_t qp;\n-\tuint16_t ret;\n+\tuint16_t nb_enqueued = 0, nb = 0;\n \tuint16_t num_cdev = rte_cryptodev_count();\n \n-\tret = 0;\n \tfor (cdev_id = 0; cdev_id < num_cdev; cdev_id++) {\n \t\tcurr_dev = &adapter->cdevs[cdev_id];\n \t\tdev = curr_dev->dev;\n@@ -444,25 +539,26 @@ eca_crypto_enq_flush(struct event_crypto_adapter *adapter)\n \t\t\tif (!curr_queue->qp_enabled)\n \t\t\t\tcontinue;\n \n-\t\t\top_buffer = curr_queue->op_buffer;\n-\t\t\tret = rte_cryptodev_enqueue_burst(cdev_id,\n+\t\t\teca_circular_buffer_flush_to_cdev(&curr_queue->cbuf,\n+\t\t\t\t\t\t\t  cdev_id,\n \t\t\t\t\t\t\t  qp,\n-\t\t\t\t\t\t\t  op_buffer,\n-\t\t\t\t\t\t\t  curr_queue->len);\n-\t\t\tstats->crypto_enq_count += ret;\n+\t\t\t\t\t\t\t  &nb_enqueued);\n+\n+\t\t\tstats->crypto_enq_count += nb_enqueued;\n \n-\t\t\twhile (ret < curr_queue->len) {\n+\t\t\twhile (nb_enqueued < curr_queue->len) {\n \t\t\t\tstruct rte_crypto_op *op;\n-\t\t\t\top = op_buffer[ret++];\n+\t\t\t\top = curr_queue->cbuf.op_buffer[nb_enqueued++];\n \t\t\t\tstats->crypto_enq_fail++;\n \t\t\t\trte_pktmbuf_free(op->sym->m_src);\n \t\t\t\trte_crypto_op_free(op);\n \t\t\t}\n \t\t\tcurr_queue->len = 0;\n+\t\t\tnb += nb_enqueued;\n \t\t}\n \t}\n \n-\treturn ret;\n+\treturn nb;\n }\n \n static int\n@@ -499,9 +595,9 @@ eca_crypto_adapter_enq_run(struct event_crypto_adapter *adapter,\n \treturn nb_enqueued;\n }\n \n-static inline void\n+static inline uint16_t\n eca_ops_enqueue_burst(struct event_crypto_adapter *adapter,\n-\t\t      struct rte_crypto_op **ops, uint16_t num)\n+\t\t  struct rte_crypto_op **ops, uint16_t num)\n {\n \tstruct rte_event_crypto_adapter_stats *stats = &adapter->crypto_stats;\n \tunion rte_event_crypto_metadata *m_data = NULL;\n@@ -518,6 +614,8 @@ eca_ops_enqueue_burst(struct event_crypto_adapter *adapter,\n \tnum = RTE_MIN(num, BATCH_SIZE);\n \tfor (i = 0; i < num; i++) {\n \t\tstruct rte_event *ev = &events[nb_ev++];\n+\n+\t\tm_data = NULL;\n \t\tif (ops[i]->sess_type == RTE_CRYPTO_OP_WITH_SESSION) {\n \t\t\tm_data = rte_cryptodev_sym_session_get_user_data(\n \t\t\t\t\tops[i]->sym->session);\n@@ -548,6 +646,7 @@ eca_ops_enqueue_burst(struct event_crypto_adapter *adapter,\n \t\t\t\t\t\t  event_port_id,\n \t\t\t\t\t\t  &events[nb_enqueued],\n \t\t\t\t\t\t  nb_ev - nb_enqueued);\n+\n \t} while (retry++ < CRYPTO_ADAPTER_MAX_EV_ENQ_RETRIES &&\n \t\t nb_enqueued < nb_ev);\n \n@@ -561,8 +660,52 @@ eca_ops_enqueue_burst(struct event_crypto_adapter *adapter,\n \tstats->event_enq_fail_count += nb_ev - nb_enqueued;\n \tstats->event_enq_count += nb_enqueued;\n \tstats->event_enq_retry_count += retry - 1;\n+\n+\treturn nb_enqueued;\n }\n \n+static int\n+eca_circular_buffer_flush_to_evdev(struct event_crypto_adapter *adapter,\n+\t\t\t\t   struct crypto_ops_circular_buffer *bufp)\n+{\n+\tuint16_t n = 0, nb_ops_flushed;\n+\tuint16_t *headp = &bufp->head;\n+\tuint16_t *tailp = &bufp->tail;\n+\tstruct rte_crypto_op **ops = bufp->op_buffer;\n+\n+\tif (*tailp > *headp)\n+\t\tn = *tailp - *headp;\n+\telse if (*tailp < *headp)\n+\t\tn = bufp->size - *headp;\n+\telse\n+\t\treturn 0;  /* buffer empty */\n+\n+\tnb_ops_flushed =  eca_ops_enqueue_burst(adapter, ops, n);\n+\tbufp->count -= nb_ops_flushed;\n+\tif (!bufp->count) {\n+\t\t*headp = 0;\n+\t\t*tailp = 0;\n+\t} else\n+\t\t*headp = (*headp + nb_ops_flushed) % bufp->size;\n+\n+\t/* Stop further enqueue to eventdev, if nb_ops_flushed < n */\n+\tif (nb_ops_flushed < n)\n+\t\treturn 0;\n+\n+\treturn 1;\n+}\n+\n+\n+static void\n+eca_ops_buffer_flush(struct event_crypto_adapter *adapter)\n+{\n+\tif (adapter->ebuf.count == 0)\n+\t\treturn;\n+\n+\twhile (eca_circular_buffer_flush_to_evdev(adapter,\n+\t\t\t\t\t\t  &adapter->ebuf))\n+\t\t;\n+}\n static inline unsigned int\n eca_crypto_adapter_deq_run(struct event_crypto_adapter *adapter,\n \t\t\t   unsigned int max_deq)\n@@ -571,7 +714,7 @@ eca_crypto_adapter_deq_run(struct event_crypto_adapter *adapter,\n \tstruct crypto_device_info *curr_dev;\n \tstruct crypto_queue_pair_info *curr_queue;\n \tstruct rte_crypto_op *ops[BATCH_SIZE];\n-\tuint16_t n, nb_deq;\n+\tuint16_t n, nb_deq, nb_enqueued, i;\n \tstruct rte_cryptodev *dev;\n \tuint8_t cdev_id;\n \tuint16_t qp, dev_qps;\n@@ -579,16 +722,20 @@ eca_crypto_adapter_deq_run(struct event_crypto_adapter *adapter,\n \tuint16_t num_cdev = rte_cryptodev_count();\n \n \tnb_deq = 0;\n+\teca_ops_buffer_flush(adapter);\n+\n \tdo {\n-\t\tuint16_t queues = 0;\n \t\tdone = true;\n \n \t\tfor (cdev_id = adapter->next_cdev_id;\n \t\t\tcdev_id < num_cdev; cdev_id++) {\n+\t\t\tuint16_t queues = 0;\n+\n \t\t\tcurr_dev = &adapter->cdevs[cdev_id];\n \t\t\tdev = curr_dev->dev;\n \t\t\tif (dev == NULL)\n \t\t\t\tcontinue;\n+\n \t\t\tdev_qps = dev->data->nb_queue_pairs;\n \n \t\t\tfor (qp = curr_dev->next_queue_pair_id;\n@@ -605,8 +752,24 @@ eca_crypto_adapter_deq_run(struct event_crypto_adapter *adapter,\n \t\t\t\t\tcontinue;\n \n \t\t\t\tdone = false;\n+\t\t\t\tnb_enqueued = 0;\n+\n \t\t\t\tstats->crypto_deq_count += n;\n-\t\t\t\teca_ops_enqueue_burst(adapter, ops, n);\n+\n+\t\t\t\tif (unlikely(!adapter->ebuf.count))\n+\t\t\t\t\tnb_enqueued = eca_ops_enqueue_burst(\n+\t\t\t\t\t\t\tadapter, ops, n);\n+\n+\t\t\t\tif (nb_enqueued == n)\n+\t\t\t\t\tgoto check;\n+\n+\t\t\t\t/* Failed to enqueue events case */\n+\t\t\t\tfor (i = nb_enqueued; i < n; i++)\n+\t\t\t\t\teca_circular_buffer_add(\n+\t\t\t\t\t\t&adapter->ebuf,\n+\t\t\t\t\t\tops[nb_enqueued]);\n+\n+check:\n \t\t\t\tnb_deq += n;\n \n \t\t\t\tif (nb_deq > max_deq) {\n@@ -751,11 +914,10 @@ eca_add_queue_pair(struct event_crypto_adapter *adapter, uint8_t cdev_id,\n \t\t\treturn -ENOMEM;\n \n \t\tqpairs = dev_info->qpairs;\n-\t\tqpairs->op_buffer = rte_zmalloc_socket(adapter->mem_name,\n-\t\t\t\t\tBATCH_SIZE *\n-\t\t\t\t\tsizeof(struct rte_crypto_op *),\n-\t\t\t\t\t0, adapter->socket_id);\n-\t\tif (!qpairs->op_buffer) {\n+\n+\t\tif (eca_circular_buffer_init(\"eca_cdev_circular_buffer\",\n+\t\t\t\t\t     &qpairs->cbuf,\n+\t\t\t\t\t     CRYPTO_ADAPTER_OPS_BUFFER_SZ)) {\n \t\t\trte_free(qpairs);\n \t\t\treturn -ENOMEM;\n \t\t}\ndiff --git a/lib/eventdev/rte_eventdev.c b/lib/eventdev/rte_eventdev.c\nindex 79b9ea3..6988bf1 100644\n--- a/lib/eventdev/rte_eventdev.c\n+++ b/lib/eventdev/rte_eventdev.c\n@@ -176,11 +176,15 @@ rte_event_crypto_adapter_caps_get(uint8_t dev_id, uint8_t cdev_id,\n \n \tif (caps == NULL)\n \t\treturn -EINVAL;\n-\t*caps = 0;\n+\n+\tif (dev->dev_ops->crypto_adapter_caps_get == NULL)\n+\t\t*caps = RTE_EVENT_CRYPTO_ADAPTER_SW_CAP;\n+\telse\n+\t\t*caps = 0;\n \n \treturn dev->dev_ops->crypto_adapter_caps_get ?\n \t\t(*dev->dev_ops->crypto_adapter_caps_get)\n-\t\t(dev, cdev, caps) : -ENOTSUP;\n+\t\t(dev, cdev, caps) : 0;\n }\n \n int\n",
    "prefixes": [
        "v1"
    ]
}