get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 60812,
    "url": "http://patches.dpdk.org/api/patches/60812/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1570633816-4706-7-git-send-email-anoobj@marvell.com/",
    "project": {
        "id": 1,
        "url": "http://patches.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": "<1570633816-4706-7-git-send-email-anoobj@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1570633816-4706-7-git-send-email-anoobj@marvell.com",
    "date": "2019-10-09T15:10:09",
    "name": "[RFC,06/13] examples/ipsec-secgw: add routines to launch workers",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "4784dbda0b7aaa5ff35968ad20394fa953722414",
    "submitter": {
        "id": 1205,
        "url": "http://patches.dpdk.org/api/people/1205/?format=api",
        "name": "Anoob Joseph",
        "email": "anoobj@marvell.com"
    },
    "delegate": {
        "id": 6690,
        "url": "http://patches.dpdk.org/api/users/6690/?format=api",
        "username": "akhil",
        "first_name": "akhil",
        "last_name": "goyal",
        "email": "gakhil@marvell.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1570633816-4706-7-git-send-email-anoobj@marvell.com/mbox/",
    "series": [
        {
            "id": 6769,
            "url": "http://patches.dpdk.org/api/series/6769/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=6769",
            "date": "2019-10-09T15:10:03",
            "name": "add eventmode to ipsec-secgw",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/6769/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/60812/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/60812/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id BB7331E91B;\n\tWed,  9 Oct 2019 17:11:02 +0200 (CEST)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n\t[67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 38BA11E91B\n\tfor <dev@dpdk.org>; Wed,  9 Oct 2019 17:11:01 +0200 (CEST)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n\tby mx0b-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id\n\tx99EscIZ024426; Wed, 9 Oct 2019 08:11:00 -0700",
            "from sc-exch04.marvell.com ([199.233.58.184])\n\tby mx0b-0016f401.pphosted.com with ESMTP id 2vhdxbrwmu-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); \n\tWed, 09 Oct 2019 08:11:00 -0700",
            "from SC-EXCH03.marvell.com (10.93.176.83) by SC-EXCH04.marvell.com\n\t(10.93.176.84) with Microsoft SMTP Server (TLS) id 15.0.1367.3;\n\tWed, 9 Oct 2019 08:10:58 -0700",
            "from maili.marvell.com (10.93.176.43) by SC-EXCH03.marvell.com\n\t(10.93.176.83) with Microsoft SMTP Server id 15.0.1367.3 via Frontend\n\tTransport; Wed, 9 Oct 2019 08:10:58 -0700",
            "from ajoseph83.caveonetworks.com.com (unknown [10.29.45.60])\n\tby maili.marvell.com (Postfix) with ESMTP id 9C9773F703F;\n\tWed,  9 Oct 2019 08:10:55 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n\th=from : to : cc :\n\tsubject : date : message-id : in-reply-to : references : mime-version\n\t: content-transfer-encoding : content-type; s=pfpt0818;\n\tbh=jHFxj+lms3NYD/Vrs14rMrzG6YbFp7Js+uSjcpbRNg8=;\n\tb=VsIIRjkwASSn4IAN1LBj+lfupjEO/P1T+FT8GBbCKBy3QHsS2xc6eD91JUr1+zkgdTnL\n\tNcQuoyNfj31kl7U/R7u62O/T8kseUouGIGGrKanzPHXAdxv7z2UmILD/0ABKGRQ+XVO2\n\tQWxFtnMDNz5dqeYTpbRsaj4qpGs3ju0XwCSgA3M0ho3V6sOdZwi8ecHFejTwj7sZs2xF\n\tjIDPfZQ7IOSiZlOHPOx5njyPh5LeF9Yh6YwnLVjye4m7OIX7PA121HQY+5i1gn0f928H\n\t101gJsDabPSZr72y6YnzuD4EfU5r++vkBus3r2tSSRORTW3B+e3L3ul7YMwvOLsCSu0f\n\tiQ== ",
        "From": "Anoob Joseph <anoobj@marvell.com>",
        "To": "Akhil Goyal <akhil.goyal@nxp.com>, Radu Nicolau <radu.nicolau@intel.com>",
        "CC": "Anoob Joseph <anoobj@marvell.com>, Thomas Monjalon <thomas@monjalon.net>,\n\tJerin Jacob <jerinj@marvell.com>,\n\tNarayana Prasad <pathreya@marvell.com>, <dev@dpdk.org>,\n\tLukasz Bartosik <lbartosik@marvell.com>",
        "Date": "Wed, 9 Oct 2019 20:40:09 +0530",
        "Message-ID": "<1570633816-4706-7-git-send-email-anoobj@marvell.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1570633816-4706-1-git-send-email-anoobj@marvell.com>",
        "References": "<1570633816-4706-1-git-send-email-anoobj@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10434:6.0.95,1.0.8\n\tdefinitions=2019-10-09_06:2019-10-08,2019-10-09 signatures=0",
        "Subject": "[dpdk-dev] [RFC PATCH 06/13] examples/ipsec-secgw: add routines to\n\tlaunch workers",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "With eventmode, workers can be drafted differently according to the\ncapabilities of the underlying event device. The added functions will\nreceive an array of such workers and probe the eventmode properties to\nchoose the worker.\n\nSigned-off-by: Anoob Joseph <anoobj@marvell.com>\nSigned-off-by: Lukasz Bartosik <lbartosik@marvell.com>\n---\n examples/ipsec-secgw/event_helper.c | 347 +++++++++++++++++++++++++++++++++++-\n examples/ipsec-secgw/event_helper.h |  48 +++++\n 2 files changed, 391 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/examples/ipsec-secgw/event_helper.c b/examples/ipsec-secgw/event_helper.c\nindex c43360e..6993092 100644\n--- a/examples/ipsec-secgw/event_helper.c\n+++ b/examples/ipsec-secgw/event_helper.c\n@@ -1,6 +1,7 @@\n /* SPDX-License-Identifier: BSD-3-Clause\n  * Copyright (C) 2019 Marvell International Ltd.\n  */\n+#include <stdbool.h>\n #include <rte_event_eth_rx_adapter.h>\n #include <rte_event_eth_tx_adapter.h>\n #include <rte_ethdev.h>\n@@ -9,6 +10,8 @@\n \n #include \"event_helper.h\"\n \n+static volatile bool eth_core_running;\n+\n static int\n eh_get_enabled_cores(struct rte_bitmap *eth_core_mask)\n {\n@@ -98,6 +101,16 @@ eh_get_eventdev_params(struct eventmode_conf *em_conf,\n \n \treturn &(em_conf->eventdev_config[i]);\n }\n+static inline bool\n+eh_dev_has_burst_mode(uint8_t dev_id)\n+{\n+\tstruct rte_event_dev_info dev_info;\n+\n+\trte_event_dev_info_get(dev_id, &dev_info);\n+\treturn (dev_info.event_dev_cap & RTE_EVENT_DEV_CAP_BURST_MODE) ?\n+\t\t\ttrue : false;\n+}\n+\n static int\n eh_validate_user_params(struct eventmode_conf *em_conf)\n {\n@@ -692,10 +705,8 @@ eh_rx_adapter_configure(struct eventmode_conf *em_conf,\n \t}\n \n \t/*\n-\t * TODO\n \t * Rx core will invoke the service when required. The runstate check\n \t * is not required.\n-\t *\n \t */\n \trte_service_set_runstate_mapped_check(service_id, 0);\n \n@@ -727,6 +738,262 @@ eh_initialize_rx_adapter(struct eventmode_conf *em_conf)\n \treturn 0;\n }\n \n+static int32_t\n+eh_start_worker_eth_core(struct eventmode_conf *em_conf, uint32_t lcore_id)\n+{\n+\tuint32_t service_id[EVENT_MODE_MAX_ADAPTERS_PER_RX_CORE];\n+\tstruct rx_adapter_conf *rx_adapter;\n+\tstruct tx_adapter_conf *tx_adapter;\n+\tint service_count = 0;\n+\tint adapter_id;\n+\tint32_t ret;\n+\tint i;\n+\n+\tEH_LOG_INFO(\"Entering eth_core processing on lcore %u\", lcore_id);\n+\n+\t/*\n+\t * Need to parse adapter conf to see which of all Rx adapters need\n+\t * to be handled by this core.\n+\t */\n+\tfor (i = 0; i < em_conf->nb_rx_adapter; i++) {\n+\t\t/* Check if we have exceeded the max allowed */\n+\t\tif (service_count > EVENT_MODE_MAX_ADAPTERS_PER_RX_CORE) {\n+\t\t\tEH_LOG_ERR(\n+\t\t\t      \"Exceeded the max allowed adapters per rx core\");\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\trx_adapter = &(em_conf->rx_adapter[i]);\n+\t\tif (rx_adapter->rx_core_id != lcore_id)\n+\t\t\tcontinue;\n+\n+\t\t/* Adapter need to be handled by this core */\n+\t\tadapter_id = rx_adapter->adapter_id;\n+\n+\t\t/* Get the service ID for the adapters */\n+\t\tret = rte_event_eth_rx_adapter_service_id_get(adapter_id,\n+\t\t\t\t&(service_id[service_count]));\n+\n+\t\tif (ret != -ESRCH && ret != 0) {\n+\t\t\tEH_LOG_ERR(\n+\t\t\t\t\"Error getting service ID used by Rx adapter\");\n+\t\t\treturn ret;\n+\t\t}\n+\n+\t\t/* Update service count */\n+\t\tservice_count++;\n+\t}\n+\n+\t/*\n+\t * Need to parse adapter conf to see which all Tx adapters need to be\n+\t * handled this core.\n+\t */\n+\tfor (i = 0; i < em_conf->nb_tx_adapter; i++) {\n+\t\t/* Check if we have exceeded the max allowed */\n+\t\tif (service_count > EVENT_MODE_MAX_ADAPTERS_PER_TX_CORE) {\n+\t\t\tEH_LOG_ERR(\n+\t\t\t\t\"Exceeded the max allowed adapters per Tx core\");\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\ttx_adapter = &(em_conf->tx_adapter[i]);\n+\t\tif (tx_adapter->tx_core_id != lcore_id)\n+\t\t\tcontinue;\n+\n+\t\t/* Adapter need to be handled by this core */\n+\t\tadapter_id = tx_adapter->adapter_id;\n+\n+\t\t/* Get the service ID for the adapters */\n+\t\tret = rte_event_eth_tx_adapter_service_id_get(adapter_id,\n+\t\t\t\t&(service_id[service_count]));\n+\n+\t\tif (ret != -ESRCH && ret != 0) {\n+\t\t\tEH_LOG_ERR(\n+\t\t\t\t\"Error getting service ID used by Tx adapter\");\n+\t\t\treturn ret;\n+\t\t}\n+\n+\t\t/* Update service count */\n+\t\tservice_count++;\n+\t}\n+\n+\teth_core_running = true;\n+\n+\twhile (eth_core_running) {\n+\t\tfor (i = 0; i < service_count; i++) {\n+\t\t\t/* Initiate adapter service */\n+\t\t\trte_service_run_iter_on_app_lcore(service_id[i], 0);\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int32_t\n+eh_stop_worker_eth_core(void)\n+{\n+\tif (eth_core_running) {\n+\t\tEH_LOG_INFO(\"Stopping eth cores\");\n+\t\teth_core_running = false;\n+\t}\n+\treturn 0;\n+}\n+\n+static struct eh_app_worker_params *\n+eh_find_worker(uint32_t lcore_id, struct eh_conf *conf,\n+\t\tstruct eh_app_worker_params *app_wrkrs, uint8_t nb_wrkr_param)\n+{\n+\tstruct eh_event_link_info *link = NULL;\n+\tstruct eventmode_conf *em_conf;\n+\tuint8_t eventdev_id;\n+\tint i;\n+\tstruct eh_app_worker_params curr_conf = {\n+\t\t\t{{0} }, NULL};\n+\tstruct eh_app_worker_params *tmp_wrkr;\n+\n+\t/* Get eventmode conf */\n+\tem_conf = (struct eventmode_conf *)(conf->mode_params);\n+\n+\t/*\n+\t * Event device to be used will be derived from the first lcore-event\n+\t * link.\n+\t *\n+\t * Assumption: All lcore-event links tied to a core would be using the\n+\t * same event device. in other words, one core would be polling on\n+\t * queues of a single event device only.\n+\t */\n+\n+\t/* Get a link for this lcore */\n+\tfor (i = 0; i < em_conf->nb_link; i++) {\n+\t\tlink = &(em_conf->link[i]);\n+\t\tif (link->lcore_id == lcore_id)\n+\t\t\tbreak;\n+\t}\n+\n+\tif (link == NULL) {\n+\t\tEH_LOG_ERR(\n+\t\t\t\"No valid link found for lcore(%d)\", lcore_id);\n+\t\treturn NULL;\n+\t}\n+\n+\t/* Get event dev ID */\n+\teventdev_id = link->eventdev_id;\n+\n+\t/* Populate the curr_conf with the capabilities */\n+\n+\t/* Check for burst mode */\n+\tif (eh_dev_has_burst_mode(eventdev_id))\n+\t\tcurr_conf.cap.burst = EH_RX_TYPE_BURST;\n+\telse\n+\t\tcurr_conf.cap.burst = EH_RX_TYPE_NON_BURST;\n+\n+\t/* Now parse the passed list and see if we have matching capabilities */\n+\n+\t/* Initialize the pointer used to traverse the list */\n+\ttmp_wrkr = app_wrkrs;\n+\n+\tfor (i = 0; i < nb_wrkr_param; i++, tmp_wrkr++) {\n+\n+\t\t/* Skip this if capabilities are not matching */\n+\t\tif (tmp_wrkr->cap.u64 != curr_conf.cap.u64)\n+\t\t\tcontinue;\n+\n+\t\t/* If the checks pass, we have a match */\n+\t\treturn tmp_wrkr;\n+\t}\n+\n+\treturn NULL;\n+}\n+\n+static int\n+eh_verify_match_worker(\n+\tstruct eh_app_worker_params *match_wrkr)\n+{\n+\t/* Verify registered worker */\n+\tif (match_wrkr->worker_thread == NULL) {\n+\t\tEH_LOG_ERR(\"No worker registered for second stage\");\n+\t\treturn 0;\n+\t}\n+\n+\t/* Success */\n+\treturn 1;\n+}\n+\n+static uint8_t\n+eh_get_event_lcore_links(uint32_t lcore_id, struct eh_conf *mode_conf,\n+\t\tstruct eh_event_link_info **links)\n+{\n+\tint i;\n+\tint index = 0;\n+\tuint8_t lcore_nb_link = 0;\n+\tstruct eh_event_link_info *link;\n+\tstruct eh_event_link_info *link_cache;\n+\tstruct eventmode_conf *em_conf = NULL;\n+\tsize_t cache_size;\n+\tsize_t single_link_size;\n+\n+\tif (mode_conf == NULL || links == NULL) {\n+\t\tEH_LOG_ERR(\"Invalid args\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* Get eventmode conf */\n+\tem_conf = (struct eventmode_conf *)(mode_conf->mode_params);\n+\n+\tif (em_conf == NULL) {\n+\t\tEH_LOG_ERR(\"Invalid event mode conf\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* Get the number of links registered */\n+\tfor (i = 0; i < em_conf->nb_link; i++) {\n+\n+\t\t/* Get link */\n+\t\tlink = &(em_conf->link[i]);\n+\n+\t\t/* Check if we have link intended for this lcore */\n+\t\tif (link->lcore_id == lcore_id) {\n+\n+\t\t\t/* Update the number of links for this core */\n+\t\t\tlcore_nb_link++;\n+\n+\t\t}\n+\t}\n+\n+\t/* Compute size of one entry to be copied */\n+\tsingle_link_size = sizeof(struct eh_event_link_info);\n+\n+\t/* Compute size of the buffer required */\n+\tcache_size = lcore_nb_link *\n+\t\t\tsizeof(struct eh_event_link_info);\n+\n+\t/* Compute size of the buffer required */\n+\tlink_cache = calloc(1, cache_size);\n+\n+\t/* Get the number of links registered */\n+\tfor (i = 0; i < em_conf->nb_link; i++) {\n+\n+\t\t/* Get link */\n+\t\tlink = &(em_conf->link[i]);\n+\n+\t\t/* Check if we have link intended for this lcore */\n+\t\tif (link->lcore_id == lcore_id) {\n+\n+\t\t\t/* Cache the link */\n+\t\t\tmemcpy(&link_cache[index], link, single_link_size);\n+\n+\t\t\t/* Update index */\n+\t\t\tindex++;\n+\t\t}\n+\t}\n+\n+\t/* Update the links for application to use the cached links */\n+\t*links = link_cache;\n+\n+\t/* Return the number of cached links */\n+\treturn lcore_nb_link;\n+}\n+\n static int\n eh_tx_adapter_configure(struct eventmode_conf *em_conf,\n \tstruct tx_adapter_conf *adapter)\n@@ -833,10 +1100,8 @@ eh_tx_adapter_configure(struct eventmode_conf *em_conf,\n \t}\n \n \t/*\n-\t * TODO\n \t * Tx core will invoke the service when required. The runstate check\n \t * is not required.\n-\t *\n \t */\n \trte_service_set_runstate_mapped_check(service_id, 0);\n \n@@ -1246,6 +1511,80 @@ eh_devs_uninit(struct eh_conf *mode_conf)\n \treturn 0;\n }\n \n+void\n+eh_launch_worker(struct eh_conf *mode_conf,\n+\t\tstruct eh_app_worker_params *app_wrkr, uint8_t nb_wrkr_param)\n+{\n+\tstruct eh_app_worker_params *match_wrkr;\n+\tstruct eh_event_link_info *links = NULL;\n+\tstruct eventmode_conf *em_conf;\n+\tuint32_t lcore_id;\n+\tuint8_t nb_links;\n+\n+\tif (mode_conf == NULL) {\n+\t\tEH_LOG_ERR(\"Invalid conf\");\n+\t\treturn;\n+\t}\n+\n+\tif (mode_conf->mode_params == NULL) {\n+\t\tEH_LOG_ERR(\"Invalid mode params\");\n+\t\treturn;\n+\t}\n+\n+\t/* Get eventmode conf */\n+\tem_conf = (struct eventmode_conf *)(mode_conf->mode_params);\n+\n+\t/* Get core ID */\n+\tlcore_id = rte_lcore_id();\n+\n+\t/* Check if this is eth core */\n+\tif (rte_bitmap_get(em_conf->eth_core_mask, lcore_id)) {\n+\t\teh_start_worker_eth_core(em_conf, lcore_id);\n+\t\treturn;\n+\t}\n+\n+\tif (app_wrkr == NULL || nb_wrkr_param == 0) {\n+\t\tEH_LOG_ERR(\"Invalid args\");\n+\t\treturn;\n+\t}\n+\n+\t/*\n+\t * This is a regular worker thread. The application would be\n+\t * registering multiple workers with various capabilities. The\n+\t * worker to be run will be selected by the capabilities of the\n+\t * event device configured.\n+\t */\n+\n+\t/* Get the first matching worker for the event device */\n+\tmatch_wrkr = eh_find_worker(lcore_id, mode_conf, app_wrkr,\n+\t\t\t\t    nb_wrkr_param);\n+\tif (match_wrkr == NULL) {\n+\t\tEH_LOG_ERR(\n+\t\t       \"No matching worker registered for lcore %d\", lcore_id);\n+\t\tgoto clean_and_exit;\n+\t}\n+\n+\t/* Verify sanity of the matched worker */\n+\tif (eh_verify_match_worker(match_wrkr) != 1) {\n+\t\tEH_LOG_ERR(\"Error in validating the matched worker\\n\");\n+\t\tgoto clean_and_exit;\n+\t}\n+\n+\t/* Get worker links */\n+\tnb_links = eh_get_event_lcore_links(lcore_id, mode_conf, &links);\n+\n+\t/* Launch the worker thread */\n+\tmatch_wrkr->worker_thread(mode_conf, links, nb_links);\n+\n+\t/* Free links info memory */\n+\tfree(links);\n+\n+clean_and_exit:\n+\n+\t/* Flag eth_cores to stop, if started */\n+\teh_stop_worker_eth_core();\n+}\n+\n uint8_t\n eh_get_tx_queue(struct eh_conf *mode_conf, uint8_t eventdev_id)\n {\ndiff --git a/examples/ipsec-secgw/event_helper.h b/examples/ipsec-secgw/event_helper.h\nindex c7fdd8f..1d5a087 100644\n--- a/examples/ipsec-secgw/event_helper.h\n+++ b/examples/ipsec-secgw/event_helper.h\n@@ -54,6 +54,9 @@ extern \"C\" {\n #define EVENT_MODE_MAX_LCORE_LINKS \\\n \t(EVENT_MODE_MAX_EVENT_DEVS * EVENT_MODE_MAX_EVENT_QUEUES_PER_DEV)\n \n+/* Max adapters that one Rx core can handle */\n+#define EVENT_MODE_MAX_ADAPTERS_PER_RX_CORE EVENT_MODE_MAX_RX_ADAPTERS\n+\n /* Max adapters that one Tx core can handle */\n #define EVENT_MODE_MAX_ADAPTERS_PER_TX_CORE EVENT_MODE_MAX_TX_ADAPTERS\n \n@@ -65,6 +68,14 @@ enum eh_pkt_transfer_mode {\n \tEH_PKT_TRANSFER_MODE_EVENT,\n };\n \n+/**\n+ * Event mode packet rx types\n+ */\n+enum eh_rx_types {\n+\tEH_RX_TYPE_NON_BURST = 0,\n+\tEH_RX_TYPE_BURST\n+};\n+\n /* Event dev params */\n struct eventdev_params {\n \tuint8_t eventdev_id;\n@@ -175,6 +186,22 @@ struct eh_conf {\n \t\t/**< Mode specific parameters */\n };\n \n+/* Workers registered by the application */\n+struct eh_app_worker_params {\n+\tunion {\n+\t\tRTE_STD_C11\n+\t\tstruct {\n+\t\t\tuint64_t burst : 1;\n+\t\t\t/**< Specify status of rx type burst */\n+\t\t};\n+\t\tuint64_t u64;\n+\t} cap;\n+\t\t\t/**< Capabilities of this worker */\n+\tvoid (*worker_thread)(struct eh_conf *mode_conf,\n+\t\t\tstruct eh_event_link_info *links, uint8_t nb_links);\n+\t\t\t/**< Worker thread */\n+};\n+\n /**\n  * Initialize event mode devices\n  *\n@@ -242,6 +269,27 @@ eh_get_tx_queue(struct eh_conf *mode_conf, uint8_t eventdev_id);\n void\n eh_display_conf(struct eh_conf *mode_conf);\n \n+\n+/**\n+ * Launch eventmode worker\n+ *\n+ * The application can request the eventmode helper subsystem to launch the\n+ * worker based on the capabilities of event device and the options selected\n+ * while initializing the eventmode.\n+ *\n+ * @param mode_conf\n+ *   Configuration of the mode in which app is doing packet handling\n+ * @param app_wrkr\n+ *   List of all the workers registered by application, along with its\n+ *   capabilities\n+ * @param nb_wrkr_param\n+ *   Number of workers passed by the application\n+ *\n+ */\n+void\n+eh_launch_worker(struct eh_conf *mode_conf,\n+\t\tstruct eh_app_worker_params *app_wrkr, uint8_t nb_wrkr_param);\n+\n #ifdef __cplusplus\n }\n #endif\n",
    "prefixes": [
        "RFC",
        "06/13"
    ]
}