get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 136301,
    "url": "http://patches.dpdk.org/api/patches/136301/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240202030415.739638-3-chaoyong.he@corigine.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": "<20240202030415.739638-3-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240202030415.739638-3-chaoyong.he@corigine.com",
    "date": "2024-02-02T03:04:14",
    "name": "[v2,2/3] net/nfp: create new service code related files",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "1ee27b36b30461522178beca88f376cbfaf5c503",
    "submitter": {
        "id": 2554,
        "url": "http://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20240202030415.739638-3-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 30978,
            "url": "http://patches.dpdk.org/api/series/30978/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=30978",
            "date": "2024-02-02T03:04:12",
            "name": "enhance NFP service framework",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/30978/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/136301/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/136301/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 8968543A49;\n\tFri,  2 Feb 2024 04:05:04 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id E1CBE42E04;\n\tFri,  2 Feb 2024 04:04:51 +0100 (CET)",
            "from NAM10-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam10on2100.outbound.protection.outlook.com [40.107.94.100])\n by mails.dpdk.org (Postfix) with ESMTP id 89A4F42DB0\n for <dev@dpdk.org>; Fri,  2 Feb 2024 04:04:49 +0100 (CET)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by SN7PR13MB6177.namprd13.prod.outlook.com (2603:10b6:806:2e3::15)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.30; Fri, 2 Feb\n 2024 03:04:47 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::8e02:f738:570a:f8aa]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::8e02:f738:570a:f8aa%7]) with mapi id 15.20.7249.024; Fri, 2 Feb 2024\n 03:04:47 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=JDFirxTPLoN7TQTK2DjyOorPGziv/QGoGhhmfEC3+65c1KU2Yjx/8bSyokr0JR3E5wvU6YBrYOSqMK20YR2Q8oruLP2L2uHtVF08+hYns1MM2h2EFOeUJnrlMxJEPgE3GkohBJ09zuzQwZ7rb9aTkKBuFXaX4RbbBlLWjdz5faTV1F3gYMREZnLELb2UzF3nJ4alWFbO5O/uXmhFRU3G/XFQB/20n7ZfBH9mu8jhg7vYRNjcHtnQ3hvJDAgeXoUFW9V8Co5+55RsZGyQhJLXW6SLNHuP/EywBs3/wCHe92eXiI7R4fFZ31e5te6txhID1I+j0DZ4DLwQauUj9TA6tQ==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=mBymKcu233OT634MNGzU/vumLhHr+uy6wWgT2qVo48g=;\n b=Eao5W6+YWRMKRVhKvQkndCKuMpPSGbwx4G1Iy50uBa3PujX04l1VwqGxhsq43SfBHq2q7E2pvkJcBsmdO76uokgT8+p2fP6ycfYv0Gw3g+BbPo57p/hrpdZZ0LUOWsekSHjplgGdnCATfFslHLJig6XIi5hdj1EzmrGwBw64lLxWB6EvmFOBSGUMsrKFe9Lo0Tx8i571fmJaSoGxthasjsYGIZOgkzgFIFQ7A8+PZDiSG5nh85vZI5nrI+Q3B64R/m7HZGZgRN55rVUKKMdIsl5UwL47C6ANVRcQR6UvQnUbO9xaW//4iShJqGe+JRNnzlTxs5AdCWBcKYVU2k3+eQ==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;\n dkim=pass header.d=corigine.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=mBymKcu233OT634MNGzU/vumLhHr+uy6wWgT2qVo48g=;\n b=FcoQ/waqbRHri5jqZ7Mk/1g+Ge3dISyjGDrByiYoRWyayg+sV+AFUCDLsz4oFenBOzxaTp0RnGJIH6Ww9FIwlDZq8rxXFWNYPDgrjwCid2ouL94f4Y+P0Mz9JusYx2PYPz//gKgjZjqqJeF0U/rNVpmWg7eyVyyOAuVJHP0rSjk=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=corigine.com;",
        "From": "Chaoyong He <chaoyong.he@corigine.com>",
        "To": "dev@dpdk.org",
        "Cc": "oss-drivers@corigine.com, Long Wu <long.wu@corigine.com>,\n Chaoyong He <chaoyong.he@corigine.com>,\n Peng Zhang <peng.zhang@corigine.com>",
        "Subject": "[PATCH v2 2/3] net/nfp: create new service code related files",
        "Date": "Fri,  2 Feb 2024 11:04:14 +0800",
        "Message-Id": "<20240202030415.739638-3-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20240202030415.739638-1-chaoyong.he@corigine.com>",
        "References": "<20240124092541.2011874-1-chaoyong.he@corigine.com>\n <20240202030415.739638-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "BYAPR05CA0004.namprd05.prod.outlook.com\n (2603:10b6:a03:c0::17) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ0PR13MB5545:EE_|SN7PR13MB6177:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "03913fe7-bc67-4fec-71fb-08dc239bb6c0",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n 6UuVRyPLjiq8XvPYt2e1WQxNuq5UZwLvWnUxSWf+dPnDO/mNfIKRA5TkTVUPUmpCzrABQfUwj3NJvasjcuq53mHhbFq+5wxb63IdXi70MMwbXPhEGyislA95LToqjjv0m63NGgubDbkb0oVDK4z79hqJ2MusXxUvEND+vMJyjLHCVTHjq4fyByvwhxGokWIx7A+/ZZ3A3MfR8UiLZ+pQDGA2Owfco9HreayMGJCeeepybiFgQvwTk4Ni89tIlrsWvSeqGhaMD9NStK9WUnU3TioH794xptwbIZRe65yAn0cAla7558ACrP8pWqKodyCRCyu2Ati7PxKI0w6v45/9EmlkhXqksdj04clRqbPTW+bGxtualRec3sdS4JodIXCpAYOx6JA4ZD9mu18XINNlPsP6VW5R2L6acDyvrVhAYDpLLV2vqLuRieRUja6xeUsgO1bKd4o9WLXygq28g0G1z/gNOup18yCbblOI9j/9ebW3ZsmYlcHYHIZt8TlinLYL1goN2uA+8VsjMgC0lwXPshSIKj5FjvZLTpPwD1pgOxkEypBG9o73O6V32FiwvjYTuZlISkyDcddAtGIt+Q44YiDSZD7DZlSbWCVezzjR9NhmvEjzKxQlTV7VkqbeVDYTpAsYL/2XiUScNYU3RaOC2gZArDnObQYQOuyPr8Z1LFA=",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230031)(366004)(136003)(376002)(396003)(39840400004)(346002)(230273577357003)(230173577357003)(230922051799003)(451199024)(186009)(64100799003)(1800799012)(41300700001)(1076003)(107886003)(26005)(2616005)(6916009)(38350700005)(316002)(36756003)(478600001)(6512007)(6486002)(83380400001)(52116002)(6506007)(6666004)(38100700002)(86362001)(2906002)(5660300002)(30864003)(66946007)(54906003)(66476007)(66556008)(8936002)(44832011)(8676002)(4326008);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n oNxCH+opJrSoWPCm0kcPX68E//cjS/lbcI1lHsFYEnP9xBoYpLaCIENMSN19l22zu6OoOZ5Wz0xbSsOxeYb34IYtXLMUvGxtt3SRuBkjECtt6prvFBcp/MCFcfPZOTN4MpN6xoqYMzeVWRQNEmqVBnS0689c5622Z39FS5vxVrHlP6n96iiQ1jO0Cc60trsRq91UaopU2o50KIlQGDXYk9T8dSvZYgl9oARhLpybICREfP2ySQA1QkzHSB1gsNZ+61hFdgKL0G+9V0LmPNzO5wqVmlBcZWRw1C+KQfiXkLx/ZMmf1Q9/Su+J9Bqq9xVEgPLyPNUFMl7h2/wr2IxQsOVcQKIC8pHHSeNYQITc6DwEQNUAfqN/56LzRUa2McBDRLgEhP8OeP4CsmT5A5uA96zOpxqAjkHa6dHI8zzO5S673K+/ZPhrgQroeJEEZVpvGtjcoGs4CJlP9DNiGreRHTgeOfqxo4UcNVAPvuplkmo7iiZbPT4NlsP5kCDseHOW7k2OZOKgSZqImiu+2AqqqpqTTY+uAWglzr0bGPvYfMP3zrmrI8SCUvrryxbjZskU37zqbog/oOT014R2xH9Zy40FryPVdzIEeRy0aidN0U0pXKBQO8ib9ncxV9ssfq/rkEsEnFps1A/XY5oCXVvjO3d3kepcv7XByuJnHkDLhLU6nqQFo/TfkzD74/rf8lsR9yWBG628hQxGeH/IG2SnxadfkJWxJvQ2bSi3nMrAVhH36XgD/8MyhnBtF1MDG/jYz+JseXtBWOcmRFJDsluubic/KA1lvkg273aJzTAXT2AFz/yApgWnstjXk2J8e6g8owNfOG+uVKmdw8v+O3SQ0yTkWoPM4f+OD/caY95tUbxWt0SBJhKiVtXRp02+zktqEl01p9tfePYxMyTZE50uZL1zxRx2bsrmnJ8rnRPd+ct/5oQOMzEPHCpuSXJIUKTpSvwmFNHB5YOxiRjkwxJ+ISZoiF3sNRHRxkgYot1UkKcsaY2FotFCgXQWOE/OT/PcrfYrjlgKoqy95yYFiLQjQKHSJ1gCqy1aTjC5DXoMBP1Zwg/T5kNqf87bUYU94BJWhvGost0iqvvtzoWp4+Tk7rgbRvrHTaDdXOjXXzkKSVoGmMuqSD0FT5D6aYDCHLxswg7ws77cZZ+0YAfaSPzQYPwX+4dgYbn31FkvaB6CAwc8PV+Ndw3yN8UTE/+az0qgAvPIi7gYlJMvnsqCZ0WXu3Dip4Z3FUcut7bjkvRVLFqDEExvRgNv7D9lYetO3NTI/jKl34wpOO+Z7lOvP+qPlyVr3uN8GOrsTcbi1NTFjB92isXegLZn8d1AzQYjqgJLH1gHkJyj+AqqFvLb6Uax/woge0dhVevhKk1cnlOKZa/25P9OurYIZW380/4HHrmDMKcW+MERDpE62VbiAGysM7vAomTf4hff7XaH7XUiZ4cvB+nsjh6PQ1WocnRtuhzlBk5kI8/S5TVuqIZzhor+mcsq4XwqpzI0C6e1M4ZERTItFWv9G9o4B+FWtwGwpBZOlIQr4YfrEPbEoMHziAHdnm9RyQ6mFvkqOgBEIWfZwQe49SWgwnBTyleP5oi3Jc76kRaFUKqoZK1SPQnn0OS8Hg==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 03913fe7-bc67-4fec-71fb-08dc239bb6c0",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "02 Feb 2024 03:04:47.5218 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "fe128f2c-073b-4c20-818e-7246a585940c",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n 0l7kzKvzCb0kh7omwdG5a+CbcJWM2tPw6UreRUPCUou2J8RGs5F+GN2fgtaQiShhNhm+bsXs/zrthMH0+iji7Xo5giMV6JLquj0uDCd1aT8=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "SN7PR13MB6177",
        "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": "From: Long Wu <long.wu@corigine.com>\n\nFor clearer service code structure and more convenient future\naddition of service code, NFP creates new service code related\nfiles and move service related code into new files.\n\nThis commit also adds service disable interface and lets CPP\nservice run normally if app uses several flower cards.\n\nSigned-off-by: Long Wu <long.wu@corigine.com>\nReviewed-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Peng Zhang <peng.zhang@corigine.com>\n---\n drivers/net/nfp/flower/nfp_flower.c           |  19 +--\n .../net/nfp/flower/nfp_flower_representor.c   |   3 +\n drivers/net/nfp/meson.build                   |   1 +\n drivers/net/nfp/nfp_cpp_bridge.c              |  91 +++-----------\n drivers/net/nfp/nfp_cpp_bridge.h              |   1 -\n drivers/net/nfp/nfp_net_common.h              |   5 +-\n drivers/net/nfp/nfp_service.c                 | 117 ++++++++++++++++++\n drivers/net/nfp/nfp_service.h                 |  20 +++\n 8 files changed, 167 insertions(+), 90 deletions(-)\n create mode 100644 drivers/net/nfp/nfp_service.c\n create mode 100644 drivers/net/nfp/nfp_service.h",
    "diff": "diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nindex 88a1b061e1..a29edf8ca2 100644\n--- a/drivers/net/nfp/flower/nfp_flower.c\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -598,29 +598,20 @@ static int\n nfp_flower_enable_services(struct nfp_app_fw_flower *app_fw_flower)\n {\n \tint ret;\n-\tuint32_t service_id;\n+\tstruct nfp_service_info info;\n \tconst struct rte_service_spec flower_service = {\n \t\t.name              = \"flower_ctrl_vnic_service\",\n \t\t.callback          = nfp_flower_ctrl_vnic_service,\n \t\t.callback_userdata = (void *)app_fw_flower,\n \t};\n \n-\t/* Register the flower services */\n-\tret = rte_service_component_register(&flower_service, &service_id);\n+\tret = nfp_service_enable(&flower_service, &info);\n \tif (ret != 0) {\n-\t\tPMD_INIT_LOG(ERR, \"Could not register %s\", flower_service.name);\n-\t\treturn -EINVAL;\n+\t\tPMD_INIT_LOG(ERR, \"Could not enable service %s\", flower_service.name);\n+\t\treturn ret;\n \t}\n \n-\tapp_fw_flower->ctrl_vnic_id = service_id;\n-\tPMD_INIT_LOG(INFO, \"%s registered\", flower_service.name);\n-\n-\t/* Map them to available service cores */\n-\tret = nfp_map_service(service_id);\n-\tif (ret != 0) {\n-\t\tPMD_INIT_LOG(ERR, \"Could not map %s\", flower_service.name);\n-\t\treturn -EINVAL;\n-\t}\n+\tapp_fw_flower->ctrl_vnic_id = info.id;\n \n \treturn 0;\n }\ndiff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c\nindex 63fe37c8d7..12e8af54fb 100644\n--- a/drivers/net/nfp/flower/nfp_flower_representor.c\n+++ b/drivers/net/nfp/flower/nfp_flower_representor.c\n@@ -396,6 +396,9 @@ nfp_flower_repr_dev_close(struct rte_eth_dev *dev)\n \tif (app_fw_flower->pf_repr != NULL)\n \t\treturn 0;\n \n+\t/* Disable cpp service */\n+\tnfp_service_disable(&pf_dev->cpp_service_info);\n+\n \t/* Now it is safe to free all PF resources */\n \tnfp_uninit_app_fw_flower(pf_dev);\n \tnfp_pf_uninit(pf_dev);\ndiff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build\nindex c625355d7a..0f4beccbdf 100644\n--- a/drivers/net/nfp/meson.build\n+++ b/drivers/net/nfp/meson.build\n@@ -40,6 +40,7 @@ sources = files(\n         'nfp_net_ctrl.c',\n         'nfp_net_flow.c',\n         'nfp_rxtx.c',\n+        'nfp_service.c',\n )\n \n deps += ['hash', 'security', 'common_nfp']\ndiff --git a/drivers/net/nfp/nfp_cpp_bridge.c b/drivers/net/nfp/nfp_cpp_bridge.c\nindex 36dcdca9de..441c0d2843 100644\n--- a/drivers/net/nfp/nfp_cpp_bridge.c\n+++ b/drivers/net/nfp/nfp_cpp_bridge.c\n@@ -8,10 +8,9 @@\n #include <unistd.h>\n #include <sys/ioctl.h>\n \n-#include <rte_service_component.h>\n-\n #include \"nfpcore/nfp_cpp.h\"\n #include \"nfp_logs.h\"\n+#include \"nfp_service.h\"\n \n #define NFP_CPP_MEMIO_BOUNDARY    (1 << 20)\n #define NFP_BRIDGE_OP_READ        20\n@@ -24,82 +23,23 @@\n /* Prototypes */\n static int nfp_cpp_bridge_service_func(void *args);\n \n-int\n-nfp_map_service(uint32_t service_id)\n-{\n-\tint32_t ret;\n-\tuint32_t slcore = 0;\n-\tint32_t slcore_count;\n-\tuint8_t service_count;\n-\tconst char *service_name;\n-\tuint32_t slcore_array[RTE_MAX_LCORE];\n-\tuint8_t min_service_count = UINT8_MAX;\n-\n-\tslcore_count = rte_service_lcore_list(slcore_array, RTE_MAX_LCORE);\n-\tif (slcore_count <= 0) {\n-\t\tPMD_INIT_LOG(DEBUG, \"No service cores found\");\n-\t\treturn -ENOENT;\n-\t}\n-\n-\t/*\n-\t * Find a service core with the least number of services already\n-\t * registered to it.\n-\t */\n-\twhile (slcore_count--) {\n-\t\tservice_count = rte_service_lcore_count_services(slcore_array[slcore_count]);\n-\t\tif (service_count < min_service_count) {\n-\t\t\tslcore = slcore_array[slcore_count];\n-\t\t\tmin_service_count = service_count;\n-\t\t}\n-\t}\n-\n-\tservice_name = rte_service_get_name(service_id);\n-\tPMD_INIT_LOG(INFO, \"Mapping service %s to core %u\", service_name, slcore);\n-\n-\tret = rte_service_map_lcore_set(service_id, slcore, 1);\n-\tif (ret != 0) {\n-\t\tPMD_INIT_LOG(DEBUG, \"Could not map flower service\");\n-\t\treturn -ENOENT;\n-\t}\n-\n-\trte_service_runstate_set(service_id, 1);\n-\trte_service_component_runstate_set(service_id, 1);\n-\trte_service_lcore_start(slcore);\n-\tif (rte_service_may_be_active(slcore) != 0)\n-\t\tPMD_INIT_LOG(INFO, \"The service %s is running\", service_name);\n-\telse\n-\t\tPMD_INIT_LOG(ERR, \"The service %s is not running\", service_name);\n-\n-\treturn 0;\n-}\n-\n int\n nfp_enable_cpp_service(struct nfp_pf_dev *pf_dev)\n {\n \tint ret;\n-\tuint32_t service_id = 0;\n+\tconst char *pci_name;\n \tstruct rte_service_spec cpp_service = {\n-\t\t.name         = \"nfp_cpp_service\",\n-\t\t.callback     = nfp_cpp_bridge_service_func,\n+\t\t.callback          = nfp_cpp_bridge_service_func,\n+\t\t.callback_userdata = (void *)pf_dev,\n \t};\n \n-\tcpp_service.callback_userdata = (void *)pf_dev;\n+\tpci_name = strchr(pf_dev->pci_dev->name, ':') + 1;\n+\tsnprintf(cpp_service.name, sizeof(cpp_service.name), \"%s_cpp_service\", pci_name);\n \n-\t/* Register the cpp service */\n-\tret = rte_service_component_register(&cpp_service, &service_id);\n+\tret = nfp_service_enable(&cpp_service, &pf_dev->cpp_service_info);\n \tif (ret != 0) {\n-\t\tPMD_INIT_LOG(WARNING, \"Could not register nfp cpp service\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tpf_dev->cpp_bridge_id = service_id;\n-\tPMD_INIT_LOG(INFO, \"NFP cpp service registered\");\n-\n-\t/* Map it to available service core */\n-\tret = nfp_map_service(service_id);\n-\tif (ret != 0) {\n-\t\tPMD_INIT_LOG(DEBUG, \"Could not map nfp cpp service\");\n-\t\treturn -EINVAL;\n+\t\tPMD_INIT_LOG(DEBUG, \"Could not enable service %s\", cpp_service.name);\n+\t\treturn ret;\n \t}\n \n \treturn 0;\n@@ -387,12 +327,18 @@ nfp_cpp_bridge_service_func(void *args)\n \tint sockfd;\n \tint datafd;\n \tstruct nfp_cpp *cpp;\n+\tconst char *pci_name;\n+\tchar socket_handle[14];\n \tstruct sockaddr address;\n \tstruct nfp_pf_dev *pf_dev;\n \tstruct timeval timeout = {1, 0};\n \n-\tunlink(\"/tmp/nfp_cpp\");\n+\tpf_dev = args;\n+\n+\tpci_name = strchr(pf_dev->pci_dev->name, ':') + 1;\n+\tsnprintf(socket_handle, sizeof(socket_handle), \"/tmp/%s\", pci_name);\n \n+\tunlink(socket_handle);\n \tsockfd = socket(AF_UNIX, SOCK_STREAM, 0);\n \tif (sockfd < 0) {\n \t\tPMD_CPP_LOG(ERR, \"socket creation error. Service failed\");\n@@ -404,7 +350,7 @@ nfp_cpp_bridge_service_func(void *args)\n \tmemset(&address, 0, sizeof(struct sockaddr));\n \n \taddress.sa_family = AF_UNIX;\n-\tstrcpy(address.sa_data, \"/tmp/nfp_cpp\");\n+\tstrcpy(address.sa_data, socket_handle);\n \n \tret = bind(sockfd, (const struct sockaddr *)&address,\n \t\t\tsizeof(struct sockaddr));\n@@ -421,9 +367,8 @@ nfp_cpp_bridge_service_func(void *args)\n \t\treturn ret;\n \t}\n \n-\tpf_dev = args;\n \tcpp = pf_dev->cpp;\n-\twhile (rte_service_runstate_get(pf_dev->cpp_bridge_id) != 0) {\n+\twhile (rte_service_runstate_get(pf_dev->cpp_service_info.id) != 0) {\n \t\tdatafd = accept(sockfd, NULL, NULL);\n \t\tif (datafd < 0) {\n \t\t\tif (errno == EAGAIN || errno == EWOULDBLOCK)\ndiff --git a/drivers/net/nfp/nfp_cpp_bridge.h b/drivers/net/nfp/nfp_cpp_bridge.h\nindex bf975ce7ba..406c961dce 100644\n--- a/drivers/net/nfp/nfp_cpp_bridge.h\n+++ b/drivers/net/nfp/nfp_cpp_bridge.h\n@@ -9,6 +9,5 @@\n #include \"nfp_net_common.h\"\n \n int nfp_enable_cpp_service(struct nfp_pf_dev *pf_dev);\n-int nfp_map_service(uint32_t service_id);\n \n #endif /* __NFP_CPP_BRIDGE_H__ */\ndiff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h\nindex 3a441f49f6..eaa7501e8e 100644\n--- a/drivers/net/nfp/nfp_net_common.h\n+++ b/drivers/net/nfp/nfp_net_common.h\n@@ -14,6 +14,7 @@\n \n #include \"nfpcore/nfp_sync.h\"\n #include \"nfp_net_ctrl.h\"\n+#include \"nfp_service.h\"\n \n /* Interrupt definitions */\n #define NFP_NET_IRQ_LSC_IDX             0\n@@ -102,8 +103,8 @@ struct nfp_pf_dev {\n \tstruct nfp_hwinfo *hwinfo;\n \tstruct nfp_rtsym_table *sym_tbl;\n \n-\t/** Service id of cpp bridge service */\n-\tuint32_t cpp_bridge_id;\n+\t/** Service info of cpp bridge service */\n+\tstruct nfp_service_info cpp_service_info;\n \n \t/** Multiple PF configuration */\n \tstruct nfp_multi_pf multi_pf;\ndiff --git a/drivers/net/nfp/nfp_service.c b/drivers/net/nfp/nfp_service.c\nnew file mode 100644\nindex 0000000000..f49fa6addf\n--- /dev/null\n+++ b/drivers/net/nfp/nfp_service.c\n@@ -0,0 +1,117 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2023 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#include \"nfp_service.h\"\n+\n+#include \"nfpcore/nfp_cpp.h\"\n+#include \"nfp_logs.h\"\n+\n+/* Disable service and try to get service status */\n+#define NFP_SERVICE_DISABLE_WAIT_COUNT 3000\n+\n+static int\n+nfp_map_service(struct nfp_service_info *info)\n+{\n+\tint32_t ret;\n+\tuint32_t slcore = 0;\n+\tint32_t slcore_count;\n+\tuint8_t service_count;\n+\tconst char *service_name;\n+\tuint32_t slcore_array[RTE_MAX_LCORE];\n+\tuint8_t min_service_count = UINT8_MAX;\n+\n+\tslcore_count = rte_service_lcore_list(slcore_array, RTE_MAX_LCORE);\n+\tif (slcore_count <= 0) {\n+\t\tPMD_DRV_LOG(DEBUG, \"No service cores found\");\n+\t\treturn -ENOENT;\n+\t}\n+\n+\t/*\n+\t * Find a service core with the least number of services already\n+\t * registered to it\n+\t */\n+\twhile (slcore_count--) {\n+\t\tservice_count = rte_service_lcore_count_services(slcore_array[slcore_count]);\n+\t\tif (service_count < min_service_count) {\n+\t\t\tslcore = slcore_array[slcore_count];\n+\t\t\tmin_service_count = service_count;\n+\t\t}\n+\t}\n+\n+\tservice_name = rte_service_get_name(info->id);\n+\tPMD_INIT_LOG(INFO, \"Mapping service %s to core %u\", service_name, slcore);\n+\n+\tret = rte_service_map_lcore_set(info->id, slcore, 1);\n+\tif (ret != 0) {\n+\t\tPMD_DRV_LOG(DEBUG, \"Could not map flower service\");\n+\t\treturn -ENOENT;\n+\t}\n+\n+\trte_service_runstate_set(info->id, 1);\n+\trte_service_component_runstate_set(info->id, 1);\n+\trte_service_lcore_start(slcore);\n+\tif (rte_service_may_be_active(slcore))\n+\t\tPMD_DRV_LOG(INFO, \"The service %s is running\", service_name);\n+\telse\n+\t\tPMD_DRV_LOG(ERR, \"The service %s is not running\", service_name);\n+\n+\tinfo->lcore = slcore;\n+\n+\treturn 0;\n+}\n+\n+int\n+nfp_service_enable(const struct rte_service_spec *service_spec,\n+\t\tstruct nfp_service_info *info)\n+{\n+\tint ret;\n+\n+\t/* Register the service */\n+\tret = rte_service_component_register(service_spec, &info->id);\n+\tif (ret != 0) {\n+\t\tPMD_DRV_LOG(DEBUG, \"Could not register %s\", service_spec->name);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* Map it to available service core */\n+\tret = nfp_map_service(info);\n+\tif (ret != 0) {\n+\t\tPMD_DRV_LOG(DEBUG, \"Could not map %s\", service_spec->name);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tPMD_DRV_LOG(DEBUG, \"Enable service %s successfully\", service_spec->name);\n+\n+\treturn 0;\n+}\n+\n+int\n+nfp_service_disable(struct nfp_service_info *info)\n+{\n+\tuint32_t i;\n+\tconst char *service_name;\n+\n+\tservice_name = rte_service_get_name(info->id);\n+\tif (service_name == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"Could not find service %u\", info->id);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\trte_service_runstate_set(info->id, 0);\n+\trte_service_component_runstate_set(info->id, 0);\n+\n+\tfor (i = 0; i < NFP_SERVICE_DISABLE_WAIT_COUNT; i++) {\n+\t\tif (rte_service_may_be_active(info->id) == 0)\n+\t\t\tbreak;\n+\t\trte_delay_ms(1);\n+\t}\n+\tif (i == NFP_SERVICE_DISABLE_WAIT_COUNT)\n+\t\tPMD_DRV_LOG(ERR, \"Could not stop service %s\", service_name);\n+\n+\trte_service_map_lcore_set(info->id, info->lcore, 0);\n+\trte_service_component_unregister(info->id);\n+\n+\treturn 0;\n+}\ndiff --git a/drivers/net/nfp/nfp_service.h b/drivers/net/nfp/nfp_service.h\nnew file mode 100644\nindex 0000000000..4b99d5b973\n--- /dev/null\n+++ b/drivers/net/nfp/nfp_service.h\n@@ -0,0 +1,20 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2023 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#ifndef __NFP_SERVICE_H__\n+#define __NFP_SERVICE_H__\n+\n+#include <rte_service_component.h>\n+\n+struct nfp_service_info {\n+\tuint32_t id;\n+\tuint32_t lcore;\n+};\n+\n+int nfp_service_disable(struct nfp_service_info *info);\n+int nfp_service_enable(const struct rte_service_spec *service_spec,\n+\t\tstruct nfp_service_info *info);\n+\n+#endif /* __NFP_SERVICE_H__ */\n",
    "prefixes": [
        "v2",
        "2/3"
    ]
}