get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 131382,
    "url": "http://patches.dpdk.org/api/patches/131382/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230913103600.1935292-8-thomas@monjalon.net/",
    "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": "<20230913103600.1935292-8-thomas@monjalon.net>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230913103600.1935292-8-thomas@monjalon.net",
    "date": "2023-09-13T10:34:26",
    "name": "[v2,07/11] drivers: convert to internal control threads",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "350ff3da360f70f2eeb8ef705a0d9ad2b59e6681",
    "submitter": {
        "id": 685,
        "url": "http://patches.dpdk.org/api/people/685/?format=api",
        "name": "Thomas Monjalon",
        "email": "thomas@monjalon.net"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20230913103600.1935292-8-thomas@monjalon.net/mbox/",
    "series": [
        {
            "id": 29493,
            "url": "http://patches.dpdk.org/api/series/29493/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=29493",
            "date": "2023-09-13T10:34:19",
            "name": "rework thread management",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/29493/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/131382/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/131382/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 2750042588;\n\tWed, 13 Sep 2023 12:37:52 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 15B744067C;\n\tWed, 13 Sep 2023 12:37:52 +0200 (CEST)",
            "from wout5-smtp.messagingengine.com (wout5-smtp.messagingengine.com\n [64.147.123.21]) by mails.dpdk.org (Postfix) with ESMTP id E6885402E2\n for <dev@dpdk.org>; Wed, 13 Sep 2023 12:37:49 +0200 (CEST)",
            "from compute4.internal (compute4.nyi.internal [10.202.2.44])\n by mailout.west.internal (Postfix) with ESMTP id 333D1320091C;\n Wed, 13 Sep 2023 06:37:46 -0400 (EDT)",
            "from mailfrontend1 ([10.202.2.162])\n by compute4.internal (MEProxy); Wed, 13 Sep 2023 06:37:49 -0400",
            "by mail.messagingengine.com (Postfix) with ESMTPA; Wed,\n 13 Sep 2023 06:37:40 -0400 (EDT)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h=\n cc:cc:content-transfer-encoding:content-type:content-type:date\n :date:from:from:in-reply-to:in-reply-to:message-id:mime-version\n :references:reply-to:sender:subject:subject:to:to; s=fm2; t=\n 1694601465; x=1694687865; bh=lBicXkbl7p6iD8AYhNBdzSBYrbBSMa+/z2j\n JChdqbe0=; b=a8ockrLw17X+WFHZvVzEAsI8kiMvh2f1hQfTQonc0EViHn7kuE+\n 66o9q0beeijG/AcOJF3/YZAXDI/zldq3ilTkn+e3erXSlsgIr99fTI3LKvC7zIuf\n fu4cvoARo8ZTqIdkvTyT7Fr3seOGapwYY9XcCM3/v0zqmCbG4cLwR9E4U7Yda/hD\n a9wcmKpSCDjP6vuC02EbB8v9ffi1WNvXX3KhaSjeKaY2XNsiaVw29OZE3ZYrXyGp\n BTEnEBekBOJyrIrmApcf4Wx+YnxG1clBIr8M+8Z0jimJzdp0QfMHAk8ftBWWwm+d\n HnvOECdQlOKEv2uXnX5jjvqPyy3UCAJKjfg==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=\n messagingengine.com; h=cc:cc:content-transfer-encoding\n :content-type:content-type:date:date:feedback-id:feedback-id\n :from:from:in-reply-to:in-reply-to:message-id:mime-version\n :references:reply-to:sender:subject:subject:to:to:x-me-proxy\n :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t=\n 1694601465; x=1694687865; bh=lBicXkbl7p6iD8AYhNBdzSBYrbBSMa+/z2j\n JChdqbe0=; b=U2ZOq4w7/92qM62EQJuGcfzHQaQ0Quc9ncmoOJBOiTF6a2snZXv\n M5Sk7YT7jy/TbZlrb/mDC3BWlH0tYNktp8YTUZI3xD3/dLIHZo7hSR9nH2JhEpxo\n 1axYESWMWCEWYDMVOZsavL7JaeTIAG+/dePX/Vs83C6cP6atsjldVvLv2VYaLLEG\n awTp5OlxNjBV9popRtiehq1e2ziSpyiSVmckn7oXe93C6Q9BdKHcRNwFf5iV3+JU\n UIjlhyQSod/SM3RdHWFEvegW8NWMdahX/Xc4SSeP/cc3jaSxwUnqJvay9CY1v/lt\n 2cRYEir+6nkplLGsNBq76PvO9BjzXsv5bYA=="
        ],
        "X-ME-Sender": "<xms:-JABZS7zO1LLkt7L2LVwEtg6VQk_s6kf3OnRBCigIk_87P_xdSBFqQ>\n <xme:-JABZb76XzrTwwNRfBvvm1h0nUdcu8M7Hsq1QT1PmKzN2juKso-V87ym6bBHgJWWY\n Rji_bVvTQW3lAJhDA>",
        "X-ME-Received": "\n <xmr:-JABZRfPrPibuQ6JY1AzPajMi3NaoAE_9oyWlbrHKKhZ6opMiXbVnxVOnIAP1FeiC0i_lQ>",
        "X-ME-Proxy-Cause": "\n gggruggvucftvghtrhhoucdtuddrgedviedrudeikedgfedtucetufdoteggodetrfdotf\n fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen\n uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne\n cujfgurhephffvvefufffkofgjfhggtgfgsehtkeertdertdejnecuhfhrohhmpefvhhho\n mhgrshcuofhonhhjrghlohhnuceothhhohhmrghssehmohhnjhgrlhhonhdrnhgvtheqne\n cuggftrfgrthhtvghrnhephfejtdejheeuffettdetgefgueetueelgeegffejhedutdek\n vdeuvdeujefhffeknecuffhomhgrihhnpehthhhrvggrugdrrhhunhdpthhhrhgvrggurd\n hiugenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpeht\n hhhomhgrshesmhhonhhjrghlohhnrdhnvght",
        "X-ME-Proxy": "<xmx:-JABZfJCukPFQ6tJO35XbO5fiuq_-oQ9T6tqDopNkJFnEOOdDFo3wA>\n <xmx:-JABZWKxz_2N0jhzhb9AnZOaOSI-INb4Ih45CypOnn_64B47eh47kw>\n <xmx:-JABZQwvC64hPK_nK3b9LAVx8b0y3NheNcxYgke8PpVyWUlZzfLjiw>\n <xmx:-ZABZVUXSJbVV1Iw6i5I9Vmg3taluWgIQ45MpbkfQ0fREcMacwzdtQ>",
        "Feedback-ID": "i47234305:Fastmail",
        "From": "Thomas Monjalon <thomas@monjalon.net>",
        "To": "dev@dpdk.org",
        "Cc": "Tyler Retzlaff <roretzla@linux.microsoft.com>,\n David Marchand <david.marchand@redhat.com>,\n Ferruh Yigit <ferruh.yigit@amd.com>,\n =?utf-8?q?Morten_Br=C3=B8rup?= <mb@smartsharesystems.com>,\n Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>,\n Nithin Dabilpuram <ndabilpuram@marvell.com>,\n Kiran Kumar K <kirankumark@marvell.com>,\n Sunil Kumar Kori <skori@marvell.com>,\tSatha Rao <skoteshwar@marvell.com>,\n Chengwen Feng <fengchengwen@huawei.com>, Kevin Laatz <kevin.laatz@intel.com>,\n Bruce Richardson <bruce.richardson@intel.com>,\n Abdullah Sevincer <abdullah.sevincer@intel.com>,\n Shepard Siegel <shepard.siegel@atomicrules.com>,\n Ed Czeck <ed.czeck@atomicrules.com>,\n John Miller <john.miller@atomicrules.com>,\n Jingjing Wu <jingjing.wu@intel.com>,\tBeilei Xing <beilei.xing@intel.com>,\n Qiming Yang <qiming.yang@intel.com>,\tQi Zhang <qi.z.zhang@intel.com>,\n Rosen Xu <rosen.xu@intel.com>,\tWenjun Wu <wenjun1.wu@intel.com>,\n Matan Azrad <matan@nvidia.com>,\n Viacheslav Ovsiienko <viacheslavo@nvidia.com>, Ori Kam <orika@nvidia.com>,\n\tSuanming Mou <suanmingm@nvidia.com>, Jiawen Wu <jiawenwu@trustnetic.com>,\n\tJian Wang <jianwang@trustnetic.com>, Tianfei Zhang <tianfei.zhang@intel.com>,\n Xiao Wang <xiao.w.wang@intel.com>,\n Vijay Kumar Srivastava <vsrivast@xilinx.com>",
        "Subject": "[PATCH v2 07/11] drivers: convert to internal control threads",
        "Date": "Wed, 13 Sep 2023 12:34:26 +0200",
        "Message-ID": "<20230913103600.1935292-8-thomas@monjalon.net>",
        "X-Mailer": "git-send-email 2.42.0",
        "In-Reply-To": "<20230913103600.1935292-1-thomas@monjalon.net>",
        "References": "<20230906162226.1618088-1-thomas@monjalon.net>\n <20230913103600.1935292-1-thomas@monjalon.net>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "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": "Calls to rte_ctrl_thread_create() are replaced with\nrte_thread_create_internal_control().\nOther pthread-related functions are replaced with the rte_thread API.\nOnly pthread_cancel() has no replacement.\n\nThe mlx5 vDPA control threads were real-time threads\nwith an affinity on the core specified by the devarg \"event_core\".\nAs there is no heavy performance requirement,\nthese threads are converted into real control threads.\n\nSome threads in dlb2 and mlx5 are not control threads\nbecause they are designed to run on some specific cores.\nIt would be interesting to rework them in future.\n\nSigned-off-by: Thomas Monjalon <thomas@monjalon.net>\nAcked-by: Morten Brørup <mb@smartsharesystems.com>\nAcked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>\nAcked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>\n---\n drivers/common/cnxk/roc_dev.c              | 16 ++--\n drivers/common/cnxk/roc_dev_priv.h         |  2 +-\n drivers/common/cnxk/roc_nix_inl_dev.c      |  9 +--\n drivers/common/cnxk/roc_nix_inl_priv.h     |  2 +-\n drivers/common/cnxk/roc_platform.h         |  3 +-\n drivers/dma/skeleton/skeleton_dmadev.c     |  7 +-\n drivers/event/dlb2/pf/base/dlb2_osdep.h    | 14 ++--\n drivers/event/dlb2/pf/base/dlb2_resource.c | 39 +++++-----\n drivers/event/dlb2/pf/dlb2_main.h          |  1 -\n drivers/net/ark/ark_ethdev.c               | 11 ++-\n drivers/net/ark/ark_pktgen.c               |  8 +-\n drivers/net/ark/ark_pktgen.h               |  2 +-\n drivers/net/iavf/iavf_vchnl.c              |  2 +-\n drivers/net/ice/ice_dcf_parent.c           |  7 +-\n drivers/net/ipn3ke/ipn3ke_representor.c    | 17 ++---\n drivers/net/ixgbe/ixgbe_ethdev.c           |  7 +-\n drivers/net/mlx5/mlx5.h                    |  2 +-\n drivers/net/mlx5/mlx5_hws_cnt.c            | 42 ++++++-----\n drivers/net/sfc/sfc_mae.h                  |  2 +-\n drivers/net/sfc/sfc_mae_counter.c          | 11 ++-\n drivers/net/txgbe/txgbe_ethdev.c           |  6 +-\n drivers/raw/ifpga/ifpga_rawdev.c           | 19 +++--\n drivers/vdpa/ifc/ifcvf_vdpa.c              | 86 ++++++++++------------\n drivers/vdpa/mlx5/mlx5_vdpa.c              |  2 +-\n drivers/vdpa/mlx5/mlx5_vdpa.h              | 10 +--\n drivers/vdpa/mlx5/mlx5_vdpa_cthread.c      | 70 +++++-------------\n drivers/vdpa/mlx5/mlx5_vdpa_event.c        | 64 +++++-----------\n drivers/vdpa/sfc/sfc_vdpa_ops.c            | 15 ++--\n drivers/vdpa/sfc/sfc_vdpa_ops.h            |  3 +-\n 29 files changed, 203 insertions(+), 276 deletions(-)",
    "diff": "diff --git a/drivers/common/cnxk/roc_dev.c b/drivers/common/cnxk/roc_dev.c\nindex 13d3eece47..08fd13f741 100644\n--- a/drivers/common/cnxk/roc_dev.c\n+++ b/drivers/common/cnxk/roc_dev.c\n@@ -18,7 +18,7 @@\n #define ROC_PCI_SRIOV_TOTAL_VF 0x0e /* Total VFs */\n \n /* VF Mbox handler thread name */\n-#define MBOX_HANDLER_NAME_MAX_LEN 25\n+#define MBOX_HANDLER_NAME_MAX_LEN RTE_THREAD_INTERNAL_NAME_SIZE\n \n /* VF interrupt message pending bits - mbox or flr */\n #define ROC_DEV_MBOX_PEND BIT_ULL(0)\n@@ -1070,7 +1070,7 @@ vf_flr_handle_msg(void *param, dev_intr_t *flr)\n \t}\n }\n \n-static void *\n+static uint32_t\n pf_vf_mbox_thread_main(void *arg)\n {\n \tstruct dev *dev = arg;\n@@ -1114,7 +1114,7 @@ pf_vf_mbox_thread_main(void *arg)\n \n \tpthread_mutex_unlock(&dev->sync.mutex);\n \n-\treturn NULL;\n+\treturn 0;\n }\n \n static void\n@@ -1455,10 +1455,10 @@ dev_init(struct dev *dev, struct plt_pci_device *pci_dev)\n \t\tpthread_cond_init(&dev->sync.pfvf_msg_cond, NULL);\n \t\tpthread_mutex_init(&dev->sync.mutex, NULL);\n \n-\t\tsnprintf(name, MBOX_HANDLER_NAME_MAX_LEN, \"pf%d_vf_msg_hndlr\", dev->pf);\n+\t\tsnprintf(name, MBOX_HANDLER_NAME_MAX_LEN, \"mbox_pf%d\", dev->pf);\n \t\tdev->sync.start_thread = true;\n-\t\trc = plt_ctrl_thread_create(&dev->sync.pfvf_msg_thread, name, NULL,\n-\t\t\t\t\t    pf_vf_mbox_thread_main, dev);\n+\t\trc = plt_thread_create_control(&dev->sync.pfvf_msg_thread, name,\n+\t\t\t\tpf_vf_mbox_thread_main, dev);\n \t\tif (rc != 0) {\n \t\t\tplt_err(\"Failed to create thread for VF mbox handling\\n\");\n \t\t\tgoto iounmap;\n@@ -1488,7 +1488,7 @@ dev_init(struct dev *dev, struct plt_pci_device *pci_dev)\n \tif (dev->sync.start_thread) {\n \t\tdev->sync.start_thread = false;\n \t\tpthread_cond_signal(&dev->sync.pfvf_msg_cond);\n-\t\tpthread_join(dev->sync.pfvf_msg_thread, NULL);\n+\t\tplt_thread_join(dev->sync.pfvf_msg_thread, NULL);\n \t\tpthread_mutex_destroy(&dev->sync.mutex);\n \t\tpthread_cond_destroy(&dev->sync.pfvf_msg_cond);\n \t}\n@@ -1519,7 +1519,7 @@ dev_fini(struct dev *dev, struct plt_pci_device *pci_dev)\n \tif (dev->sync.start_thread) {\n \t\tdev->sync.start_thread = false;\n \t\tpthread_cond_signal(&dev->sync.pfvf_msg_cond);\n-\t\tpthread_join(dev->sync.pfvf_msg_thread, NULL);\n+\t\tplt_thread_join(dev->sync.pfvf_msg_thread, NULL);\n \t\tpthread_mutex_destroy(&dev->sync.mutex);\n \t\tpthread_cond_destroy(&dev->sync.pfvf_msg_cond);\n \t}\ndiff --git a/drivers/common/cnxk/roc_dev_priv.h b/drivers/common/cnxk/roc_dev_priv.h\nindex 1f84f74ff3..c1a37aa4f0 100644\n--- a/drivers/common/cnxk/roc_dev_priv.h\n+++ b/drivers/common/cnxk/roc_dev_priv.h\n@@ -73,7 +73,7 @@ dev_is_afvf(uint16_t pf_func)\n struct mbox_sync {\n \tbool start_thread;\n \tuint8_t msg_avail;\n-\tpthread_t pfvf_msg_thread;\n+\trte_thread_t pfvf_msg_thread;\n \tpthread_cond_t pfvf_msg_cond;\n \tpthread_mutex_t mutex;\n };\ndiff --git a/drivers/common/cnxk/roc_nix_inl_dev.c b/drivers/common/cnxk/roc_nix_inl_dev.c\nindex d76158e30d..7400069309 100644\n--- a/drivers/common/cnxk/roc_nix_inl_dev.c\n+++ b/drivers/common/cnxk/roc_nix_inl_dev.c\n@@ -746,7 +746,7 @@ inl_outb_soft_exp_poll(struct nix_inl_dev *inl_dev, uint32_t ring_idx)\n \t}\n }\n \n-static void *\n+static uint32_t\n nix_inl_outb_poll_thread(void *args)\n {\n \tstruct nix_inl_dev *inl_dev = args;\n@@ -816,9 +816,8 @@ nix_inl_outb_poll_thread_setup(struct nix_inl_dev *inl_dev)\n \n \tsoft_exp_consumer_cnt = 0;\n \tsoft_exp_poll_thread_exit = false;\n-\trc = plt_ctrl_thread_create(&inl_dev->soft_exp_poll_thread,\n-\t\t\t\t    \"OUTB_SOFT_EXP_POLL_THREAD\", NULL,\n-\t\t\t\t    nix_inl_outb_poll_thread, inl_dev);\n+\trc = plt_thread_create_control(&inl_dev->soft_exp_poll_thread,\n+\t\t\t\"outb-poll\", nix_inl_outb_poll_thread, inl_dev);\n \tif (rc) {\n \t\tplt_bitmap_free(inl_dev->soft_exp_ring_bmap);\n \t\tplt_free(inl_dev->soft_exp_ring_bmap_mem);\n@@ -1020,7 +1019,7 @@ roc_nix_inl_dev_fini(struct roc_nix_inl_dev *roc_inl_dev)\n \n \tif (inl_dev->set_soft_exp_poll) {\n \t\tsoft_exp_poll_thread_exit = true;\n-\t\tpthread_join(inl_dev->soft_exp_poll_thread, NULL);\n+\t\trte_thread_join(inl_dev->soft_exp_poll_thread, NULL);\n \t\tplt_bitmap_free(inl_dev->soft_exp_ring_bmap);\n \t\tplt_free(inl_dev->soft_exp_ring_bmap_mem);\n \t\tplt_free(inl_dev->sa_soft_exp_ring);\ndiff --git a/drivers/common/cnxk/roc_nix_inl_priv.h b/drivers/common/cnxk/roc_nix_inl_priv.h\nindex b0a8976c6b..b2b89227b1 100644\n--- a/drivers/common/cnxk/roc_nix_inl_priv.h\n+++ b/drivers/common/cnxk/roc_nix_inl_priv.h\n@@ -67,7 +67,7 @@ struct nix_inl_dev {\n \tstruct roc_cpt_lf cpt_lf;\n \n \t/* OUTB soft expiry poll thread */\n-\tpthread_t soft_exp_poll_thread;\n+\trte_thread_t soft_exp_poll_thread;\n \tuint32_t soft_exp_poll_freq;\n \tuint64_t *sa_soft_exp_ring;\n \tbool set_soft_exp_poll;\ndiff --git a/drivers/common/cnxk/roc_platform.h b/drivers/common/cnxk/roc_platform.h\nindex 08f83aba12..d8f2707a6e 100644\n--- a/drivers/common/cnxk/roc_platform.h\n+++ b/drivers/common/cnxk/roc_platform.h\n@@ -134,7 +134,8 @@\n #define plt_intr_disable\t     rte_intr_disable\n #define plt_thread_is_intr\t     rte_thread_is_intr\n #define plt_intr_callback_fn\t     rte_intr_callback_fn\n-#define plt_ctrl_thread_create\t     rte_ctrl_thread_create\n+#define plt_thread_create_control    rte_thread_create_internal_control\n+#define plt_thread_join\t             rte_thread_join\n \n #define plt_intr_efd_counter_size_get\trte_intr_efd_counter_size_get\n #define plt_intr_efd_counter_size_set\trte_intr_efd_counter_size_set\ndiff --git a/drivers/dma/skeleton/skeleton_dmadev.c b/drivers/dma/skeleton/skeleton_dmadev.c\nindex 4fc2319668..eabe88fada 100644\n--- a/drivers/dma/skeleton/skeleton_dmadev.c\n+++ b/drivers/dma/skeleton/skeleton_dmadev.c\n@@ -100,7 +100,7 @@ static int\n skeldma_start(struct rte_dma_dev *dev)\n {\n \tstruct skeldma_hw *hw = dev->data->dev_private;\n-\tchar name[RTE_MAX_THREAD_NAME_LEN];\n+\tchar name[RTE_THREAD_INTERNAL_NAME_SIZE];\n \trte_cpuset_t cpuset;\n \tint ret;\n \n@@ -127,8 +127,9 @@ skeldma_start(struct rte_dma_dev *dev)\n \n \trte_mb();\n \n-\tsnprintf(name, sizeof(name), \"dpdk-dma-skel%d\", dev->data->dev_id);\n-\tret = rte_thread_create_control(&hw->thread, name, cpucopy_thread, dev);\n+\tsnprintf(name, sizeof(name), \"dma-skel%d\", dev->data->dev_id);\n+\tret = rte_thread_create_internal_control(&hw->thread, name,\n+\t\t\tcpucopy_thread, dev);\n \tif (ret) {\n \t\tSKELDMA_LOG(ERR, \"Start cpucopy thread fail!\");\n \t\treturn -EINVAL;\ndiff --git a/drivers/event/dlb2/pf/base/dlb2_osdep.h b/drivers/event/dlb2/pf/base/dlb2_osdep.h\nindex 75860cca4d..06d69f39b1 100644\n--- a/drivers/event/dlb2/pf/base/dlb2_osdep.h\n+++ b/drivers/event/dlb2/pf/base/dlb2_osdep.h\n@@ -8,7 +8,6 @@\n #include <string.h>\n #include <time.h>\n #include <unistd.h>\n-#include <pthread.h>\n \n #include <rte_string_fns.h>\n #include <rte_cycles.h>\n@@ -154,7 +153,7 @@ static inline void os_fence_hcw(struct dlb2_hw *hw, u64 *pp_addr)\n  * map and unmap requests. To prevent deadlock, this function gives other\n  * threads a chance to grab the resource mutex and configure hardware.\n  */\n-static void *dlb2_complete_queue_map_unmap(void *__args)\n+static uint32_t dlb2_complete_queue_map_unmap(void *__args)\n {\n \tstruct dlb2_dev *dlb2_dev = (struct dlb2_dev *)__args;\n \tint ret;\n@@ -180,7 +179,7 @@ static void *dlb2_complete_queue_map_unmap(void *__args)\n \n \trte_spinlock_unlock(&dlb2_dev->resource_mutex);\n \n-\treturn NULL;\n+\treturn 0;\n }\n \n \n@@ -194,16 +193,13 @@ static void *dlb2_complete_queue_map_unmap(void *__args)\n static inline void os_schedule_work(struct dlb2_hw *hw)\n {\n \tstruct dlb2_dev *dlb2_dev;\n-\tpthread_t complete_queue_map_unmap_thread;\n+\trte_thread_t complete_queue_map_unmap_thread;\n \tint ret;\n \n \tdlb2_dev = container_of(hw, struct dlb2_dev, hw);\n \n-\tret = rte_ctrl_thread_create(&complete_queue_map_unmap_thread,\n-\t\t\t\t     \"dpdk-dlb-qunmap\",\n-\t\t\t\t     NULL,\n-\t\t\t\t     dlb2_complete_queue_map_unmap,\n-\t\t\t\t     dlb2_dev);\n+\tret = rte_thread_create_internal_control(&complete_queue_map_unmap_thread,\n+\t\t\t\"dlb-qunmap\", dlb2_complete_queue_map_unmap, dlb2_dev);\n \tif (ret)\n \t\tDLB2_ERR(dlb2_dev,\n \t\t\t \"Could not create queue complete map/unmap thread, err=%d\\n\",\ndiff --git a/drivers/event/dlb2/pf/base/dlb2_resource.c b/drivers/event/dlb2/pf/base/dlb2_resource.c\nindex dd8390a013..7ce3e3531c 100644\n--- a/drivers/event/dlb2/pf/base/dlb2_resource.c\n+++ b/drivers/event/dlb2/pf/base/dlb2_resource.c\n@@ -759,18 +759,13 @@ static int dlb2_attach_ldb_queues(struct dlb2_hw *hw,\n }\n \n static int\n-dlb2_pp_profile(struct dlb2_hw *hw, int port, int cpu, bool is_ldb)\n+dlb2_pp_profile(struct dlb2_hw *hw, int port, bool is_ldb)\n {\n \tu64 cycle_start = 0ULL, cycle_end = 0ULL;\n \tstruct dlb2_hcw hcw_mem[DLB2_HCW_MEM_SIZE], *hcw;\n \tvoid __iomem *pp_addr;\n-\tcpu_set_t cpuset;\n \tint i;\n \n-\tCPU_ZERO(&cpuset);\n-\tCPU_SET(cpu, &cpuset);\n-\tsched_setaffinity(0, sizeof(cpuset), &cpuset);\n-\n \tpp_addr = os_map_producer_port(hw, port, is_ldb);\n \n \t/* Point hcw to a 64B-aligned location */\n@@ -797,18 +792,15 @@ dlb2_pp_profile(struct dlb2_hw *hw, int port, int cpu, bool is_ldb)\n \treturn (int)(cycle_end - cycle_start);\n }\n \n-static void *\n+static uint32_t\n dlb2_pp_profile_func(void *data)\n {\n \tstruct dlb2_pp_thread_data *thread_data = data;\n-\tint cycles;\n \n-\tcycles = dlb2_pp_profile(thread_data->hw, thread_data->pp,\n-\tthread_data->cpu, thread_data->is_ldb);\n+\tthread_data->cycles = dlb2_pp_profile(thread_data->hw,\n+\t\t\tthread_data->pp, thread_data->is_ldb);\n \n-\tthread_data->cycles = cycles;\n-\n-\treturn NULL;\n+\treturn 0;\n }\n \n static int dlb2_pp_cycle_comp(const void *a, const void *b)\n@@ -831,7 +823,9 @@ dlb2_get_pp_allocation(struct dlb2_hw *hw, int cpu, int port_type)\n \tint num_ports_per_sort, num_ports, num_sort, i, err;\n \tbool is_ldb = (port_type == DLB2_LDB_PORT);\n \tint *port_allocations;\n-\tpthread_t pthread;\n+\trte_thread_t thread;\n+\trte_thread_attr_t th_attr;\n+\tchar th_name[RTE_THREAD_INTERNAL_NAME_SIZE];\n \n \tif (is_ldb) {\n \t\tport_allocations = hw->ldb_pp_allocations;\n@@ -857,16 +851,25 @@ dlb2_get_pp_allocation(struct dlb2_hw *hw, int cpu, int port_type)\n \t\tdlb2_thread_data[i].pp = i;\n \t\tdlb2_thread_data[i].cycles = 0;\n \t\tdlb2_thread_data[i].hw = hw;\n-\t\tdlb2_thread_data[i].cpu = cpu;\n \n-\t\terr = pthread_create(&pthread, NULL, &dlb2_pp_profile_func,\n-\t\t\t\t     &dlb2_thread_data[i]);\n+\t\terr = rte_thread_attr_init(&th_attr);\n+\t\tif (err != 0) {\n+\t\t\tDLB2_LOG_ERR(\": thread attribute failed! err=%d\", err);\n+\t\t\treturn;\n+\t\t}\n+\t\tCPU_SET(cpu, &th_attr.cpuset);\n+\n+\t\terr = rte_thread_create(&thread, &th_attr,\n+\t\t\t\t&dlb2_pp_profile_func, &dlb2_thread_data[i]);\n \t\tif (err) {\n \t\t\tDLB2_LOG_ERR(\": thread creation failed! err=%d\", err);\n \t\t\treturn;\n \t\t}\n \n-\t\terr = pthread_join(pthread, NULL);\n+\t\tsnprintf(th_name, sizeof(th_name), \"dlb2-pp%d\", cpu);\n+\t\trte_thread_set_prefixed_name(thread, th_name);\n+\n+\t\terr = rte_thread_join(thread, NULL);\n \t\tif (err) {\n \t\t\tDLB2_LOG_ERR(\": thread join failed! err=%d\", err);\n \t\t\treturn;\ndiff --git a/drivers/event/dlb2/pf/dlb2_main.h b/drivers/event/dlb2/pf/dlb2_main.h\nindex 4c64d72e9c..12912a2dec 100644\n--- a/drivers/event/dlb2/pf/dlb2_main.h\n+++ b/drivers/event/dlb2/pf/dlb2_main.h\n@@ -52,7 +52,6 @@ struct dlb2_dev {\n struct dlb2_pp_thread_data {\n \tstruct dlb2_hw *hw;\n \tint pp;\n-\tint cpu;\n \tbool is_ldb;\n \tint cycles;\n };\ndiff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c\nindex 30814650bf..3ddcc9b461 100644\n--- a/drivers/net/ark/ark_ethdev.c\n+++ b/drivers/net/ark/ark_ethdev.c\n@@ -598,17 +598,16 @@ eth_ark_dev_start(struct rte_eth_dev *dev)\n \t\tark_pktchkr_run(ark->pc);\n \n \tif (!ark->isvf && ark->start_pg && !ark->pg_running) {\n-\t\tpthread_t thread;\n+\t\trte_thread_t thread;\n \n \t\t/* Delay packet generator start allow the hardware to be ready\n \t\t * This is only used for sanity checking with internal generator\n \t\t */\n-\t\tchar tname[32];\n-\t\tsnprintf(tname, sizeof(tname), \"dpdk-ark-pg%d\",\n-\t\t\t dev->data->port_id);\n+\t\tchar tname[RTE_THREAD_INTERNAL_NAME_SIZE];\n+\t\tsnprintf(tname, sizeof(tname), \"ark-pg%d\", dev->data->port_id);\n \n-\t\tif (rte_ctrl_thread_create(&thread, tname, NULL,\n-\t\t\t\t\t   ark_pktgen_delay_start, ark->pg)) {\n+\t\tif (rte_thread_create_internal_control(&thread, tname,\n+\t\t\t\t\tark_pktgen_delay_start, ark->pg)) {\n \t\t\tARK_PMD_LOG(ERR, \"Could not create pktgen \"\n \t\t\t\t    \"starter thread\\n\");\n \t\t\treturn -1;\ndiff --git a/drivers/net/ark/ark_pktgen.c b/drivers/net/ark/ark_pktgen.c\nindex cd2d3adc51..69ff7072b2 100644\n--- a/drivers/net/ark/ark_pktgen.c\n+++ b/drivers/net/ark/ark_pktgen.c\n@@ -4,10 +4,10 @@\n \n #include <stdlib.h>\n #include <unistd.h>\n-#include <pthread.h>\n \n #include <rte_string_fns.h>\n #include <rte_malloc.h>\n+#include <rte_thread.h>\n \n #include \"ark_pktgen.h\"\n #include \"ark_logs.h\"\n@@ -467,7 +467,7 @@ ark_pktgen_setup(ark_pkt_gen_t handle)\n \t}\n }\n \n-void *\n+uint32_t\n ark_pktgen_delay_start(void *arg)\n {\n \tstruct ark_pkt_gen_inst *inst = (struct ark_pkt_gen_inst *)arg;\n@@ -476,8 +476,8 @@ ark_pktgen_delay_start(void *arg)\n \t * perform a blind sleep here to ensure that the external test\n \t * application has time to setup the test before we generate packets\n \t */\n-\tpthread_detach(pthread_self());\n+\trte_thread_detach(rte_thread_self());\n \tusleep(100000);\n \tark_pktgen_run(inst);\n-\treturn NULL;\n+\treturn 0;\n }\ndiff --git a/drivers/net/ark/ark_pktgen.h b/drivers/net/ark/ark_pktgen.h\nindex 7147fe1bd4..925058367c 100644\n--- a/drivers/net/ark/ark_pktgen.h\n+++ b/drivers/net/ark/ark_pktgen.h\n@@ -75,6 +75,6 @@ void ark_pktgen_set_hdr_dW(ark_pkt_gen_t handle, uint32_t *hdr);\n void ark_pktgen_set_start_offset(ark_pkt_gen_t handle, uint32_t x);\n void ark_pktgen_parse(char *argv);\n void ark_pktgen_setup(ark_pkt_gen_t handle);\n-void *ark_pktgen_delay_start(void *arg);\n+uint32_t ark_pktgen_delay_start(void *arg);\n \n #endif\ndiff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c\nindex 6baa6d5955..b3e106b41f 100644\n--- a/drivers/net/iavf/iavf_vchnl.c\n+++ b/drivers/net/iavf/iavf_vchnl.c\n@@ -135,7 +135,7 @@ iavf_dev_event_handler_init(void)\n \tTAILQ_INIT(&handler->pending);\n \tpthread_mutex_init(&handler->lock, NULL);\n \n-\tif (rte_thread_create_control(&handler->tid, \"dpdk-iavf-event\",\n+\tif (rte_thread_create_internal_control(&handler->tid, \"iavf-event\",\n \t\t\t\tiavf_dev_event_handle, NULL)) {\n \t\t__atomic_fetch_sub(&handler->ndev, 1, __ATOMIC_RELAXED);\n \t\treturn -1;\ndiff --git a/drivers/net/ice/ice_dcf_parent.c b/drivers/net/ice/ice_dcf_parent.c\nindex d3bb65874f..173ed9f81d 100644\n--- a/drivers/net/ice/ice_dcf_parent.c\n+++ b/drivers/net/ice/ice_dcf_parent.c\n@@ -165,9 +165,8 @@ ice_dcf_vsi_update_service_handler(void *param)\n static void\n start_vsi_reset_thread(struct ice_dcf_hw *dcf_hw, bool vfr, uint16_t vf_id)\n {\n-#define THREAD_NAME_LEN\t16\n \tstruct ice_dcf_reset_event_param *param;\n-\tchar name[THREAD_NAME_LEN];\n+\tchar name[RTE_THREAD_INTERNAL_NAME_SIZE];\n \trte_thread_t thread;\n \tint ret;\n \n@@ -181,8 +180,8 @@ start_vsi_reset_thread(struct ice_dcf_hw *dcf_hw, bool vfr, uint16_t vf_id)\n \tparam->vfr = vfr;\n \tparam->vf_id = vf_id;\n \n-\tsnprintf(name, sizeof(name), \"dpdk-ice-rst%u\", vf_id);\n-\tret = rte_thread_create_control(&thread, name,\n+\tsnprintf(name, sizeof(name), \"ice-rst%u\", vf_id);\n+\tret = rte_thread_create_internal_control(&thread, name,\n \t\t\t\t     ice_dcf_vsi_update_service_handler, param);\n \tif (ret != 0) {\n \t\tPMD_DRV_LOG(ERR, \"Failed to start the thread for reset handling\");\ndiff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c\nindex c82f8b5333..57ec7a19bc 100644\n--- a/drivers/net/ipn3ke/ipn3ke_representor.c\n+++ b/drivers/net/ipn3ke/ipn3ke_representor.c\n@@ -27,7 +27,7 @@\n #include \"ipn3ke_ethdev.h\"\n \n static int ipn3ke_rpst_scan_num;\n-static pthread_t ipn3ke_rpst_scan_thread;\n+static rte_thread_t ipn3ke_rpst_scan_thread;\n \n /** Double linked list of representor port. */\n TAILQ_HEAD(ipn3ke_rpst_list, ipn3ke_rpst);\n@@ -2558,7 +2558,7 @@ ipn3ke_rpst_link_check(struct ipn3ke_rpst *rpst)\n \treturn 0;\n }\n \n-static void *\n+static uint32_t\n ipn3ke_rpst_scan_handle_request(__rte_unused void *param)\n {\n \tstruct ipn3ke_rpst *rpst;\n@@ -2580,10 +2580,10 @@ ipn3ke_rpst_scan_handle_request(__rte_unused void *param)\n \t\trte_delay_us(50 * MS);\n \n \t\tif (num == 0 || num == 0xffffff)\n-\t\t\treturn NULL;\n+\t\t\treturn 0;\n \t}\n \n-\treturn NULL;\n+\treturn 0;\n }\n \n static int\n@@ -2592,20 +2592,19 @@ ipn3ke_rpst_scan_check(void)\n \tint ret;\n \n \tif (ipn3ke_rpst_scan_num == 1) {\n-\t\tret = rte_ctrl_thread_create(&ipn3ke_rpst_scan_thread,\n-\t\t\t\"dpdk-ipn3ke-scn\",\n-\t\t\tNULL,\n+\t\tret = rte_thread_create_internal_control(&ipn3ke_rpst_scan_thread,\n+\t\t\t\"ipn3ke-scn\",\n \t\t\tipn3ke_rpst_scan_handle_request, NULL);\n \t\tif (ret) {\n \t\t\tIPN3KE_AFU_PMD_ERR(\"Fail to create ipn3ke rpst scan thread\");\n \t\t\treturn -1;\n \t\t}\n \t} else if (ipn3ke_rpst_scan_num == 0) {\n-\t\tret = pthread_cancel(ipn3ke_rpst_scan_thread);\n+\t\tret = pthread_cancel((pthread_t)ipn3ke_rpst_scan_thread.opaque_id);\n \t\tif (ret)\n \t\t\tIPN3KE_AFU_PMD_ERR(\"Can't cancel the thread\");\n \n-\t\tret = pthread_join(ipn3ke_rpst_scan_thread, NULL);\n+\t\tret = rte_thread_join(ipn3ke_rpst_scan_thread, NULL);\n \t\tif (ret)\n \t\t\tIPN3KE_AFU_PMD_ERR(\"Can't join the thread\");\n \ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c\nindex 64e7e5d7d6..cd4a85b3a7 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.c\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.c\n@@ -4328,10 +4328,9 @@ ixgbe_dev_link_update_share(struct rte_eth_dev *dev,\n \t\t\t\t * when there is no link thread running.\n \t\t\t\t */\n \t\t\t\tintr->flags |= IXGBE_FLAG_NEED_LINK_CONFIG;\n-\t\t\t\tif (rte_thread_create_control(&ad->link_thread_tid,\n-\t\t\t\t\t\"dpdk-ixgbe-link\",\n-\t\t\t\t\tixgbe_dev_setup_link_thread_handler,\n-\t\t\t\t\tdev) < 0) {\n+\t\t\t\tif (rte_thread_create_internal_control(&ad->link_thread_tid,\n+\t\t\t\t\t\t\"ixgbe-link\",\n+\t\t\t\t\t\tixgbe_dev_setup_link_thread_handler, dev) < 0) {\n \t\t\t\t\tPMD_DRV_LOG(ERR,\n \t\t\t\t\t\t\"Create link thread failed!\");\n \t\t\t\t\t/* NOTE: review for potential ordering optimization */\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 3785103308..c587e13c63 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -1368,7 +1368,7 @@ struct mlx5_hws_cnt_svc_mng {\n \tuint32_t refcnt;\n \tuint32_t service_core;\n \tuint32_t query_interval;\n-\tpthread_t service_thread;\n+\trte_thread_t service_thread;\n \tuint8_t svc_running;\n \tstruct mlx5_hws_aso_mng aso_mng __rte_cache_aligned;\n };\ndiff --git a/drivers/net/mlx5/mlx5_hws_cnt.c b/drivers/net/mlx5/mlx5_hws_cnt.c\nindex a0f0febbc7..f556a9fbcc 100644\n--- a/drivers/net/mlx5/mlx5_hws_cnt.c\n+++ b/drivers/net/mlx5/mlx5_hws_cnt.c\n@@ -9,6 +9,7 @@\n #include <mlx5_devx_cmds.h>\n #include <rte_cycles.h>\n #include <rte_eal_paging.h>\n+#include <rte_thread.h>\n \n #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)\n \n@@ -286,7 +287,7 @@ mlx5_hws_cnt_raw_data_alloc(struct mlx5_dev_ctx_shared *sh, uint32_t n)\n \treturn NULL;\n }\n \n-static void *\n+static uint32_t\n mlx5_hws_cnt_svc(void *opaque)\n {\n \tstruct mlx5_dev_ctx_shared *sh =\n@@ -318,7 +319,7 @@ mlx5_hws_cnt_svc(void *opaque)\n \t\tif (interval > query_us)\n \t\t\trte_delay_us_sleep(sleep_us);\n \t}\n-\treturn NULL;\n+\treturn 0;\n }\n \n static void\n@@ -438,36 +439,37 @@ mlx5_hws_cnt_pool_init(struct mlx5_dev_ctx_shared *sh,\n int\n mlx5_hws_cnt_service_thread_create(struct mlx5_dev_ctx_shared *sh)\n {\n-\tchar name[RTE_MAX_THREAD_NAME_LEN];\n-\trte_cpuset_t cpuset;\n+\tchar name[RTE_THREAD_INTERNAL_NAME_SIZE];\n+\trte_thread_attr_t attr;\n \tint ret;\n \tuint32_t service_core = sh->cnt_svc->service_core;\n \n-\tCPU_ZERO(&cpuset);\n+\tret = rte_thread_attr_init(&attr);\n+\tif (ret != 0)\n+\t\tgoto error;\n+\tCPU_SET(service_core, &attr.cpuset);\n \tsh->cnt_svc->svc_running = 1;\n-\tret = pthread_create(&sh->cnt_svc->service_thread, NULL,\n-\t\t\tmlx5_hws_cnt_svc, sh);\n-\tif (ret != 0) {\n-\t\tDRV_LOG(ERR, \"Failed to create HW steering's counter service thread.\");\n-\t\treturn -ENOSYS;\n-\t}\n-\tsnprintf(name, RTE_MAX_THREAD_NAME_LEN, \"dpdk-mlx5-%d\", service_core);\n-\trte_thread_set_name((rte_thread_t){(uintptr_t)sh->cnt_svc->service_thread},\n-\t\tname);\n-\tCPU_SET(service_core, &cpuset);\n-\tpthread_setaffinity_np(sh->cnt_svc->service_thread, sizeof(cpuset),\n-\t\t\t\t&cpuset);\n+\tret = rte_thread_create(&sh->cnt_svc->service_thread,\n+\t\t\t&attr, mlx5_hws_cnt_svc, sh);\n+\tif (ret != 0)\n+\t\tgoto error;\n+\tsnprintf(name, sizeof(name), \"mlx5-cn%d\", service_core);\n+\trte_thread_set_prefixed_name(sh->cnt_svc->service_thread, name);\n+\n \treturn 0;\n+error:\n+\tDRV_LOG(ERR, \"Failed to create HW steering's counter service thread.\");\n+\treturn ret;\n }\n \n void\n mlx5_hws_cnt_service_thread_destroy(struct mlx5_dev_ctx_shared *sh)\n {\n-\tif (sh->cnt_svc->service_thread == 0)\n+\tif (sh->cnt_svc->service_thread.opaque_id == 0)\n \t\treturn;\n \tsh->cnt_svc->svc_running = 0;\n-\tpthread_join(sh->cnt_svc->service_thread, NULL);\n-\tsh->cnt_svc->service_thread = 0;\n+\trte_thread_join(sh->cnt_svc->service_thread, NULL);\n+\tsh->cnt_svc->service_thread.opaque_id = 0;\n }\n \n static int\ndiff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h\nindex 646d055ac1..7988424449 100644\n--- a/drivers/net/sfc/sfc_mae.h\n+++ b/drivers/net/sfc/sfc_mae.h\n@@ -196,7 +196,7 @@ struct sfc_mae_counter_registry {\n \t\t} service;\n \t\tstruct {\n \t\t\t/** Counter thread ID */\n-\t\t\tpthread_t\t\t\tid;\n+\t\t\trte_thread_t\t\t\tid;\n \t\t\t/** The thread should keep running */\n \t\t\tbool\t\t\t\trun;\n \t\t} thread;\ndiff --git a/drivers/net/sfc/sfc_mae_counter.c b/drivers/net/sfc/sfc_mae_counter.c\nindex 631b54afeb..ba17295719 100644\n--- a/drivers/net/sfc/sfc_mae_counter.c\n+++ b/drivers/net/sfc/sfc_mae_counter.c\n@@ -490,7 +490,7 @@ sfc_mae_counter_service_routine(void *arg)\n \treturn 0;\n }\n \n-static void *\n+static uint32_t\n sfc_mae_counter_thread(void *data)\n {\n \tstruct sfc_adapter *sa = data;\n@@ -521,7 +521,7 @@ sfc_mae_counter_thread(void *data)\n \t\t}\n \t}\n \n-\treturn NULL;\n+\treturn 0;\n }\n \n static void\n@@ -687,7 +687,7 @@ sfc_mae_counter_thread_stop(struct sfc_adapter *sa)\n \t__atomic_store_n(&counter_registry->polling.thread.run, false,\n \t\t\t __ATOMIC_RELEASE);\n \n-\trc = pthread_join(counter_registry->polling.thread.id, NULL);\n+\trc = rte_thread_join(counter_registry->polling.thread.id, NULL);\n \tif (rc != 0)\n \t\tsfc_err(sa, \"failed to join the MAE counter polling thread\");\n \n@@ -710,9 +710,8 @@ sfc_mae_counter_thread_spawn(struct sfc_adapter *sa,\n \tcounter_registry->polling_mode = SFC_MAE_COUNTER_POLLING_THREAD;\n \tcounter_registry->polling.thread.run = true;\n \n-\trc = rte_ctrl_thread_create(&sa->mae.counter_registry.polling.thread.id,\n-\t\t\t\t    \"dpdk-sfc-maecnt\", NULL,\n-\t\t\t\t    sfc_mae_counter_thread, sa);\n+\trc = rte_thread_create_internal_control(&sa->mae.counter_registry.polling.thread.id,\n+\t\t\t\"sfc-maecnt\", sfc_mae_counter_thread, sa);\n \n \treturn rc;\n }\ndiff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c\nindex 198fac8318..15911a3621 100644\n--- a/drivers/net/txgbe/txgbe_ethdev.c\n+++ b/drivers/net/txgbe/txgbe_ethdev.c\n@@ -2896,9 +2896,9 @@ txgbe_dev_link_update_share(struct rte_eth_dev *dev,\n \t\t\t\t * when there is no link thread running.\n \t\t\t\t */\n \t\t\t\tintr->flags |= TXGBE_FLAG_NEED_LINK_CONFIG;\n-\t\t\t\tif (rte_thread_create_control(&ad->link_thread_tid,\n-\t\t\t\t\t\"dpdk-txgbe-link\",\n-\t\t\t\t\ttxgbe_dev_setup_link_thread_handler, dev) < 0) {\n+\t\t\t\tif (rte_thread_create_internal_control(&ad->link_thread_tid,\n+\t\t\t\t\t\t\"txgbe-link\",\n+\t\t\t\t\t\ttxgbe_dev_setup_link_thread_handler, dev) < 0) {\n \t\t\t\t\tPMD_DRV_LOG(ERR, \"Create link thread failed!\");\n \t\t\t\t\t__atomic_clear(&ad->link_thread_running, __ATOMIC_SEQ_CST);\n \t\t\t\t}\ndiff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c\nindex a7b18299de..f89bd3f9e2 100644\n--- a/drivers/raw/ifpga/ifpga_rawdev.c\n+++ b/drivers/raw/ifpga/ifpga_rawdev.c\n@@ -74,7 +74,7 @@ static const struct rte_pci_id pci_ifpga_map[] = {\n static struct ifpga_rawdev ifpga_rawdevices[IFPGA_RAWDEV_NUM];\n \n static int ifpga_monitor_refcnt;\n-static pthread_t ifpga_monitor_start_thread;\n+static rte_thread_t ifpga_monitor_start_thread;\n \n static struct ifpga_rawdev *\n ifpga_rawdev_allocate(struct rte_rawdev *rawdev);\n@@ -504,7 +504,7 @@ static int set_surprise_link_check_aer(\n \treturn -EFAULT;\n }\n \n-static void *\n+static uint32_t\n ifpga_rawdev_gsd_handle(__rte_unused void *param)\n {\n \tstruct ifpga_rawdev *ifpga_rdev;\n@@ -532,7 +532,7 @@ ifpga_rawdev_gsd_handle(__rte_unused void *param)\n \t\trte_delay_us(100 * MS);\n \t}\n \n-\treturn NULL;\n+\treturn 0;\n }\n \n static int\n@@ -550,11 +550,10 @@ ifpga_monitor_start_func(struct ifpga_rawdev *dev)\n \tdev->poll_enabled = 1;\n \n \tif (!__atomic_fetch_add(&ifpga_monitor_refcnt, 1, __ATOMIC_RELAXED)) {\n-\t\tret = rte_ctrl_thread_create(&ifpga_monitor_start_thread,\n-\t\t\t\t\t     \"dpdk-ifpga-mon\", NULL,\n-\t\t\t\t\t     ifpga_rawdev_gsd_handle, NULL);\n+\t\tret = rte_thread_create_internal_control(&ifpga_monitor_start_thread,\n+\t\t\t\t\"ifpga-mon\", ifpga_rawdev_gsd_handle, NULL);\n \t\tif (ret != 0) {\n-\t\t\tifpga_monitor_start_thread = 0;\n+\t\t\tifpga_monitor_start_thread.opaque_id = 0;\n \t\t\tIFPGA_RAWDEV_PMD_ERR(\n \t\t\t\t\"Fail to create ifpga monitor thread\");\n \t\t\treturn -1;\n@@ -575,12 +574,12 @@ ifpga_monitor_stop_func(struct ifpga_rawdev *dev)\n \tdev->poll_enabled = 0;\n \n \tif (!(__atomic_fetch_sub(&ifpga_monitor_refcnt, 1, __ATOMIC_RELAXED) - 1) &&\n-\t\tifpga_monitor_start_thread) {\n-\t\tret = pthread_cancel(ifpga_monitor_start_thread);\n+\t\tifpga_monitor_start_thread.opaque_id != 0) {\n+\t\tret = pthread_cancel((pthread_t)ifpga_monitor_start_thread.opaque_id);\n \t\tif (ret)\n \t\t\tIFPGA_RAWDEV_PMD_ERR(\"Can't cancel the thread\");\n \n-\t\tret = pthread_join(ifpga_monitor_start_thread, NULL);\n+\t\tret = rte_thread_join(ifpga_monitor_start_thread, NULL);\n \t\tif (ret)\n \t\t\tIFPGA_RAWDEV_PMD_ERR(\"Can't join the thread\");\n \ndiff --git a/drivers/vdpa/ifc/ifcvf_vdpa.c b/drivers/vdpa/ifc/ifcvf_vdpa.c\nindex 55346bbc08..f034bd59ba 100644\n--- a/drivers/vdpa/ifc/ifcvf_vdpa.c\n+++ b/drivers/vdpa/ifc/ifcvf_vdpa.c\n@@ -58,8 +58,8 @@ struct ifcvf_internal {\n \tint vfio_container_fd;\n \tint vfio_group_fd;\n \tint vfio_dev_fd;\n-\tpthread_t tid;\t/* thread for notify relay */\n-\tpthread_t intr_tid; /* thread for config space change interrupt relay */\n+\trte_thread_t tid; /* thread for notify relay */\n+\trte_thread_t intr_tid; /* thread for config space change interrupt relay */\n \tint epfd;\n \tint csc_epfd;\n \tint vid;\n@@ -496,7 +496,7 @@ vdpa_disable_vfio_intr(struct ifcvf_internal *internal)\n \treturn 0;\n }\n \n-static void *\n+static uint32_t\n notify_relay(void *arg)\n {\n \tint i, kickfd, epfd, nfds = 0;\n@@ -514,7 +514,7 @@ notify_relay(void *arg)\n \tepfd = epoll_create(IFCVF_MAX_QUEUES * 2);\n \tif (epfd < 0) {\n \t\tDRV_LOG(ERR, \"failed to create epoll instance.\");\n-\t\treturn NULL;\n+\t\treturn 1;\n \t}\n \tinternal->epfd = epfd;\n \n@@ -527,7 +527,7 @@ notify_relay(void *arg)\n \t\tev.data.u64 = qid | (uint64_t)vring.kickfd << 32;\n \t\tif (epoll_ctl(epfd, EPOLL_CTL_ADD, vring.kickfd, &ev) < 0) {\n \t\t\tDRV_LOG(ERR, \"epoll add error: %s\", strerror(errno));\n-\t\t\treturn NULL;\n+\t\t\treturn 1;\n \t\t}\n \t}\n \n@@ -537,7 +537,7 @@ notify_relay(void *arg)\n \t\t\tif (errno == EINTR)\n \t\t\t\tcontinue;\n \t\t\tDRV_LOG(ERR, \"epoll_wait return fail\\n\");\n-\t\t\treturn NULL;\n+\t\t\treturn 1;\n \t\t}\n \n \t\tfor (i = 0; i < nfds; i++) {\n@@ -561,18 +561,18 @@ notify_relay(void *arg)\n \t\t}\n \t}\n \n-\treturn NULL;\n+\treturn 0;\n }\n \n static int\n setup_notify_relay(struct ifcvf_internal *internal)\n {\n-\tchar name[THREAD_NAME_LEN];\n+\tchar name[RTE_THREAD_INTERNAL_NAME_SIZE];\n \tint ret;\n \n-\tsnprintf(name, sizeof(name), \"dpdk-ifc-noti%d\", internal->vid);\n-\tret = rte_ctrl_thread_create(&internal->tid, name, NULL, notify_relay,\n-\t\t\t\t     (void *)internal);\n+\tsnprintf(name, sizeof(name), \"ifc-noti%d\", internal->vid);\n+\tret = rte_thread_create_internal_control(&internal->tid, name,\n+\t\t\tnotify_relay, internal);\n \tif (ret != 0) {\n \t\tDRV_LOG(ERR, \"failed to create notify relay pthread.\");\n \t\treturn -1;\n@@ -584,13 +584,11 @@ setup_notify_relay(struct ifcvf_internal *internal)\n static int\n unset_notify_relay(struct ifcvf_internal *internal)\n {\n-\tvoid *status;\n-\n-\tif (internal->tid) {\n-\t\tpthread_cancel(internal->tid);\n-\t\tpthread_join(internal->tid, &status);\n+\tif (internal->tid.opaque_id != 0) {\n+\t\tpthread_cancel((pthread_t)internal->tid.opaque_id);\n+\t\trte_thread_join(internal->tid, NULL);\n \t}\n-\tinternal->tid = 0;\n+\tinternal->tid.opaque_id = 0;\n \n \tif (internal->epfd >= 0)\n \t\tclose(internal->epfd);\n@@ -610,7 +608,7 @@ virtio_interrupt_handler(struct ifcvf_internal *internal)\n \t\tDRV_LOG(ERR, \"failed to notify the guest about configuration space change.\");\n }\n \n-static void *\n+static uint32_t\n intr_relay(void *arg)\n {\n \tstruct ifcvf_internal *internal = (struct ifcvf_internal *)arg;\n@@ -623,7 +621,7 @@ intr_relay(void *arg)\n \tcsc_epfd = epoll_create(1);\n \tif (csc_epfd < 0) {\n \t\tDRV_LOG(ERR, \"failed to create epoll for config space change.\");\n-\t\treturn NULL;\n+\t\treturn 1;\n \t}\n \n \tev.events = EPOLLIN | EPOLLPRI | EPOLLRDHUP | EPOLLHUP;\n@@ -672,18 +670,18 @@ intr_relay(void *arg)\n \t\tclose(csc_epfd);\n \tinternal->csc_epfd = -1;\n \n-\treturn NULL;\n+\treturn 0;\n }\n \n static int\n setup_intr_relay(struct ifcvf_internal *internal)\n {\n-\tchar name[THREAD_NAME_LEN];\n+\tchar name[RTE_THREAD_INTERNAL_NAME_SIZE];\n \tint ret;\n \n-\tsnprintf(name, sizeof(name), \"dpdk-ifc-int%d\", internal->vid);\n-\tret = rte_ctrl_thread_create(&internal->intr_tid, name, NULL,\n-\t\t\t\t     intr_relay, (void *)internal);\n+\tsnprintf(name, sizeof(name), \"ifc-int%d\", internal->vid);\n+\tret = rte_thread_create_internal_control(&internal->intr_tid, name,\n+\t\t\tintr_relay, (void *)internal);\n \tif (ret) {\n \t\tDRV_LOG(ERR, \"failed to create notify relay pthread.\");\n \t\treturn -1;\n@@ -694,13 +692,11 @@ setup_intr_relay(struct ifcvf_internal *internal)\n static void\n unset_intr_relay(struct ifcvf_internal *internal)\n {\n-\tvoid *status;\n-\n-\tif (internal->intr_tid) {\n-\t\tpthread_cancel(internal->intr_tid);\n-\t\tpthread_join(internal->intr_tid, &status);\n+\tif (internal->intr_tid.opaque_id != 0) {\n+\t\tpthread_cancel((pthread_t)internal->intr_tid.opaque_id);\n+\t\trte_thread_join(internal->intr_tid, NULL);\n \t}\n-\tinternal->intr_tid = 0;\n+\tinternal->intr_tid.opaque_id = 0;\n \n \tif (internal->csc_epfd >= 0)\n \t\tclose(internal->csc_epfd);\n@@ -922,7 +918,7 @@ update_used_ring(struct ifcvf_internal *internal, uint16_t qid)\n \trte_vhost_vring_call(internal->vid, qid);\n }\n \n-static void *\n+static uint32_t\n vring_relay(void *arg)\n {\n \tint i, vid, epfd, fd, nfds;\n@@ -941,7 +937,7 @@ vring_relay(void *arg)\n \tepfd = epoll_create(IFCVF_MAX_QUEUES * 2);\n \tif (epfd < 0) {\n \t\tDRV_LOG(ERR, \"failed to create epoll instance.\");\n-\t\treturn NULL;\n+\t\treturn 1;\n \t}\n \tinternal->epfd = epfd;\n \n@@ -952,7 +948,7 @@ vring_relay(void *arg)\n \t\tev.data.u64 = qid << 1 | (uint64_t)vring.kickfd << 32;\n \t\tif (epoll_ctl(epfd, EPOLL_CTL_ADD, vring.kickfd, &ev) < 0) {\n \t\t\tDRV_LOG(ERR, \"epoll add error: %s\", strerror(errno));\n-\t\t\treturn NULL;\n+\t\t\treturn 1;\n \t\t}\n \t}\n \n@@ -966,7 +962,7 @@ vring_relay(void *arg)\n \t\tif (epoll_ctl(epfd, EPOLL_CTL_ADD, internal->intr_fd[qid], &ev)\n \t\t\t\t< 0) {\n \t\t\tDRV_LOG(ERR, \"epoll add error: %s\", strerror(errno));\n-\t\t\treturn NULL;\n+\t\t\treturn 1;\n \t\t}\n \t\tupdate_used_ring(internal, qid);\n \t}\n@@ -982,7 +978,7 @@ vring_relay(void *arg)\n \t\t\tif (errno == EINTR)\n \t\t\t\tcontinue;\n \t\t\tDRV_LOG(ERR, \"epoll_wait return fail.\");\n-\t\t\treturn NULL;\n+\t\t\treturn 1;\n \t\t}\n \n \t\tfor (i = 0; i < nfds; i++) {\n@@ -1010,18 +1006,18 @@ vring_relay(void *arg)\n \t\t}\n \t}\n \n-\treturn NULL;\n+\treturn 0;\n }\n \n static int\n setup_vring_relay(struct ifcvf_internal *internal)\n {\n-\tchar name[THREAD_NAME_LEN];\n+\tchar name[RTE_THREAD_INTERNAL_NAME_SIZE];\n \tint ret;\n \n-\tsnprintf(name, sizeof(name), \"dpdk-ifc-ring%d\", internal->vid);\n-\tret = rte_ctrl_thread_create(&internal->tid, name, NULL, vring_relay,\n-\t\t\t\t     (void *)internal);\n+\tsnprintf(name, sizeof(name), \"ifc-ring%d\", internal->vid);\n+\tret = rte_thread_create_internal_control(&internal->tid, name,\n+\t\t\tvring_relay, internal);\n \tif (ret != 0) {\n \t\tDRV_LOG(ERR, \"failed to create ring relay pthread.\");\n \t\treturn -1;\n@@ -1033,13 +1029,11 @@ setup_vring_relay(struct ifcvf_internal *internal)\n static int\n unset_vring_relay(struct ifcvf_internal *internal)\n {\n-\tvoid *status;\n-\n-\tif (internal->tid) {\n-\t\tpthread_cancel(internal->tid);\n-\t\tpthread_join(internal->tid, &status);\n+\tif (internal->tid.opaque_id != 0) {\n+\t\tpthread_cancel((pthread_t)internal->tid.opaque_id);\n+\t\trte_thread_join(internal->tid, NULL);\n \t}\n-\tinternal->tid = 0;\n+\tinternal->tid.opaque_id = 0;\n \n \tif (internal->epfd >= 0)\n \t\tclose(internal->epfd);\ndiff --git a/drivers/vdpa/mlx5/mlx5_vdpa.c b/drivers/vdpa/mlx5/mlx5_vdpa.c\nindex f1737f82a8..01a5877d08 100644\n--- a/drivers/vdpa/mlx5/mlx5_vdpa.c\n+++ b/drivers/vdpa/mlx5/mlx5_vdpa.c\n@@ -844,7 +844,7 @@ mlx5_vdpa_dev_probe(struct mlx5_common_device *cdev,\n \tmlx5_vdpa_config_get(mkvlist, priv);\n \tif (priv->use_c_thread) {\n \t\tif (conf_thread_mng.initializer_priv == priv)\n-\t\t\tif (mlx5_vdpa_mult_threads_create(priv->event_core))\n+\t\t\tif (mlx5_vdpa_mult_threads_create())\n \t\t\t\tgoto error;\n \t\t__atomic_fetch_add(&conf_thread_mng.refcnt, 1,\n \t\t\t__ATOMIC_RELAXED);\ndiff --git a/drivers/vdpa/mlx5/mlx5_vdpa.h b/drivers/vdpa/mlx5/mlx5_vdpa.h\nindex dc4dfba5ed..7b37c98e74 100644\n--- a/drivers/vdpa/mlx5/mlx5_vdpa.h\n+++ b/drivers/vdpa/mlx5/mlx5_vdpa.h\n@@ -19,6 +19,7 @@\n #endif\n #include <rte_spinlock.h>\n #include <rte_interrupts.h>\n+#include <rte_thread.h>\n \n #include <mlx5_glue.h>\n #include <mlx5_devx_cmds.h>\n@@ -99,7 +100,7 @@ struct mlx5_vdpa_task {\n \n /* Generic mlx5_vdpa_c_thread information. */\n struct mlx5_vdpa_c_thread {\n-\tpthread_t tid;\n+\trte_thread_t tid;\n \tstruct rte_ring *rng;\n \tpthread_cond_t c_cond;\n };\n@@ -182,7 +183,7 @@ struct mlx5_vdpa_priv {\n \trte_spinlock_t db_lock;\n \tpthread_mutex_t steer_update_lock;\n \tuint64_t no_traffic_counter;\n-\tpthread_t timer_tid;\n+\trte_thread_t timer_tid;\n \tint event_mode;\n \tint event_core; /* Event thread cpu affinity core. */\n \tuint32_t event_us;\n@@ -563,14 +564,11 @@ mlx5_vdpa_is_modify_virtq_supported(struct mlx5_vdpa_priv *priv);\n /**\n  * Create configuration multi-threads resource\n  *\n- * @param[in] cpu_core\n- *   CPU core number to set configuration threads affinity to.\n- *\n  * @return\n  *   0 on success, a negative value otherwise.\n  */\n int\n-mlx5_vdpa_mult_threads_create(int cpu_core);\n+mlx5_vdpa_mult_threads_create(void);\n \n /**\n  * Destroy configuration multi-threads resource\ndiff --git a/drivers/vdpa/mlx5/mlx5_vdpa_cthread.c b/drivers/vdpa/mlx5/mlx5_vdpa_cthread.c\nindex a1d291bf71..1a5fd3eb17 100644\n--- a/drivers/vdpa/mlx5/mlx5_vdpa_cthread.c\n+++ b/drivers/vdpa/mlx5/mlx5_vdpa_cthread.c\n@@ -96,11 +96,10 @@ mlx5_vdpa_c_thread_wait_bulk_tasks_done(uint32_t *remaining_cnt,\n \treturn false;\n }\n \n-static void *\n+static uint32_t\n mlx5_vdpa_c_thread_handle(void *arg)\n {\n \tstruct mlx5_vdpa_conf_thread_mng *multhrd = arg;\n-\tpthread_t thread_id = pthread_self();\n \tstruct mlx5_vdpa_virtq *virtq;\n \tstruct mlx5_vdpa_priv *priv;\n \tstruct mlx5_vdpa_task task;\n@@ -112,10 +111,10 @@ mlx5_vdpa_c_thread_handle(void *arg)\n \n \tfor (thrd_idx = 0; thrd_idx < multhrd->max_thrds;\n \t\tthrd_idx++)\n-\t\tif (multhrd->cthrd[thrd_idx].tid == thread_id)\n+\t\tif (rte_thread_equal(multhrd->cthrd[thrd_idx].tid, rte_thread_self()))\n \t\t\tbreak;\n \tif (thrd_idx >= multhrd->max_thrds)\n-\t\treturn NULL;\n+\t\treturn 1;\n \trng = multhrd->cthrd[thrd_idx].rng;\n \twhile (1) {\n \t\ttask_num = mlx5_vdpa_c_thrd_ring_dequeue_bulk(rng,\n@@ -227,16 +226,17 @@ mlx5_vdpa_c_thread_handle(void *arg)\n \t\t\t__atomic_fetch_sub(task.remaining_cnt,\n \t\t\t1, __ATOMIC_RELAXED);\n \t}\n-\treturn NULL;\n+\treturn 0;\n }\n \n static void\n mlx5_vdpa_c_thread_destroy(uint32_t thrd_idx, bool need_unlock)\n {\n-\tif (conf_thread_mng.cthrd[thrd_idx].tid) {\n-\t\tpthread_cancel(conf_thread_mng.cthrd[thrd_idx].tid);\n-\t\tpthread_join(conf_thread_mng.cthrd[thrd_idx].tid, NULL);\n-\t\tconf_thread_mng.cthrd[thrd_idx].tid = 0;\n+\tpthread_t *tid = (pthread_t *)&conf_thread_mng.cthrd[thrd_idx].tid.opaque_id;\n+\tif (*tid != 0) {\n+\t\tpthread_cancel(*tid);\n+\t\trte_thread_join(conf_thread_mng.cthrd[thrd_idx].tid, NULL);\n+\t\t*tid = 0;\n \t\tif (need_unlock)\n \t\t\tpthread_mutex_init(&conf_thread_mng.cthrd_lock, NULL);\n \t}\n@@ -247,30 +247,14 @@ mlx5_vdpa_c_thread_destroy(uint32_t thrd_idx, bool need_unlock)\n }\n \n static int\n-mlx5_vdpa_c_thread_create(int cpu_core)\n+mlx5_vdpa_c_thread_create(void)\n {\n-\tconst struct sched_param sp = {\n-\t\t.sched_priority = sched_get_priority_max(SCHED_RR),\n-\t};\n-\trte_cpuset_t cpuset;\n-\tpthread_attr_t attr;\n \tuint32_t thrd_idx;\n \tuint32_t ring_num;\n-\tchar name[32];\n+\tchar name[RTE_RING_NAMESIZE];\n \tint ret;\n \n \tpthread_mutex_lock(&conf_thread_mng.cthrd_lock);\n-\tpthread_attr_init(&attr);\n-\tret = pthread_attr_setschedpolicy(&attr, SCHED_RR);\n-\tif (ret) {\n-\t\tDRV_LOG(ERR, \"Failed to set thread sched policy = RR.\");\n-\t\tgoto c_thread_err;\n-\t}\n-\tret = pthread_attr_setschedparam(&attr, &sp);\n-\tif (ret) {\n-\t\tDRV_LOG(ERR, \"Failed to set thread priority.\");\n-\t\tgoto c_thread_err;\n-\t}\n \tring_num = MLX5_VDPA_MAX_TASKS_PER_THRD / conf_thread_mng.max_thrds;\n \tif (!ring_num) {\n \t\tDRV_LOG(ERR, \"Invalid ring number for thread.\");\n@@ -291,35 +275,15 @@ mlx5_vdpa_c_thread_create(int cpu_core)\n \t\t\tthrd_idx);\n \t\t\tgoto c_thread_err;\n \t\t}\n-\t\tret = pthread_create(&conf_thread_mng.cthrd[thrd_idx].tid,\n-\t\t\t\t&attr, mlx5_vdpa_c_thread_handle,\n-\t\t\t\t(void *)&conf_thread_mng);\n+\t\tsnprintf(name, RTE_THREAD_INTERNAL_NAME_SIZE, \"vmlx5-c%d\", thrd_idx);\n+\t\tret = rte_thread_create_internal_control(&conf_thread_mng.cthrd[thrd_idx].tid,\n+\t\t\t\tname,\n+\t\t\t\tmlx5_vdpa_c_thread_handle, &conf_thread_mng);\n \t\tif (ret) {\n \t\t\tDRV_LOG(ERR, \"Failed to create vdpa multi-threads %d.\",\n \t\t\t\t\tthrd_idx);\n \t\t\tgoto c_thread_err;\n \t\t}\n-\t\tCPU_ZERO(&cpuset);\n-\t\tif (cpu_core != -1)\n-\t\t\tCPU_SET(cpu_core, &cpuset);\n-\t\telse\n-\t\t\tcpuset = rte_lcore_cpuset(rte_get_main_lcore());\n-\t\tret = pthread_setaffinity_np(\n-\t\t\t\tconf_thread_mng.cthrd[thrd_idx].tid,\n-\t\t\t\tsizeof(cpuset), &cpuset);\n-\t\tif (ret) {\n-\t\t\tDRV_LOG(ERR, \"Failed to set thread affinity for \"\n-\t\t\t\"vdpa multi-threads %d.\", thrd_idx);\n-\t\t\tgoto c_thread_err;\n-\t\t}\n-\t\tsnprintf(name, sizeof(name), \"dpdk-vmlx5-c%d\", thrd_idx);\n-\t\tret = pthread_setname_np(\n-\t\t\t\tconf_thread_mng.cthrd[thrd_idx].tid, name);\n-\t\tif (ret)\n-\t\t\tDRV_LOG(ERR, \"Failed to set vdpa multi-threads name %s.\",\n-\t\t\t\t\tname);\n-\t\telse\n-\t\t\tDRV_LOG(DEBUG, \"Thread name: %s.\", name);\n \t\tpthread_cond_init(&conf_thread_mng.cthrd[thrd_idx].c_cond,\n \t\t\tNULL);\n \t}\n@@ -334,10 +298,10 @@ mlx5_vdpa_c_thread_create(int cpu_core)\n }\n \n int\n-mlx5_vdpa_mult_threads_create(int cpu_core)\n+mlx5_vdpa_mult_threads_create(void)\n {\n \tpthread_mutex_init(&conf_thread_mng.cthrd_lock, NULL);\n-\tif (mlx5_vdpa_c_thread_create(cpu_core)) {\n+\tif (mlx5_vdpa_c_thread_create()) {\n \t\tDRV_LOG(ERR, \"Cannot create vDPA configuration threads.\");\n \t\tmlx5_vdpa_mult_threads_destroy(false);\n \t\treturn -1;\ndiff --git a/drivers/vdpa/mlx5/mlx5_vdpa_event.c b/drivers/vdpa/mlx5/mlx5_vdpa_event.c\nindex c486ded598..fa26471b18 100644\n--- a/drivers/vdpa/mlx5/mlx5_vdpa_event.c\n+++ b/drivers/vdpa/mlx5/mlx5_vdpa_event.c\n@@ -284,7 +284,7 @@ mlx5_vdpa_event_wait(struct mlx5_vdpa_priv *priv __rte_unused)\n \treturn NULL;\n }\n \n-static void *\n+static uint32_t\n mlx5_vdpa_event_handle(void *arg)\n {\n \tstruct mlx5_vdpa_priv *priv = arg;\n@@ -324,7 +324,7 @@ mlx5_vdpa_event_handle(void *arg)\n \t\t\t}\n \t\t\tmlx5_vdpa_timer_sleep(priv, max);\n \t\t}\n-\t\treturn NULL;\n+\t\treturn 0;\n \tcase MLX5_VDPA_EVENT_MODE_ONLY_INTERRUPT:\n \t\tdo {\n \t\t\tvirtq = mlx5_vdpa_event_wait(priv);\n@@ -336,9 +336,9 @@ mlx5_vdpa_event_handle(void *arg)\n \t\t\t\tpthread_mutex_unlock(&virtq->virtq_lock);\n \t\t\t}\n \t\t} while (1);\n-\t\treturn NULL;\n+\t\treturn 0;\n \tdefault:\n-\t\treturn NULL;\n+\t\treturn 0;\n \t}\n }\n \n@@ -503,54 +503,31 @@ int\n mlx5_vdpa_cqe_event_setup(struct mlx5_vdpa_priv *priv)\n {\n \tint ret;\n-\trte_cpuset_t cpuset;\n-\tpthread_attr_t *attrp = NULL;\n-\tpthread_attr_t attr;\n-\tchar name[16];\n-\tconst struct sched_param sp = {\n-\t\t.sched_priority = sched_get_priority_max(SCHED_RR) - 1,\n-\t};\n+\trte_thread_attr_t attr;\n+\tchar name[RTE_THREAD_INTERNAL_NAME_SIZE];\n \n \tif (!priv->eventc)\n \t\t/* All virtqs are in poll mode. */\n \t\treturn 0;\n-\tret = pthread_attr_init(&attr);\n+\tret = rte_thread_attr_init(&attr);\n \tif (ret != 0) {\n \t\tDRV_LOG(ERR, \"Failed to initialize thread attributes\");\n \t\tgoto out;\n \t}\n-\tattrp = &attr;\n-\tret = pthread_attr_setschedpolicy(attrp, SCHED_RR);\n-\tif (ret) {\n-\t\tDRV_LOG(ERR, \"Failed to set thread sched policy = RR.\");\n-\t\tgoto out;\n-\t}\n-\tret = pthread_attr_setschedparam(attrp, &sp);\n-\tif (ret) {\n-\t\tDRV_LOG(ERR, \"Failed to set thread priority.\");\n-\t\tgoto out;\n-\t}\n-\tret = pthread_create(&priv->timer_tid, attrp, mlx5_vdpa_event_handle,\n-\t\t\t     (void *)priv);\n-\tif (ret) {\n-\t\tDRV_LOG(ERR, \"Failed to create timer thread.\");\n-\t\tgoto out;\n-\t}\n-\tCPU_ZERO(&cpuset);\n+\tattr.priority = RTE_THREAD_PRIORITY_REALTIME_CRITICAL;\n \tif (priv->event_core != -1)\n-\t\tCPU_SET(priv->event_core, &cpuset);\n+\t\tCPU_SET(priv->event_core, &attr.cpuset);\n \telse\n-\t\tcpuset = rte_lcore_cpuset(rte_get_main_lcore());\n-\tret = pthread_setaffinity_np(priv->timer_tid, sizeof(cpuset), &cpuset);\n-\tif (ret) {\n-\t\tDRV_LOG(ERR, \"Failed to set thread affinity.\");\n+\t\tattr.cpuset = rte_lcore_cpuset(rte_get_main_lcore());\n+\tret = rte_thread_create(&priv->timer_tid,\n+\t\t\t&attr, mlx5_vdpa_event_handle, priv);\n+\tif (ret != 0) {\n+\t\tDRV_LOG(ERR, \"Failed to create timer thread.\");\n \t\tgoto out;\n \t}\n-\tsnprintf(name, sizeof(name), \"dpdk-vmlx5-%d\", priv->vid);\n-\trte_thread_set_name((rte_thread_t){(uintptr_t)priv->timer_tid}, name);\n+\tsnprintf(name, sizeof(name), \"vmlx5-%d\", priv->vid);\n+\trte_thread_set_prefixed_name(priv->timer_tid, name);\n out:\n-\tif (attrp != NULL)\n-\t\tpthread_attr_destroy(attrp);\n \tif (ret != 0)\n \t\treturn -1;\n \treturn 0;\n@@ -560,19 +537,18 @@ void\n mlx5_vdpa_cqe_event_unset(struct mlx5_vdpa_priv *priv)\n {\n \tstruct mlx5_vdpa_virtq *virtq;\n-\tvoid *status;\n \tint i;\n \n-\tif (priv->timer_tid) {\n-\t\tpthread_cancel(priv->timer_tid);\n-\t\tpthread_join(priv->timer_tid, &status);\n+\tif (priv->timer_tid.opaque_id != 0) {\n+\t\tpthread_cancel((pthread_t)priv->timer_tid.opaque_id);\n+\t\trte_thread_join(priv->timer_tid, NULL);\n \t\t/* The mutex may stay locked after event thread cancel, initiate it. */\n \t\tfor (i = 0; i < priv->nr_virtqs; i++) {\n \t\t\tvirtq = &priv->virtqs[i];\n \t\t\tpthread_mutex_init(&virtq->virtq_lock, NULL);\n \t\t}\n \t}\n-\tpriv->timer_tid = 0;\n+\tpriv->timer_tid.opaque_id = 0;\n }\n \n void\ndiff --git a/drivers/vdpa/sfc/sfc_vdpa_ops.c b/drivers/vdpa/sfc/sfc_vdpa_ops.c\nindex f63af7d478..00f9a4b04c 100644\n--- a/drivers/vdpa/sfc/sfc_vdpa_ops.c\n+++ b/drivers/vdpa/sfc/sfc_vdpa_ops.c\n@@ -567,7 +567,7 @@ sfc_vdpa_get_protocol_features(struct rte_vdpa_device *vdpa_dev,\n \treturn 0;\n }\n \n-static void *\n+static uint32_t\n sfc_vdpa_notify_ctrl(void *arg)\n {\n \tstruct sfc_vdpa_ops_data *ops_data;\n@@ -575,7 +575,7 @@ sfc_vdpa_notify_ctrl(void *arg)\n \n \tops_data = arg;\n \tif (ops_data == NULL)\n-\t\treturn NULL;\n+\t\treturn 0;\n \n \tsfc_vdpa_adapter_lock(sfc_vdpa_adapter_by_dev_handle(ops_data->dev_handle));\n \n@@ -588,7 +588,7 @@ sfc_vdpa_notify_ctrl(void *arg)\n \n \tsfc_vdpa_adapter_unlock(sfc_vdpa_adapter_by_dev_handle(ops_data->dev_handle));\n \n-\treturn NULL;\n+\treturn 0;\n }\n \n static int\n@@ -603,8 +603,8 @@ sfc_vdpa_setup_notify_ctrl(struct sfc_vdpa_ops_data *ops_data)\n \t * dead lock scenario when multiple VFs are used in single vdpa\n \t * application and multiple VFs are passed to a single VM.\n \t */\n-\tret = pthread_create(&ops_data->notify_tid, NULL,\n-\t\t\t     sfc_vdpa_notify_ctrl, ops_data);\n+\tret = rte_thread_create_internal_control(&ops_data->notify_tid,\n+\t\t\t     \"sfc-vdpa\", sfc_vdpa_notify_ctrl, ops_data);\n \tif (ret != 0) {\n \t\tsfc_vdpa_err(ops_data->dev_handle,\n \t\t\t     \"failed to create notify_ctrl thread: %s\",\n@@ -690,15 +690,14 @@ sfc_vdpa_dev_close(int vid)\n \n \tsfc_vdpa_adapter_lock(sfc_vdpa_adapter_by_dev_handle(ops_data->dev_handle));\n \tif (ops_data->is_notify_thread_started == true) {\n-\t\tvoid *status;\n-\t\tret = pthread_cancel(ops_data->notify_tid);\n+\t\tret = pthread_cancel((pthread_t)ops_data->notify_tid.opaque_id);\n \t\tif (ret != 0) {\n \t\t\tsfc_vdpa_err(ops_data->dev_handle,\n \t\t\t\t     \"failed to cancel notify_ctrl thread: %s\",\n \t\t\t\t     rte_strerror(ret));\n \t\t}\n \n-\t\tret = pthread_join(ops_data->notify_tid, &status);\n+\t\tret = rte_thread_join(ops_data->notify_tid, NULL);\n \t\tif (ret != 0) {\n \t\t\tsfc_vdpa_err(ops_data->dev_handle,\n \t\t\t\t     \"failed to join terminated notify_ctrl thread: %s\",\ndiff --git a/drivers/vdpa/sfc/sfc_vdpa_ops.h b/drivers/vdpa/sfc/sfc_vdpa_ops.h\nindex 5c8e352de3..10ea239434 100644\n--- a/drivers/vdpa/sfc/sfc_vdpa_ops.h\n+++ b/drivers/vdpa/sfc/sfc_vdpa_ops.h\n@@ -6,6 +6,7 @@\n #define _SFC_VDPA_OPS_H\n \n #include <rte_vdpa.h>\n+#include <rte_thread.h>\n \n #define SFC_VDPA_MAX_QUEUE_PAIRS\t\t8\n \n@@ -48,7 +49,7 @@ struct sfc_vdpa_ops_data {\n \tstruct rte_vdpa_device\t\t*vdpa_dev;\n \tenum sfc_vdpa_context\t\tvdpa_context;\n \tenum sfc_vdpa_state\t\tstate;\n-\tpthread_t\t\t\tnotify_tid;\n+\trte_thread_t\t\t\tnotify_tid;\n \tbool\t\t\t\tis_notify_thread_started;\n \n \tuint64_t\t\t\tdev_features;\n",
    "prefixes": [
        "v2",
        "07/11"
    ]
}