get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 136302,
    "url": "http://patches.dpdk.org/api/patches/136302/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240202030415.739638-4-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-4-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240202030415.739638-4-chaoyong.he@corigine.com",
    "date": "2024-02-02T03:04:15",
    "name": "[v2,3/3] net/nfp: flower driver uses one service core",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "ca7560d7540c77cb6a5da34bdada48c580fddd29",
    "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-4-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/136302/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/136302/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 81E4043A49;\n\tFri,  2 Feb 2024 04:05:11 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 1039D42E1E;\n\tFri,  2 Feb 2024 04:04:53 +0100 (CET)",
            "from NAM10-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam10on2099.outbound.protection.outlook.com [40.107.94.99])\n by mails.dpdk.org (Postfix) with ESMTP id 5499542E00\n for <dev@dpdk.org>; Fri,  2 Feb 2024 04:04:51 +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:49 +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:49 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=h1pN7Qhd0r0VvffH2+HiyZqDCpYvrqXHSf07KdwsEwfZUTbyIBb+HEoRWPg+YVGI39VeHOsZ3qkhlxQaXHAFWjHQ41Nlol+4ZwgVQc/cSOnZcmmcEE/3TPA6TLEkq7SM076UXV7VwWsbQqVuVhA6Za3JemLxQR/cEy1e1HKl5yd7Q6MLvjANVIJH1yQpiGngxd5vpeFU7KvRFUCbN0HO2r3RYOxkFIjEiou3r5q/BTTfV4C1QjPerRspIq1z3xxjvm1tksV4x+wPj8It+Nd3NNgSHJoJFn7sZQ76q1TsGC14AFKMrZZVel1EPcjQn/FpkLPUtAEW3Bb5W+UBjOgrIg==",
        "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=zp0fJdpiBzHiCWMscHB0du8tHEo925iRHXtIoc6iU2Y=;\n b=EZidUHzs3kF0TV2WxxW7wAuijXKv270kzSNDHtQPX8uOMV2/HRNrhcC2UpdzthP/G/2sz/lO14MxAPKbEij2QvtSRiPK6uTGfLU1EgVkUy1PPYOMs7B4pcnjYZ1qtbR0J+fjzuECJGu3AKrXLQ/8dcWqm3/GLPczkO4N0z6+AqzbFhwzvJmaHxI2DW8nUFdS7ZQTX4R1tfYP/3EreVwBDJfM5ri9/JPWHhkADdYC9Xun60v7AEf/n0K/JTG6LdQ6an3GnRv4upnl3rKMPyZmgxU/AgPSeEIMqbfoV1Gt/2W5egulnmv6DT91RyBwam6Wtm+8vXUlkqbMqienxXFsdQ==",
        "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=zp0fJdpiBzHiCWMscHB0du8tHEo925iRHXtIoc6iU2Y=;\n b=Khw8p+hsmDIJpTYdDV5KJwMEqQyg4cj26ZlWQFTiMh81ncfaKco8Ss48th01jMiR3rM7zMl1r7Gv/6eSLGCZfRQvIBfRhdahAfABAKlHGlXilRNTiIAfNBvsqrLnN62dY1q9jsKKVASdtvKZUEsXNN6LznFanzljSWfXOxJbvJA=",
        "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 3/3] net/nfp: flower driver uses one service core",
        "Date": "Fri,  2 Feb 2024 11:04:15 +0800",
        "Message-Id": "<20240202030415.739638-4-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": "ce652371-1503-4330-be2d-08dc239bb7d0",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n 5CTEAbs7zZJ4j/Ivtg2Mj8xvfIzrXTu0Gf5Rw0rNu5XW055QBMplxA4bUHmG+h9ANMnFVYdIKyZ+xsYcTzUiChwTzNs6wEi5fnZpau7UUgiBacYN0waAlwmWJ8daCqzR/KYVKAc4xsRsaRToOaRybJoFhKf7jODRf6Mp9OnRJ8KsP9q/wGksTCY1XU/D6CjPE/lcYdaTwPL/FdzeaN05u5JKq+X0mcm0kluqW4GqOgYpevjCIJ5RX9dUoSu/yXUWFF82dmxYVmx4TkGlZyTzMDxR1q6UXuS+3uhUXJobWoN38vWxB9OiiLH46FM2M17Hx/Q04WtIaH8UTIMEEFQwQCwc2e7/PKpjvTkO7dBxkhxkWSDk26OB1BLpwVZuJEIn7ZjWhNNeOtbiiqEaYISDBmk/wr/L5Q8IMuBp2gl7HqnyXUDhbBewZb3nPACD6GrX8H10gZxO/KiWBkL5wbKvjA9MjMKNV2AxnYyTC88uZidOmrQ6oOyksN+MubNNJutpHLX3BY6Oi3SU/99lL+B0kcn0nwY1CQpNdaOLVV016uMkhknlQSCBDJSpq2pMK3UmhmWWrnyupTFNh61IA+Mry0LOFXl6Oawqe746hWGN4IRPJdQAXY2f3w/8upx0pswt",
        "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)(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 KcReKh636kJIqbdum8CMA5SO14zAj6emBPFV7Zhpy+m7970Axa7cHbDMeH961hT4FBhNqQOC7IfnCWdriPYsRntx80G0Qx6+oORj4vwZWeYazl56Ayhd+KWQNYPSD+58cvqE/fx/G6d2B59riETsP5npycsLdAAuOp0JbnjqFFF8jLFd0BLn/s793qEMQE/8Ww4fOLxkwKr2bNqttAzLWQfRHzU0MKJBAf3W8cDgg+T28EBsTKntDWPauE8ZqKjqtxWQkqgldBQmiwtMjoap9qHBF2D4BWFVAFesb4DrVYLZuqJE2KYLkLpaNodEHKkrvSxuSj06fKm4FWcYBFb6KrZlQlYBk7JTfEcrUxYpf8oXzgbOV6v8QFNQ/VOfCcL4Fsb9UsnIFP0ckeOS4UiC4P7aHVGVBItg3kiNEqLFWicmycRDH3asAidep/4ovmJlwXFH308+PHXpTvxi/EZqd02A2OUOvXZNiuKCsg5QowMqLwJ5lHffMGz8gV9JvhcCDE6R68TLXf+wtT5P2NhYOl/ZE9LpDkFzi0RaBaQPGDnSzwhFyiWW1WX6CqwPKHOtnK0gRh33WEbqptKpDkZVeyrACiZ4rWLl/SUvDF0ybDV74YfWLBu/VJ5A9ZxPHzwQiZlVhbFt4SuHJNg9nS4X96N0iQsH/KUOY5qyfBlM8R26BWMucGgBI0958uoQlpGTUEsF5BLCQ36ICHWrEi3H6FQAdzYUW6mrgVanDR5709u0lEiO7KyrYmBwwCI2qmhq9kzGR3w4Z9O0vIxjX4+szUqqkEAL4k//rBFw0EZI1AjWTngAngzrvqX28dBSIzkCKu0E2QdbB+mWz4ngV7+wszuB1kwu59SnenjiB7rJgdEUSEPVq3KpNgJ7rdhcvpoW6i3fkGplBe9rhqBNzPxZ9/IVroflVTjqiKFp56GoeYNloPqsUWkkceclHD7vwxmKlx+n8bre03qgSTBI/GV8sJpJM4ywWspDh50n566B1WFWF6It3PfZlk9+t35Mp5bKgRSYRfqhE0sHk3mR5YFlQ9Nwlf6gNYpFjjpXEiQZfPOU5MNoT4sMj+cqAdCBW/Rp4d8Yo3ypOwU1AWtpNUPhLzSU6fox3VuJE93ABFVF97zwq/xP996VciP7EyCo9fXJ2JlRz8AtjQE+jJb4zx/v9AzoUop9Z7UOJhnM0p65bd1bFpcjCIjSNOz69/BMSUiMkcoiElQTektjqntO+ANXzqQDmyEx6idTMghPPfnw+SGfUxF0HCA3bJpjXo+OVeg12b+2BVYIH9Iuhp9RFci6gEgtOVZ/x0qT2NU5RvhC31qVzVu8GAweZFlYTS4luTdi7ZMZ+VehNxtGrMtrcVbCVhwM0Otr/j7qMMG77H9vH5yjHg5+sO+mITbEMUm/OplVKn3XBg1bb1QRSGN9I3bNMw0T4YADm41QYLxhKTU25Rw37BcbiT5tSv6tz6+Y0HdauIIEyOiEzXLo00Vjc6n44snbwWbo54m+eSrfFrLhRSwl2Xl6Qcvriz6NRo0sW6de3+588usED8OyaA6sig/Gzke2JuwsHPlT7rE6rChdiD4E45RtvYT9z0L+JbZ5DFLNvMpMfwfXhB6xVBw3j39kcA==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n ce652371-1503-4330-be2d-08dc239bb7d0",
        "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:49.3184 (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 cGujUR6c/M37rcp5PKP/VJCxr5/jXhhWdoKmovhy1oi/HJvs6ysIF1hJgWOtxST/laDnkRGCqmKiPFHH6rH5QTN5Wns/H+uaDuF5P648wHo=",
        "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\nNow app must provide a service core for each NFP pci device that uses\nflower driver to run flower service, which will cause huge resource waste.\nThis patch is to solve this problem and app can only use one core to\nrun NFP flower service though it uses several NFP NICs.\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           |  47 ++---\n drivers/net/nfp/flower/nfp_flower_ctrl.c      |  20 +-\n drivers/net/nfp/flower/nfp_flower_ctrl.h      |   2 +-\n .../net/nfp/flower/nfp_flower_representor.c   |   4 +\n drivers/net/nfp/flower/nfp_flower_service.c   | 196 ++++++++++++++++++\n drivers/net/nfp/flower/nfp_flower_service.h   |  17 ++\n drivers/net/nfp/meson.build                   |   1 +\n drivers/net/nfp/nfp_net_common.h              |   6 +\n drivers/net/nfp/nfpcore/nfp_sync.h            |   2 +\n 9 files changed, 248 insertions(+), 47 deletions(-)\n create mode 100644 drivers/net/nfp/flower/nfp_flower_service.c\n create mode 100644 drivers/net/nfp/flower/nfp_flower_service.h",
    "diff": "diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nindex a29edf8ca2..e84e6ebbff 100644\n--- a/drivers/net/nfp/flower/nfp_flower.c\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -18,6 +18,7 @@\n #include \"../nfp_mtr.h\"\n #include \"nfp_flower_ctrl.h\"\n #include \"nfp_flower_representor.h\"\n+#include \"nfp_flower_service.h\"\n \n #define CTRL_VNIC_NB_DESC 512\n \n@@ -461,6 +462,13 @@ nfp_flower_init_ctrl_vnic(struct nfp_net_hw *hw)\n \t\tnn_cfg_writeb(&hw->super, NFP_NET_CFG_TXR_SZ(i), rte_log2_u32(CTRL_VNIC_NB_DESC));\n \t}\n \n+\t/* Alloc sync memory zone */\n+\tret = nfp_flower_service_sync_alloc(app_fw_flower);\n+\tif (ret != 0) {\n+\t\tPMD_INIT_LOG(ERR, \"Alloc sync memory zone failed\");\n+\t\tgoto tx_queue_setup_cleanup;\n+\t}\n+\n \treturn 0;\n \n tx_queue_setup_cleanup:\n@@ -531,6 +539,7 @@ nfp_flower_cleanup_ctrl_vnic(struct nfp_net_hw *hw)\n \t\t}\n \t}\n \n+\tnfp_flower_service_sync_free(app_fw_flower);\n \trte_free(eth_dev->data->tx_queues);\n \trte_free(eth_dev->data->rx_queues);\n \trte_mempool_free(app_fw_flower->ctrl_pktmbuf_pool);\n@@ -584,38 +593,6 @@ nfp_flower_start_ctrl_vnic(struct nfp_net_hw *net_hw)\n \treturn 0;\n }\n \n-static int\n-nfp_flower_ctrl_vnic_service(void *arg)\n-{\n-\tstruct nfp_app_fw_flower *app_fw_flower = arg;\n-\n-\tnfp_flower_ctrl_vnic_poll(app_fw_flower);\n-\n-\treturn 0;\n-}\n-\n-static int\n-nfp_flower_enable_services(struct nfp_app_fw_flower *app_fw_flower)\n-{\n-\tint ret;\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-\tret = nfp_service_enable(&flower_service, &info);\n-\tif (ret != 0) {\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 = info.id;\n-\n-\treturn 0;\n-}\n-\n static void\n nfp_flower_pkt_add_metadata_register(struct nfp_app_fw_flower *app_fw_flower)\n {\n@@ -760,7 +737,7 @@ nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev,\n \t}\n \n \t/* Start up flower services */\n-\tret = nfp_flower_enable_services(app_fw_flower);\n+\tret = nfp_flower_service_start(app_fw_flower);\n \tif (ret != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Could not enable flower services\");\n \t\tret = -ESRCH;\n@@ -770,11 +747,13 @@ nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev,\n \tret = nfp_flower_repr_create(app_fw_flower);\n \tif (ret != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Could not create representor ports\");\n-\t\tgoto ctrl_vnic_cleanup;\n+\t\tgoto ctrl_vnic_service_stop;\n \t}\n \n \treturn 0;\n \n+ctrl_vnic_service_stop:\n+\tnfp_flower_service_stop(app_fw_flower);\n ctrl_vnic_cleanup:\n \tnfp_flower_cleanup_ctrl_vnic(app_fw_flower->ctrl_hw);\n ctrl_cpp_area_cleanup:\ndiff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.c b/drivers/net/nfp/flower/nfp_flower_ctrl.c\nindex c25487c277..bcb325d475 100644\n--- a/drivers/net/nfp/flower/nfp_flower_ctrl.c\n+++ b/drivers/net/nfp/flower/nfp_flower_ctrl.c\n@@ -12,6 +12,7 @@\n #include \"../nfp_logs.h\"\n #include \"nfp_flower_representor.h\"\n #include \"nfp_mtr.h\"\n+#include \"nfp_flower_service.h\"\n \n #define MAX_PKT_BURST 32\n \n@@ -502,26 +503,21 @@ nfp_flower_cmsg_rx(struct nfp_app_fw_flower *app_fw_flower,\n }\n \n void\n-nfp_flower_ctrl_vnic_poll(struct nfp_app_fw_flower *app_fw_flower)\n+nfp_flower_ctrl_vnic_process(struct nfp_app_fw_flower *app_fw_flower)\n {\n \tuint16_t count;\n \tstruct nfp_net_rxq *rxq;\n-\tstruct nfp_net_hw *ctrl_hw;\n \tstruct rte_eth_dev *ctrl_eth_dev;\n \tstruct rte_mbuf *pkts_burst[MAX_PKT_BURST];\n \n-\tctrl_hw = app_fw_flower->ctrl_hw;\n-\tctrl_eth_dev = ctrl_hw->eth_dev;\n+\tctrl_eth_dev = app_fw_flower->ctrl_hw->eth_dev;\n \n \t/* Ctrl vNIC only has a single Rx queue */\n \trxq = ctrl_eth_dev->data->rx_queues[0];\n-\n-\twhile (rte_service_runstate_get(app_fw_flower->ctrl_vnic_id) != 0) {\n-\t\tcount = nfp_flower_ctrl_vnic_recv(rxq, pkts_burst, MAX_PKT_BURST);\n-\t\tif (count != 0) {\n-\t\t\tapp_fw_flower->ctrl_vnic_rx_count += count;\n-\t\t\t/* Process cmsgs here */\n-\t\t\tnfp_flower_cmsg_rx(app_fw_flower, pkts_burst, count);\n-\t\t}\n+\tcount = nfp_flower_ctrl_vnic_recv(rxq, pkts_burst, MAX_PKT_BURST);\n+\tif (count != 0) {\n+\t\tapp_fw_flower->ctrl_vnic_rx_count += count;\n+\t\t/* Process cmsgs here */\n+\t\tnfp_flower_cmsg_rx(app_fw_flower, pkts_burst, count);\n \t}\n }\ndiff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.h b/drivers/net/nfp/flower/nfp_flower_ctrl.h\nindex 4c94d36847..131d002ac6 100644\n--- a/drivers/net/nfp/flower/nfp_flower_ctrl.h\n+++ b/drivers/net/nfp/flower/nfp_flower_ctrl.h\n@@ -8,7 +8,7 @@\n \n #include \"nfp_flower.h\"\n \n-void nfp_flower_ctrl_vnic_poll(struct nfp_app_fw_flower *app_fw_flower);\n+void nfp_flower_ctrl_vnic_process(struct nfp_app_fw_flower *app_fw_flower);\n uint16_t nfp_flower_ctrl_vnic_xmit(struct nfp_app_fw_flower *app_fw_flower,\n \t\tstruct rte_mbuf *mbuf);\n void nfp_flower_ctrl_vnic_xmit_register(struct nfp_app_fw_flower *app_fw_flower);\ndiff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c\nindex 12e8af54fb..4f4df0cd2e 100644\n--- a/drivers/net/nfp/flower/nfp_flower_representor.c\n+++ b/drivers/net/nfp/flower/nfp_flower_representor.c\n@@ -9,6 +9,7 @@\n #include \"../nfpcore/nfp_nsp.h\"\n #include \"../nfp_logs.h\"\n #include \"../nfp_mtr.h\"\n+#include \"nfp_flower_service.h\"\n \n /* Type of representor */\n enum nfp_repr_type {\n@@ -396,6 +397,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/* Stop flower service first */\n+\tnfp_flower_service_stop(app_fw_flower);\n+\n \t/* Disable cpp service */\n \tnfp_service_disable(&pf_dev->cpp_service_info);\n \ndiff --git a/drivers/net/nfp/flower/nfp_flower_service.c b/drivers/net/nfp/flower/nfp_flower_service.c\nnew file mode 100644\nindex 0000000000..5e8811fe24\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower_service.c\n@@ -0,0 +1,196 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2024 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#include \"nfp_flower_service.h\"\n+\n+#include <rte_spinlock.h>\n+\n+#include \"nfp_flower_ctrl.h\"\n+#include \"../nfpcore/nfp_cpp.h\"\n+#include \"../nfpcore/nfp_sync.h\"\n+#include \"../nfp_logs.h\"\n+#include \"../nfp_service.h\"\n+\n+/* Driver limitation, PMD can enlarge it if need. */\n+#define MAX_FLOWER_SERVICE_SLOT 8\n+\n+struct nfp_flower_service {\n+\t/** Flower service is enabled */\n+\tbool enabled;\n+\t/** Flower service info */\n+\tstruct nfp_service_info info;\n+\t/** Store flower cards' information */\n+\tstruct nfp_app_fw_flower *slots[MAX_FLOWER_SERVICE_SLOT];\n+\t/** Spinlock for sync slots when add/remove card */\n+\trte_spinlock_t spinlock;\n+};\n+\n+static struct nfp_flower_service *\n+nfp_flower_service_handle_get(struct nfp_app_fw_flower *app)\n+{\n+\treturn app->pf_hw->pf_dev->process_share.fl_service;\n+}\n+\n+static int\n+nfp_flower_service_loop(void *arg)\n+{\n+\tuint16_t slot;\n+\tstruct nfp_app_fw_flower *app;\n+\tstruct nfp_flower_service *service_handle;\n+\n+\tservice_handle = arg;\n+\t/* Waiting for enabling service */\n+\twhile (!service_handle->enabled)\n+\t\trte_delay_ms(1);\n+\n+\twhile (rte_service_runstate_get(service_handle->info.id) != 0) {\n+\t\trte_spinlock_lock(&service_handle->spinlock);\n+\t\tfor (slot = 0; slot < MAX_FLOWER_SERVICE_SLOT; slot++) {\n+\t\t\tapp = service_handle->slots[slot];\n+\t\t\tif (app == NULL)\n+\t\t\t\tcontinue;\n+\n+\t\t\tnfp_flower_ctrl_vnic_process(app);\n+\t\t}\n+\t\trte_spinlock_unlock(&service_handle->spinlock);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_service_enable(struct nfp_flower_service *service_handle)\n+{\n+\tint ret;\n+\n+\tconst struct rte_service_spec flower_service = {\n+\t\t.name              = \"flower_ctrl_vnic_service\",\n+\t\t.callback          = nfp_flower_service_loop,\n+\t\t.callback_userdata = (void *)service_handle,\n+\t};\n+\n+\tret = nfp_service_enable(&flower_service, &service_handle->info);\n+\tif (ret != 0)\n+\t\treturn ret;\n+\n+\trte_spinlock_init(&service_handle->spinlock);\n+\tservice_handle->enabled = true;\n+\n+\treturn 0;\n+}\n+\n+static uint16_t\n+nfp_flower_service_insert(struct nfp_app_fw_flower *app,\n+\t\tstruct nfp_flower_service *service_handle)\n+{\n+\tuint16_t slot;\n+\n+\trte_spinlock_lock(&service_handle->spinlock);\n+\tfor (slot = 0; slot < MAX_FLOWER_SERVICE_SLOT; slot++) {\n+\t\tif (service_handle->slots[slot] == NULL) {\n+\t\t\tservice_handle->slots[slot] = app;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\trte_spinlock_unlock(&service_handle->spinlock);\n+\n+\treturn slot;\n+}\n+\n+int\n+nfp_flower_service_start(void *app_fw_flower)\n+{\n+\tint ret;\n+\tstruct nfp_flower_service *service_handle;\n+\tstruct nfp_app_fw_flower *app = app_fw_flower;\n+\n+\tservice_handle = nfp_flower_service_handle_get(app);\n+\tif (service_handle == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"Can not get service handle\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* Enable flower service when driver initializes the first NIC */\n+\tif (!service_handle->enabled) {\n+\t\tret = nfp_flower_service_enable(service_handle);\n+\t\tif (ret != 0) {\n+\t\t\tPMD_DRV_LOG(ERR, \"Could not enable flower service\");\n+\t\t\treturn -ESRCH;\n+\t\t}\n+\t}\n+\n+\t/* Insert the NIC to flower service slot */\n+\tret = nfp_flower_service_insert(app, service_handle);\n+\tif (ret == MAX_FLOWER_SERVICE_SLOT) {\n+\t\tPMD_DRV_LOG(ERR, \"Flower ctrl vnic service slot over %u\",\n+\t\t\t\tMAX_FLOWER_SERVICE_SLOT);\n+\t\treturn -ENOSPC;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+void\n+nfp_flower_service_stop(void *app_fw_flower)\n+{\n+\tuint16_t slot;\n+\tuint16_t count;\n+\tstruct nfp_flower_service *service_handle;\n+\tstruct nfp_app_fw_flower *app = app_fw_flower;\n+\n+\tservice_handle = nfp_flower_service_handle_get(app);\n+\tif (service_handle == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"Can not get service handle\");\n+\t\treturn;\n+\t}\n+\n+\trte_spinlock_lock(&service_handle->spinlock);\n+\tfor (slot = 0; slot < MAX_FLOWER_SERVICE_SLOT; slot++) {\n+\t\t/* The app only in one slot */\n+\t\tif (service_handle->slots[slot] != app)\n+\t\t\tcontinue;\n+\n+\t\tservice_handle->slots[slot] = NULL;\n+\t}\n+\trte_spinlock_unlock(&service_handle->spinlock);\n+\n+\t/* Determine whether to disable service */\n+\tcount = nfp_sync_handle_count_get(app->pf_hw->pf_dev->sync, NULL,\n+\t\t\tservice_handle);\n+\tif (count > 1)\n+\t\treturn;\n+\n+\tif (nfp_service_disable(&service_handle->info) != 0)\n+\t\tPMD_DRV_LOG(ERR, \"Could not disable service\");\n+}\n+\n+int\n+nfp_flower_service_sync_alloc(void *app_fw_flower)\n+{\n+\tstruct nfp_flower_service *service_handle;\n+\tstruct nfp_app_fw_flower *app = app_fw_flower;\n+\tstruct nfp_pf_dev *pf_dev = app->pf_hw->pf_dev;\n+\n+\tservice_handle = nfp_sync_handle_alloc(pf_dev->sync, NULL,\n+\t\t\tNFP_SYNC_MAGIC_FL_SERVICE,\n+\t\t\tsizeof(struct nfp_flower_service));\n+\tif (service_handle == NULL)\n+\t\treturn -ENOMEM;\n+\n+\tpf_dev->process_share.fl_service = service_handle;\n+\n+\treturn 0;\n+}\n+\n+void\n+nfp_flower_service_sync_free(void *app_fw_flower)\n+{\n+\tstruct nfp_app_fw_flower *app = app_fw_flower;\n+\tstruct nfp_pf_dev *pf_dev = app->pf_hw->pf_dev;\n+\n+\tnfp_sync_handle_free(pf_dev->sync, NULL, pf_dev->process_share.fl_service);\n+\n+\tpf_dev->process_share.fl_service = NULL;\n+}\ndiff --git a/drivers/net/nfp/flower/nfp_flower_service.h b/drivers/net/nfp/flower/nfp_flower_service.h\nnew file mode 100644\nindex 0000000000..a75780274f\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower_service.h\n@@ -0,0 +1,17 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2024 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#ifndef __NFP_FLOWER_SERVICE_H__\n+#define __NFP_FLOWER_SERVICE_H__\n+\n+struct nfp_flower_service;\n+\n+int nfp_flower_service_start(void *app_fw_flower);\n+void nfp_flower_service_stop(void *app_fw_flower);\n+\n+int nfp_flower_service_sync_alloc(void *app_fw_flower);\n+void nfp_flower_service_sync_free(void *app_fw_flower);\n+\n+#endif /* __NFP_FLOWER_SERVICE_H__ */\ndiff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build\nindex 0f4beccbdf..e376fd328f 100644\n--- a/drivers/net/nfp/meson.build\n+++ b/drivers/net/nfp/meson.build\n@@ -13,6 +13,7 @@ sources = files(\n         'flower/nfp_flower_ctrl.c',\n         'flower/nfp_flower_flow.c',\n         'flower/nfp_flower_representor.c',\n+        'flower/nfp_flower_service.c',\n         'nfd3/nfp_nfd3_dp.c',\n         'nfdk/nfp_nfdk_dp.c',\n         'nfpcore/nfp_cppcore.c',\ndiff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h\nindex eaa7501e8e..e374739022 100644\n--- a/drivers/net/nfp/nfp_net_common.h\n+++ b/drivers/net/nfp/nfp_net_common.h\n@@ -12,6 +12,7 @@\n #include <nfp_dev.h>\n #include <rte_spinlock.h>\n \n+#include \"flower/nfp_flower_service.h\"\n #include \"nfpcore/nfp_sync.h\"\n #include \"nfp_net_ctrl.h\"\n #include \"nfp_service.h\"\n@@ -80,6 +81,10 @@ struct nfp_multi_pf {\n \tuint8_t *beat_addr;\n };\n \n+struct nfp_process_share {\n+\tstruct nfp_flower_service *fl_service;\n+};\n+\n struct nfp_pf_dev {\n \t/** Backpointer to associated pci device */\n \tstruct rte_pci_device *pci_dev;\n@@ -114,6 +119,7 @@ struct nfp_pf_dev {\n \n \t/** Synchronized info */\n \tstruct nfp_sync *sync;\n+\tstruct nfp_process_share process_share;\n };\n \n #define NFP_NET_FLOW_LIMIT    1024\ndiff --git a/drivers/net/nfp/nfpcore/nfp_sync.h b/drivers/net/nfp/nfpcore/nfp_sync.h\nindex 82f01e2652..ff3f60937e 100644\n--- a/drivers/net/nfp/nfpcore/nfp_sync.h\n+++ b/drivers/net/nfp/nfpcore/nfp_sync.h\n@@ -10,6 +10,8 @@\n \n #include <bus_pci_driver.h>\n \n+#define NFP_SYNC_MAGIC_FL_SERVICE            0x53594e41 /**< ASCII - SYNA */\n+\n struct nfp_sync;\n \n struct nfp_sync *nfp_sync_alloc(void);\n",
    "prefixes": [
        "v2",
        "3/3"
    ]
}