get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 89949,
    "url": "https://patches.dpdk.org/api/patches/89949/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1616802771-31578-11-git-send-email-navasile@linux.microsoft.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<1616802771-31578-11-git-send-email-navasile@linux.microsoft.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1616802771-31578-11-git-send-email-navasile@linux.microsoft.com",
    "date": "2021-03-26T23:52:51",
    "name": "[v4,10/10] Enable the new EAL thread API",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "5e7cbb14ae99293bfc5da7008c99e4d88e727923",
    "submitter": {
        "id": 1668,
        "url": "https://patches.dpdk.org/api/people/1668/?format=api",
        "name": "Narcisa Ana Maria Vasile",
        "email": "navasile@linux.microsoft.com"
    },
    "delegate": {
        "id": 24651,
        "url": "https://patches.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1616802771-31578-11-git-send-email-navasile@linux.microsoft.com/mbox/",
    "series": [
        {
            "id": 15917,
            "url": "https://patches.dpdk.org/api/series/15917/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=15917",
            "date": "2021-03-26T23:52:41",
            "name": "eal: Add new API for threading",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/15917/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/89949/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/89949/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 22624A0A02;\n\tSat, 27 Mar 2021 00:54:14 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 96B9C140DDB;\n\tSat, 27 Mar 2021 00:53:24 +0100 (CET)",
            "from linux.microsoft.com (linux.microsoft.com [13.77.154.182])\n by mails.dpdk.org (Postfix) with ESMTP id 2BD60140D17\n for <dev@dpdk.org>; Sat, 27 Mar 2021 00:53:09 +0100 (CET)",
            "by linux.microsoft.com (Postfix, from userid 1059)\n id CB5F420B5689; Fri, 26 Mar 2021 16:53:07 -0700 (PDT)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.11.0 linux.microsoft.com CB5F420B5689",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com;\n s=default; t=1616802787;\n bh=BRvt6OkKpwO+7mkzS8ZnL2rrycNls0dafAw4+s+Z3Sw=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=Ws9rPo5rVStPa48F9OLMVrvquz37cA7x6VmtxpRKH7rO1A5EvAPgbLFQ1MOmEeQh+\n +V5KfAWEf87Qz3EcVr59exGj0b6Wgp8OlrgfI/bDQ4jW7slermlcY+EsUoVEYKjNZg\n iO37m6snUF6GuwKinSgbtkDneV9q3un+NcX9e3Zc=",
        "From": "Narcisa Ana Maria Vasile <navasile@linux.microsoft.com>",
        "To": "dev@dpdk.org, thomas@monjalon.net, dmitry.kozliuk@gmail.com,\n khot@microsoft.com, navasile@microsoft.com, dmitrym@microsoft.com,\n roretzla@microsoft.com, talshn@nvidia.com, ocardona@microsoft.com",
        "Cc": "bruce.richardson@intel.com, david.marchand@redhat.com,\n pallavi.kadam@intel.com",
        "Date": "Fri, 26 Mar 2021 16:52:51 -0700",
        "Message-Id": "<1616802771-31578-11-git-send-email-navasile@linux.microsoft.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1616802771-31578-1-git-send-email-navasile@linux.microsoft.com>",
        "References": "<1616644026-25432-11-git-send-email-navasile@linux.microsoft.com>\n <1616802771-31578-1-git-send-email-navasile@linux.microsoft.com>",
        "Subject": "[dpdk-dev] [PATCH v4 10/10] Enable the new EAL thread API",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Narcisa Vasile <navasile@microsoft.com>\n\nRename pthread_* occurrences with the new rte_thread_* API.\nEnable the new API in the build system.\n\nSigned-off-by: Narcisa Vasile <navasile@microsoft.com>\n---\n app/test/process.h                            |   6 +-\n app/test/test_lcores.c                        |  16 +-\n app/test/test_link_bonding.c                  |  10 +-\n app/test/test_lpm_perf.c                      |  12 +-\n config/meson.build                            |   4 +\n drivers/bus/dpaa/base/qbman/bman_driver.c     |   6 +-\n drivers/bus/dpaa/base/qbman/dpaa_sys.c        |  14 +-\n drivers/bus/dpaa/base/qbman/process.c         |   6 +-\n drivers/bus/fslmc/portal/dpaa2_hw_dpio.c      |   6 +-\n drivers/compress/mlx5/mlx5_compress.c         |  10 +-\n drivers/event/dlb/pf/base/dlb_osdep.h         |   2 +-\n drivers/event/dlb2/pf/base/dlb2_osdep.h       |   2 +-\n drivers/net/af_xdp/rte_eth_af_xdp.c           |  18 +-\n drivers/net/ark/ark_ethdev.c                  |   4 +-\n drivers/net/atlantic/atl_ethdev.c             |   4 +-\n drivers/net/atlantic/atl_types.h              |   5 +-\n .../net/atlantic/hw_atl/hw_atl_utils_fw2x.c   |  24 +--\n drivers/net/axgbe/axgbe_dev.c                 |   8 +-\n drivers/net/axgbe/axgbe_ethdev.c              |   8 +-\n drivers/net/axgbe/axgbe_ethdev.h              |   8 +-\n drivers/net/axgbe/axgbe_i2c.c                 |   4 +-\n drivers/net/axgbe/axgbe_mdio.c                |   8 +-\n drivers/net/axgbe/axgbe_phy_impl.c            |   6 +-\n drivers/net/bnxt/bnxt.h                       |  16 +-\n drivers/net/bnxt/bnxt_cpr.c                   |   4 +-\n drivers/net/bnxt/bnxt_ethdev.c                |  52 ++---\n drivers/net/bnxt/bnxt_irq.c                   |   8 +-\n drivers/net/bnxt/bnxt_reps.c                  |  10 +-\n drivers/net/bnxt/tf_ulp/bnxt_ulp.c            |  34 ++--\n drivers/net/bnxt/tf_ulp/bnxt_ulp.h            |   4 +-\n drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c          |  24 +--\n drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h          |   2 +-\n drivers/net/ena/base/ena_plat_dpdk.h          |   8 +-\n drivers/net/enic/enic.h                       |   2 +-\n drivers/net/hns3/hns3_ethdev.h                |   2 +-\n drivers/net/hns3/hns3_ethdev_vf.c             |   2 +-\n drivers/net/hns3/hns3_mbx.c                   |   2 +-\n drivers/net/ice/ice_dcf_parent.c              |   4 +-\n drivers/net/ipn3ke/ipn3ke_representor.c       |   6 +-\n drivers/net/ixgbe/ixgbe_ethdev.c              |   2 +-\n drivers/net/ixgbe/ixgbe_ethdev.h              |   2 +-\n drivers/net/kni/rte_eth_kni.c                 |   6 +-\n drivers/net/mlx5/linux/mlx5_os.c              |   2 +-\n drivers/net/mlx5/mlx5.c                       |  20 +-\n drivers/net/mlx5/mlx5.h                       |   2 +-\n drivers/net/mlx5/mlx5_txpp.c                  |   8 +-\n drivers/net/mlx5/windows/mlx5_flow_os.c       |  10 +-\n drivers/net/mlx5/windows/mlx5_os.c            |   2 +-\n drivers/net/qede/base/bcm_osal.h              |   8 +-\n drivers/net/vhost/rte_eth_vhost.c             |  22 +--\n .../net/virtio/virtio_user/virtio_user_dev.c  |  30 +--\n .../net/virtio/virtio_user/virtio_user_dev.h  |   2 +-\n drivers/raw/ifpga/ifpga_rawdev.c              |   8 +-\n drivers/vdpa/ifc/ifcvf_vdpa.c                 |  36 ++--\n drivers/vdpa/mlx5/mlx5_vdpa.c                 |  24 +--\n drivers/vdpa/mlx5/mlx5_vdpa.h                 |   6 +-\n drivers/vdpa/mlx5/mlx5_vdpa_event.c           |  67 +++----\n examples/kni/main.c                           |   6 +-\n examples/vhost/main.c                         |   2 +-\n examples/vhost_blk/vhost_blk.c                |  10 +-\n lib/librte_eal/common/eal_common_options.c    |   8 +-\n lib/librte_eal/common/eal_common_proc.c       |  48 ++---\n lib/librte_eal/common/eal_common_thread.c     |  43 ++--\n lib/librte_eal/common/eal_common_trace.c      |   2 +-\n lib/librte_eal/common/eal_private.h           |   2 +-\n lib/librte_eal/common/malloc_mp.c             |  32 +--\n lib/librte_eal/common/meson.build             |   1 +\n lib/librte_eal/freebsd/eal.c                  |  37 +++-\n lib/librte_eal/freebsd/eal_alarm.c            |  12 +-\n lib/librte_eal/freebsd/eal_interrupts.c       |   4 +-\n lib/librte_eal/freebsd/eal_thread.c           |   8 +-\n lib/librte_eal/include/meson.build            |   1 +\n lib/librte_eal/include/rte_lcore.h            |   8 +-\n lib/librte_eal/include/rte_per_lcore.h        |   2 -\n lib/librte_eal/linux/eal.c                    |  42 +++-\n lib/librte_eal/linux/eal_alarm.c              |  10 +-\n lib/librte_eal/linux/eal_interrupts.c         |   4 +-\n lib/librte_eal/linux/eal_thread.c             |   8 +-\n lib/librte_eal/linux/eal_timer.c              |   2 +-\n lib/librte_eal/rte_eal_exports.def            |  20 ++\n lib/librte_eal/unix/meson.build               |   1 -\n lib/librte_eal/unix/rte_thread.c              |  92 ---------\n lib/librte_eal/version.map                    |  21 ++\n lib/librte_eal/windows/eal.c                  |  26 ++-\n lib/librte_eal/windows/eal_interrupts.c       |   6 +-\n lib/librte_eal/windows/eal_thread.c           |  24 +--\n lib/librte_eal/windows/eal_windows.h          |  10 -\n lib/librte_eal/windows/include/meson.build    |   1 +\n lib/librte_eal/windows/include/pthread.h      | 186 ------------------\n lib/librte_eal/windows/include/sched.h        |   2 +-\n lib/librte_eal/windows/meson.build            |   7 +-\n lib/librte_ethdev/rte_ethdev.c                |   4 +-\n lib/librte_ethdev/rte_ethdev_core.h           |   3 +-\n lib/librte_ethdev/rte_flow.c                  |   4 +-\n .../rte_event_eth_rx_adapter.c                |   6 +-\n lib/librte_vhost/fd_man.c                     |  40 ++--\n lib/librte_vhost/fd_man.h                     |   6 +-\n lib/librte_vhost/socket.c                     | 124 ++++++------\n lib/librte_vhost/vhost.c                      |  10 +-\n meson_options.txt                             |   2 +\n 100 files changed, 659 insertions(+), 856 deletions(-)\n delete mode 100644 lib/librte_eal/unix/rte_thread.c\n delete mode 100644 lib/librte_eal/windows/include/pthread.h",
    "diff": "diff --git a/app/test/process.h b/app/test/process.h\nindex 27f1b1c0e..ff284335a 100644\n--- a/app/test/process.h\n+++ b/app/test/process.h\n@@ -47,7 +47,7 @@ process_dup(const char *const argv[], int numargs, const char *env_value)\n \tchar path[32];\n #ifdef RTE_LIB_PDUMP\n #ifdef RTE_NET_RING\n-\tpthread_t thread;\n+\trte_thread_t thread;\n #endif\n #endif\n \n@@ -127,7 +127,7 @@ process_dup(const char *const argv[], int numargs, const char *env_value)\n #ifdef RTE_LIB_PDUMP\n #ifdef RTE_NET_RING\n \tif ((strcmp(env_value, \"run_pdump_server_tests\") == 0))\n-\t\tpthread_create(&thread, NULL, &send_pkts, NULL);\n+\t\trte_thread_create(&thread, NULL, &send_pkts, NULL);\n #endif\n #endif\n \n@@ -137,7 +137,7 @@ process_dup(const char *const argv[], int numargs, const char *env_value)\n #ifdef RTE_NET_RING\n \tif ((strcmp(env_value, \"run_pdump_server_tests\") == 0)) {\n \t\tflag_for_send_pkts = 0;\n-\t\tpthread_join(thread, NULL);\n+\t\trte_thread_join(thread, NULL);\n \t}\n #endif\n #endif\ndiff --git a/app/test/test_lcores.c b/app/test/test_lcores.c\nindex 19a7ab9fc..c507e423e 100644\n--- a/app/test/test_lcores.c\n+++ b/app/test/test_lcores.c\n@@ -14,7 +14,7 @@\n struct thread_context {\n \tenum { INIT, ERROR, DONE } state;\n \tbool lcore_id_any;\n-\tpthread_t id;\n+\trte_thread_t id;\n \tunsigned int *registered_count;\n };\n \n@@ -77,7 +77,7 @@ test_non_eal_lcores(unsigned int eal_threads_count)\n \t\tt->state = INIT;\n \t\tt->registered_count = &registered_count;\n \t\tt->lcore_id_any = false;\n-\t\tif (pthread_create(&t->id, NULL, thread_loop, t) != 0)\n+\t\tif (rte_thread_create(&t->id, NULL, thread_loop, t) != 0)\n \t\t\tbreak;\n \t\tnon_eal_threads_count++;\n \t}\n@@ -96,7 +96,7 @@ test_non_eal_lcores(unsigned int eal_threads_count)\n \tt->state = INIT;\n \tt->registered_count = &registered_count;\n \tt->lcore_id_any = true;\n-\tif (pthread_create(&t->id, NULL, thread_loop, t) == 0) {\n+\tif (rte_thread_create(&t->id, NULL, thread_loop, t) == 0) {\n \t\tnon_eal_threads_count++;\n \t\tprintf(\"non-EAL threads count: %u\\n\", non_eal_threads_count);\n \t\twhile (__atomic_load_n(&registered_count, __ATOMIC_ACQUIRE) !=\n@@ -110,7 +110,7 @@ test_non_eal_lcores(unsigned int eal_threads_count)\n \tret = 0;\n \tfor (i = 0; i < non_eal_threads_count; i++) {\n \t\tt = &thread_contexts[i];\n-\t\tpthread_join(t->id, NULL);\n+\t\trte_thread_join(t->id, NULL);\n \t\tif (t->state != DONE)\n \t\t\tret = -1;\n \t}\n@@ -262,7 +262,7 @@ test_non_eal_lcores_callback(unsigned int eal_threads_count)\n \tt->state = INIT;\n \tt->registered_count = &registered_count;\n \tt->lcore_id_any = false;\n-\tif (pthread_create(&t->id, NULL, thread_loop, t) != 0)\n+\tif (rte_thread_create(&t->id, NULL, thread_loop, t) != 0)\n \t\tgoto cleanup_threads;\n \tnon_eal_threads_count++;\n \twhile (__atomic_load_n(&registered_count, __ATOMIC_ACQUIRE) !=\n@@ -285,7 +285,7 @@ test_non_eal_lcores_callback(unsigned int eal_threads_count)\n \tt->state = INIT;\n \tt->registered_count = &registered_count;\n \tt->lcore_id_any = true;\n-\tif (pthread_create(&t->id, NULL, thread_loop, t) != 0)\n+\tif (rte_thread_create(&t->id, NULL, thread_loop, t) != 0)\n \t\tgoto cleanup_threads;\n \tnon_eal_threads_count++;\n \twhile (__atomic_load_n(&registered_count, __ATOMIC_ACQUIRE) !=\n@@ -309,7 +309,7 @@ test_non_eal_lcores_callback(unsigned int eal_threads_count)\n \tret = 0;\n \tfor (i = 0; i < non_eal_threads_count; i++) {\n \t\tt = &thread_contexts[i];\n-\t\tpthread_join(t->id, NULL);\n+\t\trte_thread_join(t->id, NULL);\n \t\tif (t->state != DONE)\n \t\t\tret = -1;\n \t}\n@@ -330,7 +330,7 @@ test_non_eal_lcores_callback(unsigned int eal_threads_count)\n \t__atomic_store_n(&registered_count, 0, __ATOMIC_RELEASE);\n \tfor (i = 0; i < non_eal_threads_count; i++) {\n \t\tt = &thread_contexts[i];\n-\t\tpthread_join(t->id, NULL);\n+\t\trte_thread_join(t->id, NULL);\n \t}\n error:\n \tif (handle[1] != NULL)\ndiff --git a/app/test/test_link_bonding.c b/app/test/test_link_bonding.c\nindex 8a5c8310a..3d9663f5e 100644\n--- a/app/test/test_link_bonding.c\n+++ b/app/test/test_link_bonding.c\n@@ -203,7 +203,7 @@ configure_ethdev(uint16_t port_id, uint8_t start, uint8_t en_isr)\n static int slaves_initialized;\n static int mac_slaves_initialized;\n \n-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n+static rte_thread_mutex_t mutex = RTE_THREAD_MUTEX_INITIALIZER;\n static pthread_cond_t cvar = PTHREAD_COND_INITIALIZER;\n \n \n@@ -1191,11 +1191,11 @@ test_bonding_lsc_event_callback(uint16_t port_id __rte_unused,\n \t\tvoid *param __rte_unused,\n \t\tvoid *ret_param __rte_unused)\n {\n-\tpthread_mutex_lock(&mutex);\n+\trte_thread_mutex_lock(&mutex);\n \ttest_lsc_interrupt_count++;\n \n \tpthread_cond_signal(&cvar);\n-\tpthread_mutex_unlock(&mutex);\n+\trte_thread_mutex_unlock(&mutex);\n \n \treturn 0;\n }\n@@ -1220,11 +1220,11 @@ lsc_timeout(int wait_us)\n \t\tts.tv_sec += 1;\n \t}\n \n-\tpthread_mutex_lock(&mutex);\n+\trte_thread_mutex_lock(&mutex);\n \tif (test_lsc_interrupt_count < 1)\n \t\tretval = pthread_cond_timedwait(&cvar, &mutex, &ts);\n \n-\tpthread_mutex_unlock(&mutex);\n+\trte_thread_mutex_unlock(&mutex);\n \n \tif (retval == 0 && test_lsc_interrupt_count < 1)\n \t\treturn -1;\ndiff --git a/app/test/test_lpm_perf.c b/app/test/test_lpm_perf.c\nindex 2bed00d06..ce79d9c17 100644\n--- a/app/test/test_lpm_perf.c\n+++ b/app/test/test_lpm_perf.c\n@@ -25,7 +25,7 @@ static volatile uint32_t thr_id;\n static uint64_t gwrite_cycles;\n static uint32_t num_writers;\n /* LPM APIs are not thread safe, use mutex to provide thread safety */\n-static pthread_mutex_t lpm_mutex = PTHREAD_MUTEX_INITIALIZER;\n+static rte_thread_mutex_t lpm_mutex = RTE_THREAD_MUTEX_INITIALIZER;\n \n /* Report quiescent state interval every 1024 lookups. Larger critical\n  * sections in reader will result in writer polling multiple times.\n@@ -443,7 +443,7 @@ test_lpm_rcu_qsbr_writer(void *arg)\n \t\t/* Add all the entries */\n \t\tfor (j = si; j < ei; j++) {\n \t\t\tif (num_writers > 1)\n-\t\t\t\tpthread_mutex_lock(&lpm_mutex);\n+\t\t\t\trte_thread_mutex_lock(&lpm_mutex);\n \t\t\tif (rte_lpm_add(lpm, large_ldepth_route_table[j].ip,\n \t\t\t\t\tlarge_ldepth_route_table[j].depth,\n \t\t\t\t\tnext_hop_add) != 0) {\n@@ -452,13 +452,13 @@ test_lpm_rcu_qsbr_writer(void *arg)\n \t\t\t\tgoto error;\n \t\t\t}\n \t\t\tif (num_writers > 1)\n-\t\t\t\tpthread_mutex_unlock(&lpm_mutex);\n+\t\t\t\trte_thread_mutex_unlock(&lpm_mutex);\n \t\t}\n \n \t\t/* Delete all the entries */\n \t\tfor (j = si; j < ei; j++) {\n \t\t\tif (num_writers > 1)\n-\t\t\t\tpthread_mutex_lock(&lpm_mutex);\n+\t\t\t\trte_thread_mutex_lock(&lpm_mutex);\n \t\t\tif (rte_lpm_delete(lpm, large_ldepth_route_table[j].ip,\n \t\t\t\tlarge_ldepth_route_table[j].depth) != 0) {\n \t\t\t\tprintf(\"Failed to delete iteration %d, route# %d\\n\",\n@@ -466,7 +466,7 @@ test_lpm_rcu_qsbr_writer(void *arg)\n \t\t\t\tgoto error;\n \t\t\t}\n \t\t\tif (num_writers > 1)\n-\t\t\t\tpthread_mutex_unlock(&lpm_mutex);\n+\t\t\t\trte_thread_mutex_unlock(&lpm_mutex);\n \t\t}\n \t}\n \n@@ -478,7 +478,7 @@ test_lpm_rcu_qsbr_writer(void *arg)\n \n error:\n \tif (num_writers > 1)\n-\t\tpthread_mutex_unlock(&lpm_mutex);\n+\t\trte_thread_mutex_unlock(&lpm_mutex);\n \treturn -1;\n }\n \ndiff --git a/config/meson.build b/config/meson.build\nindex 66a2edcc4..8db5bd725 100644\n--- a/config/meson.build\n+++ b/config/meson.build\n@@ -258,6 +258,10 @@ else # for 32-bit we need smaller reserved memory areas\n \tdpdk_conf.set('RTE_MAX_MEM_MB', 2048)\n endif\n \n+if is_windows\n+\tdpdk_conf.set('RTE_USE_WINDOWS_THREAD_TYPES', not get_option('use_external_thread_lib'))\n+endif\n+\n \n compile_time_cpuflags = []\n subdir(arch_subdir)\ndiff --git a/drivers/bus/dpaa/base/qbman/bman_driver.c b/drivers/bus/dpaa/base/qbman/bman_driver.c\nindex ee35e03da..a9e6013ff 100644\n--- a/drivers/bus/dpaa/base/qbman/bman_driver.c\n+++ b/drivers/bus/dpaa/base/qbman/bman_driver.c\n@@ -38,11 +38,11 @@ static int fsl_bman_portal_init(uint32_t idx, int is_shared)\n \tstruct dpaa_ioctl_irq_map irq_map;\n \n \t/* Verify the thread's cpu-affinity */\n-\tret = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t),\n-\t\t\t\t     &cpuset);\n+\tret = rte_thread_get_affinity_by_id(rte_thread_self(),\n+\t\t\t\t\t    sizeof(cpu_set_t), &cpuset);\n \tif (ret) {\n \t\terrno = ret;\n-\t\terr(0, \"pthread_getaffinity_np()\");\n+\t\terr(0, \"rte_thread_get_affinity_by_id()\");\n \t\treturn ret;\n \t}\n \tpcfg.cpu = -1;\ndiff --git a/drivers/bus/dpaa/base/qbman/dpaa_sys.c b/drivers/bus/dpaa/base/qbman/dpaa_sys.c\nindex 9d6bfd40a..dc5f02bec 100644\n--- a/drivers/bus/dpaa/base/qbman/dpaa_sys.c\n+++ b/drivers/bus/dpaa/base/qbman/dpaa_sys.c\n@@ -18,16 +18,16 @@ struct process_interrupt {\n };\n \n static COMPAT_LIST_HEAD(process_irq_list);\n-static pthread_mutex_t process_irq_lock = PTHREAD_MUTEX_INITIALIZER;\n+static rte_thread_mutex_t process_irq_lock = RTE_THREAD_MUTEX_INITIALIZER;\n \n static void process_interrupt_install(struct process_interrupt *irq)\n {\n \tint ret;\n \t/* Add the irq to the end of the list */\n-\tret = pthread_mutex_lock(&process_irq_lock);\n+\tret = rte_thread_mutex_lock(&process_irq_lock);\n \tassert(!ret);\n \tlist_add_tail(&irq->node, &process_irq_list);\n-\tret = pthread_mutex_unlock(&process_irq_lock);\n+\tret = rte_thread_mutex_unlock(&process_irq_lock);\n \tassert(!ret);\n }\n \n@@ -35,10 +35,10 @@ static void process_interrupt_remove(struct process_interrupt *irq)\n {\n \tint ret;\n \n-\tret = pthread_mutex_lock(&process_irq_lock);\n+\tret = rte_thread_mutex_lock(&process_irq_lock);\n \tassert(!ret);\n \tlist_del(&irq->node);\n-\tret = pthread_mutex_unlock(&process_irq_lock);\n+\tret = rte_thread_mutex_unlock(&process_irq_lock);\n \tassert(!ret);\n }\n \n@@ -47,14 +47,14 @@ static struct process_interrupt *process_interrupt_find(int irq_num)\n \tint ret;\n \tstruct process_interrupt *i = NULL;\n \n-\tret = pthread_mutex_lock(&process_irq_lock);\n+\tret = rte_thread_mutex_lock(&process_irq_lock);\n \tassert(!ret);\n \tlist_for_each_entry(i, &process_irq_list, node) {\n \t\tif (i->irq == irq_num)\n \t\t\tgoto done;\n \t}\n done:\n-\tret = pthread_mutex_unlock(&process_irq_lock);\n+\tret = rte_thread_mutex_unlock(&process_irq_lock);\n \tassert(!ret);\n \treturn i;\n }\ndiff --git a/drivers/bus/dpaa/base/qbman/process.c b/drivers/bus/dpaa/base/qbman/process.c\nindex 9bc92681c..6d2d10cdf 100644\n--- a/drivers/bus/dpaa/base/qbman/process.c\n+++ b/drivers/bus/dpaa/base/qbman/process.c\n@@ -21,7 +21,7 @@\n  * what the lock is for.\n  */\n static int fd = -1;\n-static pthread_mutex_t fd_init_lock = PTHREAD_MUTEX_INITIALIZER;\n+static rte_thread_mutex_t fd_init_lock = RTE_THREAD_MUTEX_INITIALIZER;\n \n static int check_fd(void)\n {\n@@ -29,12 +29,12 @@ static int check_fd(void)\n \n \tif (fd >= 0)\n \t\treturn 0;\n-\tret = pthread_mutex_lock(&fd_init_lock);\n+\tret = rte_thread_mutex_lock(&fd_init_lock);\n \tassert(!ret);\n \t/* check again with the lock held */\n \tif (fd < 0)\n \t\tfd = open(PROCESS_PATH, O_RDWR);\n-\tret = pthread_mutex_unlock(&fd_init_lock);\n+\tret = rte_thread_mutex_unlock(&fd_init_lock);\n \tassert(!ret);\n \treturn (fd >= 0) ? 0 : -ENODEV;\n }\ndiff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c\nindex c6f8312a1..c826ad0c1 100644\n--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c\n+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c\n@@ -92,10 +92,10 @@ dpaa2_get_core_id(void)\n \trte_cpuset_t cpuset;\n \tint i, ret, cpu_id = -1;\n \n-\tret = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t),\n-\t\t&cpuset);\n+\tret = rte_thread_get_affinity_by_id(rte_thread_self(),\n+\t\t\t\t\t    sizeof(cpu_set_t), &cpuset);\n \tif (ret) {\n-\t\tDPAA2_BUS_ERR(\"pthread_getaffinity_np() failed\");\n+\t\tDPAA2_BUS_ERR(\"rte_thread_get_affinity_by_id() failed\");\n \t\treturn ret;\n \t}\n \ndiff --git a/drivers/compress/mlx5/mlx5_compress.c b/drivers/compress/mlx5/mlx5_compress.c\nindex ec3c23751..d2bda960f 100644\n--- a/drivers/compress/mlx5/mlx5_compress.c\n+++ b/drivers/compress/mlx5/mlx5_compress.c\n@@ -73,7 +73,7 @@ struct mlx5_compress_qp {\n \n TAILQ_HEAD(mlx5_compress_privs, mlx5_compress_priv) mlx5_compress_priv_list =\n \t\t\t\tTAILQ_HEAD_INITIALIZER(mlx5_compress_priv_list);\n-static pthread_mutex_t priv_list_lock = PTHREAD_MUTEX_INITIALIZER;\n+static rte_thread_mutex_t priv_list_lock = RTE_THREAD_MUTEX_INITIALIZER;\n \n int mlx5_compress_logtype;\n \n@@ -833,9 +833,9 @@ mlx5_compress_pci_probe(struct rte_pci_driver *pci_drv,\n \t}\n \tpriv->mr_scache.reg_mr_cb = mlx5_common_verbs_reg_mr;\n \tpriv->mr_scache.dereg_mr_cb = mlx5_common_verbs_dereg_mr;\n-\tpthread_mutex_lock(&priv_list_lock);\n+\trte_thread_mutex_lock(&priv_list_lock);\n \tTAILQ_INSERT_TAIL(&mlx5_compress_priv_list, priv, next);\n-\tpthread_mutex_unlock(&priv_list_lock);\n+\trte_thread_mutex_unlock(&priv_list_lock);\n \treturn 0;\n }\n \n@@ -855,13 +855,13 @@ mlx5_compress_pci_remove(struct rte_pci_device *pdev)\n {\n \tstruct mlx5_compress_priv *priv = NULL;\n \n-\tpthread_mutex_lock(&priv_list_lock);\n+\trte_thread_mutex_lock(&priv_list_lock);\n \tTAILQ_FOREACH(priv, &mlx5_compress_priv_list, next)\n \t\tif (rte_pci_addr_cmp(&priv->pci_dev->addr, &pdev->addr) != 0)\n \t\t\tbreak;\n \tif (priv)\n \t\tTAILQ_REMOVE(&mlx5_compress_priv_list, priv, next);\n-\tpthread_mutex_unlock(&priv_list_lock);\n+\trte_thread_mutex_unlock(&priv_list_lock);\n \tif (priv) {\n \t\tmlx5_mr_release_cache(&priv->mr_scache);\n \t\tmlx5_compress_hw_global_release(priv);\ndiff --git a/drivers/event/dlb/pf/base/dlb_osdep.h b/drivers/event/dlb/pf/base/dlb_osdep.h\nindex dee20660e..cc22b85d6 100644\n--- a/drivers/event/dlb/pf/base/dlb_osdep.h\n+++ b/drivers/event/dlb/pf/base/dlb_osdep.h\n@@ -208,7 +208,7 @@ static void *dlb_complete_queue_map_unmap(void *__args)\n static inline void os_schedule_work(struct dlb_hw *hw)\n {\n \tstruct dlb_dev *dlb_dev;\n-\tpthread_t complete_queue_map_unmap_thread;\n+\trte_thread_t complete_queue_map_unmap_thread;\n \tint ret;\n \n \tdlb_dev = container_of(hw, struct dlb_dev, hw);\ndiff --git a/drivers/event/dlb2/pf/base/dlb2_osdep.h b/drivers/event/dlb2/pf/base/dlb2_osdep.h\nindex aa101a49a..b002dc774 100644\n--- a/drivers/event/dlb2/pf/base/dlb2_osdep.h\n+++ b/drivers/event/dlb2/pf/base/dlb2_osdep.h\n@@ -192,7 +192,7 @@ 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);\ndiff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c\nindex a64fef1cf..355f98534 100644\n--- a/drivers/net/af_xdp/rte_eth_af_xdp.c\n+++ b/drivers/net/af_xdp/rte_eth_af_xdp.c\n@@ -179,7 +179,7 @@ TAILQ_HEAD(internal_list_head, internal_list);\n static struct internal_list_head internal_list =\n \tTAILQ_HEAD_INITIALIZER(internal_list);\n \n-static pthread_mutex_t internal_list_lock = PTHREAD_MUTEX_INITIALIZER;\n+static rte_thread_mutex_t internal_list_lock = RTE_THREAD_MUTEX_INITIALIZER;\n \n #if defined(XDP_UMEM_UNALIGNED_CHUNK_FLAG)\n static inline int\n@@ -670,7 +670,7 @@ find_internal_resource(struct pmd_internals *port_int)\n \tif (port_int == NULL)\n \t\treturn NULL;\n \n-\tpthread_mutex_lock(&internal_list_lock);\n+\trte_thread_mutex_lock(&internal_list_lock);\n \n \tTAILQ_FOREACH(list, &internal_list, next) {\n \t\tstruct pmd_internals *list_int =\n@@ -681,7 +681,7 @@ find_internal_resource(struct pmd_internals *port_int)\n \t\t}\n \t}\n \n-\tpthread_mutex_unlock(&internal_list_lock);\n+\trte_thread_mutex_unlock(&internal_list_lock);\n \n \tif (!found)\n \t\treturn NULL;\n@@ -719,7 +719,7 @@ get_shared_umem(struct pkt_rx_queue *rxq, const char *ifname,\n \tif (mb_pool == NULL)\n \t\treturn ret;\n \n-\tpthread_mutex_lock(&internal_list_lock);\n+\trte_thread_mutex_lock(&internal_list_lock);\n \n \tTAILQ_FOREACH(list, &internal_list, next) {\n \t\tinternals = list->eth_dev->data->dev_private;\n@@ -745,7 +745,7 @@ get_shared_umem(struct pkt_rx_queue *rxq, const char *ifname,\n \t}\n \n out:\n-\tpthread_mutex_unlock(&internal_list_lock);\n+\trte_thread_mutex_unlock(&internal_list_lock);\n \n \treturn ret;\n }\n@@ -774,9 +774,9 @@ eth_dev_configure(struct rte_eth_dev *dev)\n \t\t\treturn -1;\n \n \t\tlist->eth_dev = dev;\n-\t\tpthread_mutex_lock(&internal_list_lock);\n+\t\trte_thread_mutex_lock(&internal_list_lock);\n \t\tTAILQ_INSERT_TAIL(&internal_list, list, next);\n-\t\tpthread_mutex_unlock(&internal_list_lock);\n+\t\trte_thread_mutex_unlock(&internal_list_lock);\n \t}\n \n \treturn 0;\n@@ -942,9 +942,9 @@ eth_dev_close(struct rte_eth_dev *dev)\n \t\t/* Remove ethdev from list used to track and share UMEMs */\n \t\tlist = find_internal_resource(internals);\n \t\tif (list) {\n-\t\t\tpthread_mutex_lock(&internal_list_lock);\n+\t\t\trte_thread_mutex_lock(&internal_list_lock);\n \t\t\tTAILQ_REMOVE(&internal_list, list, next);\n-\t\t\tpthread_mutex_unlock(&internal_list_lock);\n+\t\t\trte_thread_mutex_unlock(&internal_list_lock);\n \t\t\trte_free(list);\n \t\t}\n \t}\ndiff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c\nindex ef650a465..89d6b2bb4 100644\n--- a/drivers/net/ark/ark_ethdev.c\n+++ b/drivers/net/ark/ark_ethdev.c\n@@ -618,12 +618,12 @@ eth_ark_dev_start(struct rte_eth_dev *dev)\n \t\tark_pktchkr_run(ark->pc);\n \n \tif (ark->start_pg && (dev->data->port_id == 0)) {\n-\t\tpthread_t thread;\n+\t\trte_thread_t thread;\n \n \t\t/* Delay packet generatpr 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\tif (pthread_create(&thread, NULL, delay_pg_start, ark)) {\n+\t\tif (rte_thread_create(&thread, NULL, delay_pg_start, ark)) {\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/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c\nindex 473f6209f..96b7da3ac 100644\n--- a/drivers/net/atlantic/atl_ethdev.c\n+++ b/drivers/net/atlantic/atl_ethdev.c\n@@ -405,7 +405,7 @@ eth_atl_dev_init(struct rte_eth_dev *eth_dev)\n \n \thw->aq_nic_cfg = &adapter->hw_cfg;\n \n-\tpthread_mutex_init(&hw->mbox_mutex, NULL);\n+\trte_thread_mutex_init(&hw->mbox_mutex);\n \n \t/* disable interrupt */\n \tatl_disable_intr(hw);\n@@ -712,7 +712,7 @@ atl_dev_close(struct rte_eth_dev *dev)\n \trte_intr_callback_unregister(intr_handle,\n \t\t\t\t     atl_dev_interrupt_handler, dev);\n \n-\tpthread_mutex_destroy(&hw->mbox_mutex);\n+\trte_thread_mutex_destroy(&hw->mbox_mutex);\n \n \treturn ret;\n }\ndiff --git a/drivers/net/atlantic/atl_types.h b/drivers/net/atlantic/atl_types.h\nindex e813d9f32..93e41aa26 100644\n--- a/drivers/net/atlantic/atl_types.h\n+++ b/drivers/net/atlantic/atl_types.h\n@@ -10,7 +10,8 @@\n #include <string.h>\n #include <stdbool.h>\n #include <netinet/in.h>\n-#include <pthread.h>\n+#include <rte_compat.h>\n+#include <rte_thread.h>\n \n #include <rte_common.h>\n \n@@ -141,7 +142,7 @@ struct aq_hw_s {\n \tu32 rpc_tid;\n \tstruct hw_aq_atl_utils_fw_rpc rpc;\n \n-\tpthread_mutex_t mbox_mutex;\n+\trte_thread_mutex_t mbox_mutex;\n };\n \n struct aq_fw_ops {\ndiff --git a/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c b/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c\nindex 3a7faf405..a6f576dab 100644\n--- a/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c\n+++ b/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c\n@@ -218,7 +218,7 @@ int aq_fw2x_get_mac_permanent(struct aq_hw_s *self, u8 *mac)\n \tu32 mac_addr[2] = { 0 };\n \tu32 efuse_addr = aq_hw_read_reg(self, HW_ATL_FW2X_MPI_EFUSE_ADDR);\n \n-\tpthread_mutex_lock(&self->mbox_mutex);\n+\trte_thread_mutex_lock(&self->mbox_mutex);\n \n \tif (efuse_addr != 0) {\n \t\terr = hw_atl_utils_fw_downld_dwords(self,\n@@ -257,7 +257,7 @@ int aq_fw2x_get_mac_permanent(struct aq_hw_s *self, u8 *mac)\n \t}\n \n exit:\n-\tpthread_mutex_unlock(&self->mbox_mutex);\n+\trte_thread_mutex_unlock(&self->mbox_mutex);\n \n \treturn err;\n }\n@@ -269,7 +269,7 @@ static int aq_fw2x_update_stats(struct aq_hw_s *self)\n \tu32 orig_stats_val = mpi_opts & BIT(CAPS_HI_STATISTICS);\n \n \n-\tpthread_mutex_lock(&self->mbox_mutex);\n+\trte_thread_mutex_lock(&self->mbox_mutex);\n \n \t/* Toggle statistics bit for FW to update */\n \tmpi_opts = mpi_opts ^ BIT(CAPS_HI_STATISTICS);\n@@ -286,7 +286,7 @@ static int aq_fw2x_update_stats(struct aq_hw_s *self)\n \terr = hw_atl_utils_update_stats(self);\n \n exit:\n-\tpthread_mutex_unlock(&self->mbox_mutex);\n+\trte_thread_mutex_unlock(&self->mbox_mutex);\n \n \treturn err;\n \n@@ -299,7 +299,7 @@ static int aq_fw2x_get_temp(struct aq_hw_s *self, int *temp)\n \tu32 temp_val = mpi_opts & BIT(CAPS_HI_TEMPERATURE);\n \tu32 temp_res;\n \n-\tpthread_mutex_lock(&self->mbox_mutex);\n+\trte_thread_mutex_lock(&self->mbox_mutex);\n \n \t/* Toggle statistics bit for FW to 0x36C.18 (CAPS_HI_TEMPERATURE) */\n \tmpi_opts = mpi_opts ^ BIT(CAPS_HI_TEMPERATURE);\n@@ -317,7 +317,7 @@ static int aq_fw2x_get_temp(struct aq_hw_s *self, int *temp)\n \t\t\t\tsizeof(temp_res) / sizeof(u32));\n \n \n-\tpthread_mutex_unlock(&self->mbox_mutex);\n+\trte_thread_mutex_unlock(&self->mbox_mutex);\n \n \tif (err)\n \t\treturn err;\n@@ -536,7 +536,7 @@ static int aq_fw2x_get_eeprom(struct aq_hw_s *self, int dev_addr,\n \tif ((self->caps_lo & BIT(CAPS_LO_SMBUS_READ)) == 0)\n \t\treturn -EOPNOTSUPP;\n \n-\tpthread_mutex_lock(&self->mbox_mutex);\n+\trte_thread_mutex_lock(&self->mbox_mutex);\n \n \trequest.msg_id = 0;\n \trequest.device_id = dev_addr;\n@@ -605,7 +605,7 @@ static int aq_fw2x_get_eeprom(struct aq_hw_s *self, int dev_addr,\n \t}\n \n exit:\n-\tpthread_mutex_unlock(&self->mbox_mutex);\n+\trte_thread_mutex_unlock(&self->mbox_mutex);\n \n \treturn err;\n }\n@@ -626,7 +626,7 @@ static int aq_fw2x_set_eeprom(struct aq_hw_s *self, int dev_addr,\n \trequest.address = offset;\n \trequest.length = len;\n \n-\tpthread_mutex_lock(&self->mbox_mutex);\n+\trte_thread_mutex_lock(&self->mbox_mutex);\n \n \t/* Write SMBUS request to cfg memory */\n \terr = hw_atl_utils_fw_upload_dwords(self, self->rpc_addr,\n@@ -694,7 +694,7 @@ static int aq_fw2x_set_eeprom(struct aq_hw_s *self, int dev_addr,\n \t}\n \n exit:\n-\tpthread_mutex_unlock(&self->mbox_mutex);\n+\trte_thread_mutex_unlock(&self->mbox_mutex);\n \n \treturn err;\n }\n@@ -712,7 +712,7 @@ static int aq_fw2x_send_macsec_request(struct aq_hw_s *self,\n \tif ((self->caps_lo & BIT(CAPS_LO_MACSEC)) == 0)\n \t\treturn -EOPNOTSUPP;\n \n-\tpthread_mutex_lock(&self->mbox_mutex);\n+\trte_thread_mutex_lock(&self->mbox_mutex);\n \n \t/* Write macsec request to cfg memory */\n \terr = hw_atl_utils_fw_upload_dwords(self, self->rpc_addr,\n@@ -742,7 +742,7 @@ static int aq_fw2x_send_macsec_request(struct aq_hw_s *self,\n \t\tRTE_ALIGN(sizeof(*response) / sizeof(u32), sizeof(u32)));\n \n exit:\n-\tpthread_mutex_unlock(&self->mbox_mutex);\n+\trte_thread_mutex_unlock(&self->mbox_mutex);\n \n \treturn err;\n }\ndiff --git a/drivers/net/axgbe/axgbe_dev.c b/drivers/net/axgbe/axgbe_dev.c\nindex 786288a7b..197c72290 100644\n--- a/drivers/net/axgbe/axgbe_dev.c\n+++ b/drivers/net/axgbe/axgbe_dev.c\n@@ -167,12 +167,12 @@ static int axgbe_read_mmd_regs_v2(struct axgbe_port *pdata,\n \tindex = mmd_address & ~pdata->xpcs_window_mask;\n \toffset = pdata->xpcs_window + (mmd_address & pdata->xpcs_window_mask);\n \n-\tpthread_mutex_lock(&pdata->xpcs_mutex);\n+\trte_thread_mutex_lock(&pdata->xpcs_mutex);\n \n \tXPCS32_IOWRITE(pdata, pdata->xpcs_window_sel_reg, index);\n \tmmd_data = XPCS16_IOREAD(pdata, offset);\n \n-\tpthread_mutex_unlock(&pdata->xpcs_mutex);\n+\trte_thread_mutex_unlock(&pdata->xpcs_mutex);\n \n \treturn mmd_data;\n }\n@@ -201,12 +201,12 @@ static void axgbe_write_mmd_regs_v2(struct axgbe_port *pdata,\n \tindex = mmd_address & ~pdata->xpcs_window_mask;\n \toffset = pdata->xpcs_window + (mmd_address & pdata->xpcs_window_mask);\n \n-\tpthread_mutex_lock(&pdata->xpcs_mutex);\n+\trte_thread_mutex_lock(&pdata->xpcs_mutex);\n \n \tXPCS32_IOWRITE(pdata, pdata->xpcs_window_sel_reg, index);\n \tXPCS16_IOWRITE(pdata, offset, mmd_data);\n \n-\tpthread_mutex_unlock(&pdata->xpcs_mutex);\n+\trte_thread_mutex_unlock(&pdata->xpcs_mutex);\n }\n \n static int axgbe_read_mmd_regs(struct axgbe_port *pdata, int prtad,\ndiff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c\nindex ebe9a2876..e6f252e09 100644\n--- a/drivers/net/axgbe/axgbe_ethdev.c\n+++ b/drivers/net/axgbe/axgbe_ethdev.c\n@@ -2311,10 +2311,10 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)\n \n \tpdata->tx_desc_count = AXGBE_MAX_RING_DESC;\n \tpdata->rx_desc_count = AXGBE_MAX_RING_DESC;\n-\tpthread_mutex_init(&pdata->xpcs_mutex, NULL);\n-\tpthread_mutex_init(&pdata->i2c_mutex, NULL);\n-\tpthread_mutex_init(&pdata->an_mutex, NULL);\n-\tpthread_mutex_init(&pdata->phy_mutex, NULL);\n+\trte_thread_mutex_init(&pdata->xpcs_mutex);\n+\trte_thread_mutex_init(&pdata->i2c_mutex);\n+\trte_thread_mutex_init(&pdata->an_mutex);\n+\trte_thread_mutex_init(&pdata->phy_mutex);\n \n \tret = pdata->phy_if.phy_init(pdata);\n \tif (ret) {\ndiff --git a/drivers/net/axgbe/axgbe_ethdev.h b/drivers/net/axgbe/axgbe_ethdev.h\nindex a6226729f..cfd436fa6 100644\n--- a/drivers/net/axgbe/axgbe_ethdev.h\n+++ b/drivers/net/axgbe/axgbe_ethdev.h\n@@ -602,10 +602,10 @@ struct axgbe_port {\n \tint phy_link;\n \tint phy_speed;\n \n-\tpthread_mutex_t xpcs_mutex;\n-\tpthread_mutex_t i2c_mutex;\n-\tpthread_mutex_t an_mutex;\n-\tpthread_mutex_t phy_mutex;\n+\trte_thread_mutex_t xpcs_mutex;\n+\trte_thread_mutex_t i2c_mutex;\n+\trte_thread_mutex_t an_mutex;\n+\trte_thread_mutex_t phy_mutex;\n \n \t/* Flow control settings */\n \tunsigned int pause_autoneg;\ndiff --git a/drivers/net/axgbe/axgbe_i2c.c b/drivers/net/axgbe/axgbe_i2c.c\nindex ab3738a12..c17f9a8b9 100644\n--- a/drivers/net/axgbe/axgbe_i2c.c\n+++ b/drivers/net/axgbe/axgbe_i2c.c\n@@ -229,7 +229,7 @@ static int axgbe_i2c_xfer(struct axgbe_port *pdata, struct axgbe_i2c_op *op)\n \tint ret;\n \tuint64_t timeout;\n \n-\tpthread_mutex_lock(&pdata->i2c_mutex);\n+\trte_thread_mutex_lock(&pdata->i2c_mutex);\n \tret = axgbe_i2c_disable(pdata);\n \tif (ret) {\n \t\tPMD_DRV_LOG(ERR, \"failed to disable i2c master\\n\");\n@@ -282,7 +282,7 @@ static int axgbe_i2c_xfer(struct axgbe_port *pdata, struct axgbe_i2c_op *op)\n \t}\n \n unlock:\n-\tpthread_mutex_unlock(&pdata->i2c_mutex);\n+\trte_thread_mutex_unlock(&pdata->i2c_mutex);\n \treturn ret;\n }\n \ndiff --git a/drivers/net/axgbe/axgbe_mdio.c b/drivers/net/axgbe/axgbe_mdio.c\nindex 4f98e695a..5f3d9b360 100644\n--- a/drivers/net/axgbe/axgbe_mdio.c\n+++ b/drivers/net/axgbe/axgbe_mdio.c\n@@ -686,9 +686,9 @@ static void axgbe_an73_isr(struct axgbe_port *pdata)\n \tif (pdata->an_int) {\n \t\t/* Clear the interrupt(s) that fired and process them */\n \t\tXMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_AN_INT, ~pdata->an_int);\n-\t\tpthread_mutex_lock(&pdata->an_mutex);\n+\t\trte_thread_mutex_lock(&pdata->an_mutex);\n \t\taxgbe_an73_state_machine(pdata);\n-\t\tpthread_mutex_unlock(&pdata->an_mutex);\n+\t\trte_thread_mutex_unlock(&pdata->an_mutex);\n \t} else {\n \t\t/* Enable AN interrupts */\n \t\taxgbe_an73_enable_interrupts(pdata);\n@@ -977,7 +977,7 @@ static int axgbe_phy_config_aneg(struct axgbe_port *pdata)\n {\n \tint ret;\n \n-\tpthread_mutex_lock(&pdata->an_mutex);\n+\trte_thread_mutex_lock(&pdata->an_mutex);\n \n \tret = __axgbe_phy_config_aneg(pdata);\n \tif (ret)\n@@ -985,7 +985,7 @@ static int axgbe_phy_config_aneg(struct axgbe_port *pdata)\n \telse\n \t\trte_bit_relaxed_clear32(AXGBE_LINK_ERR, &pdata->dev_state);\n \n-\tpthread_mutex_unlock(&pdata->an_mutex);\n+\trte_thread_mutex_unlock(&pdata->an_mutex);\n \n \treturn ret;\n }\ndiff --git a/drivers/net/axgbe/axgbe_phy_impl.c b/drivers/net/axgbe/axgbe_phy_impl.c\nindex 02236ec19..1e1d6358d 100644\n--- a/drivers/net/axgbe/axgbe_phy_impl.c\n+++ b/drivers/net/axgbe/axgbe_phy_impl.c\n@@ -403,7 +403,7 @@ static void axgbe_phy_put_comm_ownership(struct axgbe_port *pdata)\n \n \tphy_data->comm_owned = 0;\n \n-\tpthread_mutex_unlock(&pdata->phy_mutex);\n+\trte_thread_mutex_unlock(&pdata->phy_mutex);\n }\n \n static int axgbe_phy_get_comm_ownership(struct axgbe_port *pdata)\n@@ -416,7 +416,7 @@ static int axgbe_phy_get_comm_ownership(struct axgbe_port *pdata)\n \t * the driver needs to take the software mutex and then the hardware\n \t * mutexes before being able to use the busses.\n \t */\n-\tpthread_mutex_lock(&pdata->phy_mutex);\n+\trte_thread_mutex_lock(&pdata->phy_mutex);\n \n \tif (phy_data->comm_owned)\n \t\treturn 0;\n@@ -447,7 +447,7 @@ static int axgbe_phy_get_comm_ownership(struct axgbe_port *pdata)\n \t\treturn 0;\n \t}\n \n-\tpthread_mutex_unlock(&pdata->phy_mutex);\n+\trte_thread_mutex_unlock(&pdata->phy_mutex);\n \n \tPMD_DRV_LOG(ERR, \"unable to obtain hardware mutexes\\n\");\n \ndiff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h\nindex de1b4af91..ef9be3847 100644\n--- a/drivers/net/bnxt/bnxt.h\n+++ b/drivers/net/bnxt/bnxt.h\n@@ -533,8 +533,8 @@ struct bnxt_mark_info {\n \n struct bnxt_rep_info {\n \tstruct rte_eth_dev\t*vfr_eth_dev;\n-\tpthread_mutex_t\t\tvfr_lock;\n-\tpthread_mutex_t\t\tvfr_start_lock;\n+\trte_thread_mutex_t\t\tvfr_lock;\n+\trte_thread_mutex_t\t\tvfr_start_lock;\n \tbool\t\t\tconduit_valid;\n };\n \n@@ -693,7 +693,7 @@ struct bnxt {\n #define BNXT_FW_CAP_ADV_FLOW_COUNTERS\tBIT(6)\n #define BNXT_FW_CAP_LINK_ADMIN\t\tBIT(7)\n \n-\tpthread_mutex_t         flow_lock;\n+\trte_thread_mutex_t         flow_lock;\n \n \tuint32_t\t\tvnic_cap_flags;\n #define BNXT_VNIC_CAP_COS_CLASSIFY\tBIT(0)\n@@ -747,18 +747,18 @@ struct bnxt {\n \trte_iova_t\t\t\thwrm_short_cmd_req_dma_addr;\n \trte_spinlock_t\t\t\thwrm_lock;\n \t/* synchronize between dev_configure_op and int handler */\n-\tpthread_mutex_t\t\t\tdef_cp_lock;\n+\trte_thread_mutex_t\t\t\tdef_cp_lock;\n \t/* synchronize between dev_start_op and async evt handler\n \t * Locking sequence in async evt handler will be\n \t * def_cp_lock\n \t * health_check_lock\n \t */\n-\tpthread_mutex_t\t\t\thealth_check_lock;\n+\trte_thread_mutex_t\t\t\thealth_check_lock;\n \t/* synchronize between dev_stop/dev_close_op and\n \t * error recovery thread triggered as part of\n \t * HWRM_ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY\n \t */\n-\tpthread_mutex_t\t\t\terr_recovery_lock;\n+\trte_thread_mutex_t\t\t\terr_recovery_lock;\n \tuint16_t\t\t\tmax_req_len;\n \tuint16_t\t\t\tmax_resp_len;\n \tuint16_t                        hwrm_max_ext_req_len;\n@@ -944,10 +944,10 @@ uint16_t bnxt_dummy_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,\n extern const struct rte_flow_ops bnxt_flow_ops;\n \n #define bnxt_acquire_flow_lock(bp) \\\n-\tpthread_mutex_lock(&(bp)->flow_lock)\n+\trte_thread_mutex_lock(&(bp)->flow_lock)\n \n #define bnxt_release_flow_lock(bp) \\\n-\tpthread_mutex_unlock(&(bp)->flow_lock)\n+\trte_thread_mutex_unlock(&(bp)->flow_lock)\n \n #define BNXT_VALID_VNIC_OR_RET(bp, vnic_id) do { \\\n \tif ((vnic_id) >= (bp)->max_vnics) { \\\ndiff --git a/drivers/net/bnxt/bnxt_cpr.c b/drivers/net/bnxt/bnxt_cpr.c\nindex 2c7fd78c3..a50511047 100644\n--- a/drivers/net/bnxt/bnxt_cpr.c\n+++ b/drivers/net/bnxt/bnxt_cpr.c\n@@ -135,7 +135,7 @@ void bnxt_handle_async_event(struct bnxt *bp,\n \t\t\treturn;\n \t\t}\n \n-\t\tpthread_mutex_lock(&bp->err_recovery_lock);\n+\t\trte_thread_mutex_lock(&bp->err_recovery_lock);\n \t\tevent_data = rte_le_to_cpu_32(async_cmp->event_data1);\n \t\t/* timestamp_lo/hi values are in units of 100ms */\n \t\tbp->fw_reset_max_msecs = async_cmp->timestamp_hi ?\n@@ -157,7 +157,7 @@ void bnxt_handle_async_event(struct bnxt *bp,\n \t\t}\n \n \t\tbp->flags |= BNXT_FLAG_FW_RESET;\n-\t\tpthread_mutex_unlock(&bp->err_recovery_lock);\n+\t\trte_thread_mutex_unlock(&bp->err_recovery_lock);\n \t\trte_eal_alarm_set(US_PER_MS, bnxt_dev_reset_and_resume,\n \t\t\t\t  (void *)bp);\n \t\tbreak;\ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex f1dd40591..340608b60 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -1043,7 +1043,7 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)\n \t\t * are calculated correctly.\n \t\t */\n \n-\t\tpthread_mutex_lock(&bp->def_cp_lock);\n+\t\trte_thread_mutex_lock(&bp->def_cp_lock);\n \n \t\tif (!BNXT_HAS_NQ(bp) && bp->async_cp_ring) {\n \t\t\tbnxt_disable_int(bp);\n@@ -1053,20 +1053,20 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)\n \t\trc = bnxt_hwrm_func_reserve_vf_resc(bp, false);\n \t\tif (rc) {\n \t\t\tPMD_DRV_LOG(ERR, \"HWRM resource alloc fail:%x\\n\", rc);\n-\t\t\tpthread_mutex_unlock(&bp->def_cp_lock);\n+\t\t\trte_thread_mutex_unlock(&bp->def_cp_lock);\n \t\t\treturn -ENOSPC;\n \t\t}\n \n \t\tif (!BNXT_HAS_NQ(bp) && bp->async_cp_ring) {\n \t\t\trc = bnxt_alloc_async_cp_ring(bp);\n \t\t\tif (rc) {\n-\t\t\t\tpthread_mutex_unlock(&bp->def_cp_lock);\n+\t\t\t\trte_thread_mutex_unlock(&bp->def_cp_lock);\n \t\t\t\treturn rc;\n \t\t\t}\n \t\t\tbnxt_enable_int(bp);\n \t\t}\n \n-\t\tpthread_mutex_unlock(&bp->def_cp_lock);\n+\t\trte_thread_mutex_unlock(&bp->def_cp_lock);\n \t}\n \n \t/* Inherit new configurations */\n@@ -1443,14 +1443,14 @@ static int bnxt_dev_stop_op(struct rte_eth_dev *eth_dev)\n {\n \tstruct bnxt *bp = eth_dev->data->dev_private;\n \n-\tpthread_mutex_lock(&bp->err_recovery_lock);\n+\trte_thread_mutex_lock(&bp->err_recovery_lock);\n \tif (bp->flags & BNXT_FLAG_FW_RESET) {\n \t\tPMD_DRV_LOG(ERR,\n \t\t\t    \"Adapter recovering from error..Please retry\\n\");\n-\t\tpthread_mutex_unlock(&bp->err_recovery_lock);\n+\t\trte_thread_mutex_unlock(&bp->err_recovery_lock);\n \t\treturn -EAGAIN;\n \t}\n-\tpthread_mutex_unlock(&bp->err_recovery_lock);\n+\trte_thread_mutex_unlock(&bp->err_recovery_lock);\n \n \treturn bnxt_dev_stop(eth_dev);\n }\n@@ -1532,13 +1532,13 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)\n static void\n bnxt_uninit_locks(struct bnxt *bp)\n {\n-\tpthread_mutex_destroy(&bp->flow_lock);\n-\tpthread_mutex_destroy(&bp->def_cp_lock);\n-\tpthread_mutex_destroy(&bp->health_check_lock);\n-\tpthread_mutex_destroy(&bp->err_recovery_lock);\n+\trte_thread_mutex_destroy(&bp->flow_lock);\n+\trte_thread_mutex_destroy(&bp->def_cp_lock);\n+\trte_thread_mutex_destroy(&bp->health_check_lock);\n+\trte_thread_mutex_destroy(&bp->err_recovery_lock);\n \tif (bp->rep_info) {\n-\t\tpthread_mutex_destroy(&bp->rep_info->vfr_lock);\n-\t\tpthread_mutex_destroy(&bp->rep_info->vfr_start_lock);\n+\t\trte_thread_mutex_destroy(&bp->rep_info->vfr_lock);\n+\t\trte_thread_mutex_destroy(&bp->rep_info->vfr_start_lock);\n \t}\n }\n \n@@ -1571,14 +1571,14 @@ static int bnxt_dev_close_op(struct rte_eth_dev *eth_dev)\n \tif (rte_eal_process_type() != RTE_PROC_PRIMARY)\n \t\treturn 0;\n \n-\tpthread_mutex_lock(&bp->err_recovery_lock);\n+\trte_thread_mutex_lock(&bp->err_recovery_lock);\n \tif (bp->flags & BNXT_FLAG_FW_RESET) {\n \t\tPMD_DRV_LOG(ERR,\n \t\t\t    \"Adapter recovering from error...Please retry\\n\");\n-\t\tpthread_mutex_unlock(&bp->err_recovery_lock);\n+\t\trte_thread_mutex_unlock(&bp->err_recovery_lock);\n \t\treturn -EAGAIN;\n \t}\n-\tpthread_mutex_unlock(&bp->err_recovery_lock);\n+\trte_thread_mutex_unlock(&bp->err_recovery_lock);\n \n \t/* cancel the recovery handler before remove dev */\n \trte_eal_alarm_cancel(bnxt_dev_reset_and_resume, (void *)bp);\n@@ -4066,7 +4066,7 @@ static void bnxt_dev_recover(void *arg)\n \t\tgoto err_start;\n \n \tPMD_DRV_LOG(INFO, \"Recovered from FW reset\\n\");\n-\tpthread_mutex_unlock(&bp->err_recovery_lock);\n+\trte_thread_mutex_unlock(&bp->err_recovery_lock);\n \n \treturn;\n err_start:\n@@ -4074,7 +4074,7 @@ static void bnxt_dev_recover(void *arg)\n err:\n \tbp->flags |= BNXT_FLAG_FATAL_ERROR;\n \tbnxt_uninit_resources(bp, false);\n-\tpthread_mutex_unlock(&bp->err_recovery_lock);\n+\trte_thread_mutex_unlock(&bp->err_recovery_lock);\n \tPMD_DRV_LOG(ERR, \"Failed to recover from FW reset\\n\");\n }\n \n@@ -4244,7 +4244,7 @@ void bnxt_schedule_fw_health_check(struct bnxt *bp)\n {\n \tuint32_t polling_freq;\n \n-\tpthread_mutex_lock(&bp->health_check_lock);\n+\trte_thread_mutex_lock(&bp->health_check_lock);\n \n \tif (!bnxt_is_recovery_enabled(bp))\n \t\tgoto done;\n@@ -4259,7 +4259,7 @@ void bnxt_schedule_fw_health_check(struct bnxt *bp)\n \tbp->flags |= BNXT_FLAG_FW_HEALTH_CHECK_SCHEDULED;\n \n done:\n-\tpthread_mutex_unlock(&bp->health_check_lock);\n+\trte_thread_mutex_unlock(&bp->health_check_lock);\n }\n \n static void bnxt_cancel_fw_health_check(struct bnxt *bp)\n@@ -5048,25 +5048,25 @@ bnxt_init_locks(struct bnxt *bp)\n {\n \tint err;\n \n-\terr = pthread_mutex_init(&bp->flow_lock, NULL);\n+\terr = rte_thread_mutex_init(&bp->flow_lock);\n \tif (err) {\n \t\tPMD_DRV_LOG(ERR, \"Unable to initialize flow_lock\\n\");\n \t\treturn err;\n \t}\n \n-\terr = pthread_mutex_init(&bp->def_cp_lock, NULL);\n+\terr = rte_thread_mutex_init(&bp->def_cp_lock);\n \tif (err) {\n \t\tPMD_DRV_LOG(ERR, \"Unable to initialize def_cp_lock\\n\");\n \t\treturn err;\n \t}\n \n-\terr = pthread_mutex_init(&bp->health_check_lock, NULL);\n+\terr = rte_thread_mutex_init(&bp->health_check_lock);\n \tif (err) {\n \t\tPMD_DRV_LOG(ERR, \"Unable to initialize health_check_lock\\n\");\n \t\treturn err;\n \t}\n \n-\terr = pthread_mutex_init(&bp->err_recovery_lock, NULL);\n+\terr = rte_thread_mutex_init(&bp->err_recovery_lock);\n \tif (err)\n \t\tPMD_DRV_LOG(ERR, \"Unable to initialize err_recovery_lock\\n\");\n \n@@ -5833,14 +5833,14 @@ static int bnxt_init_rep_info(struct bnxt *bp)\n \tfor (i = 0; i < BNXT_MAX_CFA_CODE; i++)\n \t\tbp->cfa_code_map[i] = BNXT_VF_IDX_INVALID;\n \n-\trc = pthread_mutex_init(&bp->rep_info->vfr_lock, NULL);\n+\trc = rte_thread_mutex_init(&bp->rep_info->vfr_lock);\n \tif (rc) {\n \t\tPMD_DRV_LOG(ERR, \"Unable to initialize vfr_lock\\n\");\n \t\tbnxt_free_rep_info(bp);\n \t\treturn rc;\n \t}\n \n-\trc = pthread_mutex_init(&bp->rep_info->vfr_start_lock, NULL);\n+\trc = rte_thread_mutex_init(&bp->rep_info->vfr_start_lock);\n \tif (rc) {\n \t\tPMD_DRV_LOG(ERR, \"Unable to initialize vfr_start_lock\\n\");\n \t\tbnxt_free_rep_info(bp);\ndiff --git a/drivers/net/bnxt/bnxt_irq.c b/drivers/net/bnxt/bnxt_irq.c\nindex 8abbadb3d..e1d980cf9 100644\n--- a/drivers/net/bnxt/bnxt_irq.c\n+++ b/drivers/net/bnxt/bnxt_irq.c\n@@ -30,15 +30,15 @@ void bnxt_int_handler(void *param)\n \t\treturn;\n \n \traw_cons = cpr->cp_raw_cons;\n-\tpthread_mutex_lock(&bp->def_cp_lock);\n+\trte_thread_mutex_lock(&bp->def_cp_lock);\n \twhile (1) {\n \t\tif (!cpr || !cpr->cp_ring_struct || !cpr->cp_db.doorbell) {\n-\t\t\tpthread_mutex_unlock(&bp->def_cp_lock);\n+\t\t\trte_thread_mutex_unlock(&bp->def_cp_lock);\n \t\t\treturn;\n \t\t}\n \n \t\tif (is_bnxt_in_error(bp)) {\n-\t\t\tpthread_mutex_unlock(&bp->def_cp_lock);\n+\t\t\trte_thread_mutex_unlock(&bp->def_cp_lock);\n \t\t\treturn;\n \t\t}\n \n@@ -58,7 +58,7 @@ void bnxt_int_handler(void *param)\n \telse\n \t\tB_CP_DB_REARM(cpr, cpr->cp_raw_cons);\n \n-\tpthread_mutex_unlock(&bp->def_cp_lock);\n+\trte_thread_mutex_unlock(&bp->def_cp_lock);\n }\n \n int bnxt_free_int(struct bnxt *bp)\ndiff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c\nindex d94874578..472e6fead 100644\n--- a/drivers/net/bnxt/bnxt_reps.c\n+++ b/drivers/net/bnxt/bnxt_reps.c\n@@ -120,7 +120,7 @@ bnxt_rep_tx_burst(void *tx_queue,\n \tqid = vfr_txq->txq->queue_id;\n \tvf_rep_bp = vfr_txq->bp;\n \tparent = vf_rep_bp->parent_dev->data->dev_private;\n-\tpthread_mutex_lock(&parent->rep_info->vfr_lock);\n+\trte_thread_mutex_lock(&parent->rep_info->vfr_lock);\n \tptxq = parent->tx_queues[qid];\n \n \tptxq->vfr_tx_cfa_action = vf_rep_bp->vfr_tx_cfa_action;\n@@ -132,7 +132,7 @@ bnxt_rep_tx_burst(void *tx_queue,\n \n \trc = bnxt_xmit_pkts(ptxq, tx_pkts, nb_pkts);\n \tptxq->vfr_tx_cfa_action = 0;\n-\tpthread_mutex_unlock(&parent->rep_info->vfr_lock);\n+\trte_thread_mutex_unlock(&parent->rep_info->vfr_lock);\n \n \treturn rc;\n }\n@@ -407,15 +407,15 @@ int bnxt_rep_dev_start_op(struct rte_eth_dev *eth_dev)\n \trep_info = &parent_bp->rep_info[rep_bp->vf_id];\n \n \tBNXT_TF_DBG(DEBUG, \"BNXT Port:%d VFR start\\n\", eth_dev->data->port_id);\n-\tpthread_mutex_lock(&rep_info->vfr_start_lock);\n+\trte_thread_mutex_lock(&rep_info->vfr_start_lock);\n \tif (!rep_info->conduit_valid) {\n \t\trc = bnxt_get_dflt_vnic_svif(parent_bp, rep_bp);\n \t\tif (rc || !rep_info->conduit_valid) {\n-\t\t\tpthread_mutex_unlock(&rep_info->vfr_start_lock);\n+\t\t\trte_thread_mutex_unlock(&rep_info->vfr_start_lock);\n \t\t\treturn rc;\n \t\t}\n \t}\n-\tpthread_mutex_unlock(&rep_info->vfr_start_lock);\n+\trte_thread_mutex_unlock(&rep_info->vfr_start_lock);\n \n \trc = bnxt_vfr_alloc(eth_dev);\n \tif (rc) {\ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\nindex 5c805eef9..455d83bef 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\n@@ -28,7 +28,7 @@ STAILQ_HEAD(, bnxt_ulp_session_state) bnxt_ulp_session_list =\n \t\t\tSTAILQ_HEAD_INITIALIZER(bnxt_ulp_session_list);\n \n /* Mutex to synchronize bnxt_ulp_session_list operations. */\n-static pthread_mutex_t bnxt_ulp_global_mutex = PTHREAD_MUTEX_INITIALIZER;\n+static rte_thread_mutex_t bnxt_ulp_global_mutex = RTE_THREAD_MUTEX_INITIALIZER;\n \n /*\n  * Allow the deletion of context only for the bnxt device that\n@@ -640,7 +640,7 @@ ulp_ctx_detach(struct bnxt *bp)\n static void\n ulp_context_initialized(struct bnxt_ulp_session_state *session, bool *init)\n {\n-\tpthread_mutex_lock(&session->bnxt_ulp_mutex);\n+\trte_thread_mutex_lock(&session->bnxt_ulp_mutex);\n \n \tif (!session->bnxt_ulp_init) {\n \t\tsession->bnxt_ulp_init = true;\n@@ -649,7 +649,7 @@ ulp_context_initialized(struct bnxt_ulp_session_state *session, bool *init)\n \t\t*init = true;\n \t}\n \n-\tpthread_mutex_unlock(&session->bnxt_ulp_mutex);\n+\trte_thread_mutex_unlock(&session->bnxt_ulp_mutex);\n }\n \n /*\n@@ -690,7 +690,7 @@ ulp_session_init(struct bnxt *bp,\n \tpci_dev = RTE_DEV_TO_PCI(bp->eth_dev->device);\n \tpci_addr = &pci_dev->addr;\n \n-\tpthread_mutex_lock(&bnxt_ulp_global_mutex);\n+\trte_thread_mutex_lock(&bnxt_ulp_global_mutex);\n \n \tsession = ulp_get_session(pci_addr);\n \tif (!session) {\n@@ -701,17 +701,17 @@ ulp_session_init(struct bnxt *bp,\n \t\tif (!session) {\n \t\t\tBNXT_TF_DBG(ERR,\n \t\t\t\t    \"Allocation failed for bnxt_ulp_session\\n\");\n-\t\t\tpthread_mutex_unlock(&bnxt_ulp_global_mutex);\n+\t\t\trte_thread_mutex_unlock(&bnxt_ulp_global_mutex);\n \t\t\treturn NULL;\n \n \t\t} else {\n \t\t\t/* Add it to the queue */\n \t\t\tsession->pci_info.domain = pci_addr->domain;\n \t\t\tsession->pci_info.bus = pci_addr->bus;\n-\t\t\trc = pthread_mutex_init(&session->bnxt_ulp_mutex, NULL);\n+\t\t\trc = rte_thread_mutex_init(&session->bnxt_ulp_mutex);\n \t\t\tif (rc) {\n \t\t\t\tBNXT_TF_DBG(ERR, \"mutex create failed\\n\");\n-\t\t\t\tpthread_mutex_unlock(&bnxt_ulp_global_mutex);\n+\t\t\t\trte_thread_mutex_unlock(&bnxt_ulp_global_mutex);\n \t\t\t\treturn NULL;\n \t\t\t}\n \t\t\tSTAILQ_INSERT_TAIL(&bnxt_ulp_session_list,\n@@ -719,7 +719,7 @@ ulp_session_init(struct bnxt *bp,\n \t\t}\n \t}\n \tulp_context_initialized(session, init);\n-\tpthread_mutex_unlock(&bnxt_ulp_global_mutex);\n+\trte_thread_mutex_unlock(&bnxt_ulp_global_mutex);\n \treturn session;\n }\n \n@@ -734,12 +734,12 @@ ulp_session_deinit(struct bnxt_ulp_session_state *session)\n \t\treturn;\n \n \tif (!session->cfg_data) {\n-\t\tpthread_mutex_lock(&bnxt_ulp_global_mutex);\n+\t\trte_thread_mutex_lock(&bnxt_ulp_global_mutex);\n \t\tSTAILQ_REMOVE(&bnxt_ulp_session_list, session,\n \t\t\t      bnxt_ulp_session_state, next);\n-\t\tpthread_mutex_destroy(&session->bnxt_ulp_mutex);\n+\t\trte_thread_mutex_destroy(&session->bnxt_ulp_mutex);\n \t\trte_free(session);\n-\t\tpthread_mutex_unlock(&bnxt_ulp_global_mutex);\n+\t\trte_thread_mutex_unlock(&bnxt_ulp_global_mutex);\n \t}\n }\n \n@@ -892,7 +892,7 @@ bnxt_ulp_deinit(struct bnxt *bp,\n \t\t\t\t\t BNXT_ULP_NAT_OUTER_MOST_FLAGS, 0);\n \n \t/* free the flow db lock */\n-\tpthread_mutex_destroy(&bp->ulp_ctx->cfg_data->flow_db_lock);\n+\trte_thread_mutex_destroy(&bp->ulp_ctx->cfg_data->flow_db_lock);\n \n \t/* Delete the ulp context and tf session and free the ulp context */\n \tulp_ctx_deinit(bp, session);\n@@ -917,7 +917,7 @@ bnxt_ulp_init(struct bnxt *bp,\n \t\tgoto jump_to_error;\n \t}\n \n-\trc = pthread_mutex_init(&bp->ulp_ctx->cfg_data->flow_db_lock, NULL);\n+\trc = rte_thread_mutex_init(&bp->ulp_ctx->cfg_data->flow_db_lock);\n \tif (rc) {\n \t\tBNXT_TF_DBG(ERR, \"Unable to initialize flow db lock\\n\");\n \t\tgoto jump_to_error;\n@@ -1117,9 +1117,9 @@ bnxt_ulp_port_deinit(struct bnxt *bp)\n \t/* Get the session details  */\n \tpci_dev = RTE_DEV_TO_PCI(bp->eth_dev->device);\n \tpci_addr = &pci_dev->addr;\n-\tpthread_mutex_lock(&bnxt_ulp_global_mutex);\n+\trte_thread_mutex_lock(&bnxt_ulp_global_mutex);\n \tsession = ulp_get_session(pci_addr);\n-\tpthread_mutex_unlock(&bnxt_ulp_global_mutex);\n+\trte_thread_mutex_unlock(&bnxt_ulp_global_mutex);\n \n \t/* session not found then just exit */\n \tif (!session) {\n@@ -1451,7 +1451,7 @@ bnxt_ulp_cntxt_acquire_fdb_lock(struct bnxt_ulp_context\t*ulp_ctx)\n \tif (!ulp_ctx || !ulp_ctx->cfg_data)\n \t\treturn -1;\n \n-\tif (pthread_mutex_lock(&ulp_ctx->cfg_data->flow_db_lock)) {\n+\tif (rte_thread_mutex_lock(&ulp_ctx->cfg_data->flow_db_lock)) {\n \t\tBNXT_TF_DBG(ERR, \"unable to acquire fdb lock\\n\");\n \t\treturn -1;\n \t}\n@@ -1465,5 +1465,5 @@ bnxt_ulp_cntxt_release_fdb_lock(struct bnxt_ulp_context\t*ulp_ctx)\n \tif (!ulp_ctx || !ulp_ctx->cfg_data)\n \t\treturn;\n \n-\tpthread_mutex_unlock(&ulp_ctx->cfg_data->flow_db_lock);\n+\trte_thread_mutex_unlock(&ulp_ctx->cfg_data->flow_db_lock);\n }\ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.h b/drivers/net/bnxt/tf_ulp/bnxt_ulp.h\nindex 330965061..88d64d703 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.h\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.h\n@@ -49,7 +49,7 @@ struct bnxt_ulp_data {\n \tuint32_t\t\t\tdev_id; /* Hardware device id */\n \tuint32_t\t\t\tref_cnt;\n \tstruct bnxt_ulp_flow_db\t\t*flow_db;\n-\tpthread_mutex_t\t\t\tflow_db_lock;\n+\trte_thread_mutex_t\t\t\tflow_db_lock;\n \tvoid\t\t\t\t*mapper_data;\n \tstruct bnxt_ulp_port_db\t\t*port_db;\n \tstruct bnxt_ulp_fc_info\t\t*fc_info;\n@@ -75,7 +75,7 @@ struct bnxt_ulp_pci_info {\n struct bnxt_ulp_session_state {\n \tSTAILQ_ENTRY(bnxt_ulp_session_state)\tnext;\n \tbool\t\t\t\t\tbnxt_ulp_init;\n-\tpthread_mutex_t\t\t\t\tbnxt_ulp_mutex;\n+\trte_thread_mutex_t\t\t\t\tbnxt_ulp_mutex;\n \tstruct bnxt_ulp_pci_info\t\tpci_info;\n \tstruct bnxt_ulp_data\t\t\t*cfg_data;\n \tstruct tf\t\t\t\t*g_tfp;\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c b/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c\nindex 3eddbd683..26c3e7551 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c\n@@ -84,7 +84,7 @@ ulp_fc_mgr_init(struct bnxt_ulp_context *ctxt)\n \tif (!ulp_fc_info)\n \t\tgoto error;\n \n-\trc = pthread_mutex_init(&ulp_fc_info->fc_lock, NULL);\n+\trc = rte_thread_mutex_init(&ulp_fc_info->fc_lock);\n \tif (rc) {\n \t\tPMD_DRV_LOG(ERR, \"Failed to initialize fc mutex\\n\");\n \t\tgoto error;\n@@ -141,7 +141,7 @@ ulp_fc_mgr_deinit(struct bnxt_ulp_context *ctxt)\n \n \tulp_fc_mgr_thread_cancel(ctxt);\n \n-\tpthread_mutex_destroy(&ulp_fc_info->fc_lock);\n+\trte_thread_mutex_destroy(&ulp_fc_info->fc_lock);\n \n \tfor (i = 0; i < TF_DIR_MAX; i++)\n \t\trte_free(ulp_fc_info->sw_acc_tbl[i]);\n@@ -383,7 +383,7 @@ ulp_fc_mgr_alarm_cb(void *arg)\n \t\tgoto out;\n \n \tif (!ulp_fc_info->num_entries) {\n-\t\tpthread_mutex_unlock(&ulp_fc_info->fc_lock);\n+\t\trte_thread_mutex_unlock(&ulp_fc_info->fc_lock);\n \t\tulp_fc_mgr_thread_cancel(ctxt);\n \t\treturn;\n \t}\n@@ -414,7 +414,7 @@ ulp_fc_mgr_alarm_cb(void *arg)\n \t\t}\n \t}\n \n-\tpthread_mutex_unlock(&ulp_fc_info->fc_lock);\n+\trte_thread_mutex_unlock(&ulp_fc_info->fc_lock);\n \n \t/*\n \t * If cmd fails once, no need of\n@@ -503,12 +503,12 @@ int32_t ulp_fc_mgr_cntr_set(struct bnxt_ulp_context *ctxt, enum tf_dir dir,\n \tif (!ulp_fc_info)\n \t\treturn -EIO;\n \n-\tpthread_mutex_lock(&ulp_fc_info->fc_lock);\n+\trte_thread_mutex_lock(&ulp_fc_info->fc_lock);\n \tsw_cntr_idx = hw_cntr_id - ulp_fc_info->shadow_hw_tbl[dir].start_idx;\n \tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].valid = true;\n \tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].hw_cntr_id = hw_cntr_id;\n \tulp_fc_info->num_entries++;\n-\tpthread_mutex_unlock(&ulp_fc_info->fc_lock);\n+\trte_thread_mutex_unlock(&ulp_fc_info->fc_lock);\n \n \treturn 0;\n }\n@@ -535,14 +535,14 @@ int32_t ulp_fc_mgr_cntr_reset(struct bnxt_ulp_context *ctxt, enum tf_dir dir,\n \tif (!ulp_fc_info)\n \t\treturn -EIO;\n \n-\tpthread_mutex_lock(&ulp_fc_info->fc_lock);\n+\trte_thread_mutex_lock(&ulp_fc_info->fc_lock);\n \tsw_cntr_idx = hw_cntr_id - ulp_fc_info->shadow_hw_tbl[dir].start_idx;\n \tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].valid = false;\n \tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].hw_cntr_id = 0;\n \tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].pkt_count = 0;\n \tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].byte_count = 0;\n \tulp_fc_info->num_entries--;\n-\tpthread_mutex_unlock(&ulp_fc_info->fc_lock);\n+\trte_thread_mutex_unlock(&ulp_fc_info->fc_lock);\n \n \treturn 0;\n }\n@@ -607,7 +607,7 @@ int ulp_fc_mgr_query_count_get(struct bnxt_ulp_context *ctxt,\n \thw_cntr_id = params.resource_hndl;\n \tif (params.resource_sub_type ==\n \t\t\tBNXT_ULP_RESOURCE_SUB_TYPE_INDEX_TYPE_INT_COUNT) {\n-\t\tpthread_mutex_lock(&ulp_fc_info->fc_lock);\n+\t\trte_thread_mutex_lock(&ulp_fc_info->fc_lock);\n \t\tsw_cntr_idx = hw_cntr_id -\n \t\t\tulp_fc_info->shadow_hw_tbl[dir].start_idx;\n \t\tsw_acc_tbl_entry = &ulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx];\n@@ -621,7 +621,7 @@ int ulp_fc_mgr_query_count_get(struct bnxt_ulp_context *ctxt,\n \t\t\tsw_acc_tbl_entry->pkt_count = 0;\n \t\t\tsw_acc_tbl_entry->byte_count = 0;\n \t\t}\n-\t\tpthread_mutex_unlock(&ulp_fc_info->fc_lock);\n+\t\trte_thread_mutex_unlock(&ulp_fc_info->fc_lock);\n \t} else if (params.resource_sub_type ==\n \t\t\tBNXT_ULP_RESOURCE_SUB_TYPE_INDEX_TYPE_INT_COUNT_ACC) {\n \t\t/* Get stats from the parent child table */\n@@ -663,7 +663,7 @@ int32_t ulp_fc_mgr_cntr_parent_flow_set(struct bnxt_ulp_context *ctxt,\n \tif (!ulp_fc_info)\n \t\treturn -EIO;\n \n-\tpthread_mutex_lock(&ulp_fc_info->fc_lock);\n+\trte_thread_mutex_lock(&ulp_fc_info->fc_lock);\n \tsw_cntr_idx = hw_cntr_id - ulp_fc_info->shadow_hw_tbl[dir].start_idx;\n \tif (ulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].valid) {\n \t\tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].parent_flow_id = fid;\n@@ -672,7 +672,7 @@ int32_t ulp_fc_mgr_cntr_parent_flow_set(struct bnxt_ulp_context *ctxt,\n \t\t\t    hw_cntr_id, fid);\n \t\trc = -ENOENT;\n \t}\n-\tpthread_mutex_unlock(&ulp_fc_info->fc_lock);\n+\trte_thread_mutex_unlock(&ulp_fc_info->fc_lock);\n \n \treturn rc;\n }\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h b/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h\nindex 04cb86bea..cb6bbcad6 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h\n+++ b/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h\n@@ -47,7 +47,7 @@ struct bnxt_ulp_fc_info {\n \tstruct hw_fc_mem_info\tshadow_hw_tbl[TF_DIR_MAX];\n \tuint32_t\t\tflags;\n \tuint32_t\t\tnum_entries;\n-\tpthread_mutex_t\t\tfc_lock;\n+\trte_thread_mutex_t\t\tfc_lock;\n };\n \n int32_t\ndiff --git a/drivers/net/ena/base/ena_plat_dpdk.h b/drivers/net/ena/base/ena_plat_dpdk.h\nindex a1d749f83..f06bd2b27 100644\n--- a/drivers/net/ena/base/ena_plat_dpdk.h\n+++ b/drivers/net/ena/base/ena_plat_dpdk.h\n@@ -129,14 +129,14 @@ do {                                                                   \\\n #define q_waitqueue_t\t\t\t\\\n \tstruct {\t\t\t\\\n \t\tpthread_cond_t cond;\t\\\n-\t\tpthread_mutex_t mutex;\t\\\n+\t\trte_thread_mutex_t mutex;\t\\\n \t}\n \n #define ena_wait_queue_t q_waitqueue_t\n \n #define ENA_WAIT_EVENT_INIT(waitqueue)\t\t\t\t\t\\\n \tdo {\t\t\t\t\t\t\t\t\\\n-\t\tpthread_mutex_init(&(waitqueue).mutex, NULL);\t\t\\\n+\t\trte_thread_mutex_init(&(waitqueue).mutex);\t\t\\\n \t\tpthread_cond_init(&(waitqueue).cond, NULL);\t\t\\\n \t} while (0)\n \n@@ -149,10 +149,10 @@ do {                                                                   \\\n \t\twait.tv_sec = now.tv_sec + timeout / 1000000UL;\t\t\\\n \t\ttimeout_us = timeout % 1000000UL;\t\t\t\\\n \t\twait.tv_nsec = (now.tv_usec + timeout_us) * 1000UL;\t\\\n-\t\tpthread_mutex_lock(&waitevent.mutex);\t\t\t\\\n+\t\trte_thread_mutex_lock(&waitevent.mutex);\t\t\\\n \t\tpthread_cond_timedwait(&waitevent.cond,\t\t\t\\\n \t\t\t\t&waitevent.mutex, &wait);\t\t\\\n-\t\tpthread_mutex_unlock(&waitevent.mutex);\t\t\t\\\n+\t\trte_thread_mutex_unlock(&waitevent.mutex);\t\t\\\n \t} while (0)\n #define ENA_WAIT_EVENT_SIGNAL(waitevent) pthread_cond_signal(&waitevent.cond)\n /* pthread condition doesn't need to be rearmed after usage */\ndiff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h\nindex cd66348f2..1115afa81 100644\n--- a/drivers/net/enic/enic.h\n+++ b/drivers/net/enic/enic.h\n@@ -107,7 +107,7 @@ struct enic {\n \tint iommu_groupid;\n \tint eventfd;\n \tuint8_t mac_addr[RTE_ETHER_ADDR_LEN];\n-\tpthread_t err_intr_thread;\n+\trte_thread_t err_intr_thread;\n \tint promisc;\n \tint allmulti;\n \tuint8_t ig_vlan_strip_en;\ndiff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h\nindex 932600d05..d8305f9ea 100644\n--- a/drivers/net/hns3/hns3_ethdev.h\n+++ b/drivers/net/hns3/hns3_ethdev.h\n@@ -433,7 +433,7 @@ struct hns3_hw {\n \tstruct hns3_cmq cmq;\n \tstruct hns3_mbx_resp_status mbx_resp; /* mailbox response */\n \tstruct hns3_mbx_arq_ring arq;         /* mailbox async rx queue */\n-\tpthread_t irq_thread_id;\n+\trte_thread_t irq_thread_id;\n \tstruct hns3_mac mac;\n \tunsigned int secondary_cnt; /* Number of secondary processes init'd. */\n \tstruct hns3_tqp_stats tqp_stats;\ndiff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c\nindex fd20c522d..d78b45866 100644\n--- a/drivers/net/hns3/hns3_ethdev_vf.c\n+++ b/drivers/net/hns3/hns3_ethdev_vf.c\n@@ -1107,7 +1107,7 @@ hns3vf_interrupt_handler(void *param)\n \tuint32_t clearval;\n \n \tif (hw->irq_thread_id == 0)\n-\t\thw->irq_thread_id = pthread_self();\n+\t\thw->irq_thread_id = rte_thread_self();\n \n \t/* Disable interrupt */\n \thns3vf_disable_irq0(hw);\ndiff --git a/drivers/net/hns3/hns3_mbx.c b/drivers/net/hns3/hns3_mbx.c\nindex 61d15845e..34d2458b1 100644\n--- a/drivers/net/hns3/hns3_mbx.c\n+++ b/drivers/net/hns3/hns3_mbx.c\n@@ -101,7 +101,7 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code0, uint16_t code1,\n \t\t * Sending mbox in the interrupt thread cannot wait for the\n \t\t * response, so polling the mbox response on the irq thread.\n \t\t */\n-\t\tif (pthread_equal(hw->irq_thread_id, pthread_self())) {\n+\t\tif (rte_thread_equal(hw->irq_thread_id, rte_thread_self())) {\n \t\t\tin_irq = true;\n \t\t\thns3_poll_all_sync_msg();\n \t\t} else {\ndiff --git a/drivers/net/ice/ice_dcf_parent.c b/drivers/net/ice/ice_dcf_parent.c\nindex 476fd4906..66bc7d683 100644\n--- a/drivers/net/ice/ice_dcf_parent.c\n+++ b/drivers/net/ice/ice_dcf_parent.c\n@@ -152,7 +152,7 @@ static void\n start_vsi_reset_thread(struct ice_dcf_hw *dcf_hw, bool vfr, uint16_t vf_id)\n {\n \tstruct ice_dcf_reset_event_param *param;\n-\tpthread_t thread;\n+\trte_thread_t thread;\n \tint ret;\n \n \tparam = malloc(sizeof(*param));\n@@ -165,7 +165,7 @@ 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-\tret = pthread_create(&thread, NULL,\n+\tret = rte_thread_create(&thread, NULL,\n \t\t\t     ice_dcf_vsi_update_service_handler, param);\n \tif (ret) {\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 856d21ef9..aa55e6fc0 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@@ -2614,11 +2614,11 @@ ipn3ke_rpst_scan_check(void)\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 = rte_thread_cancel(ipn3ke_rpst_scan_thread);\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 8a9a21e7c..fcd80fbb6 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.c\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.c\n@@ -4148,7 +4148,7 @@ ixgbe_dev_setup_link_thread_handler(void *param)\n \tu32 speed;\n \tbool autoneg = false;\n \n-\tpthread_detach(pthread_self());\n+\tpthread_detach(rte_thread_self());\n \tspeed = hw->phy.autoneg_advertised;\n \tif (!speed)\n \t\tixgbe_get_link_capabilities(hw, &speed, &autoneg);\ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h\nindex a0ce18ca2..272fdcfb8 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.h\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.h\n@@ -516,7 +516,7 @@ struct ixgbe_adapter {\n \tuint8_t pflink_fullchk;\n \tuint8_t mac_ctrl_frame_fwd;\n \trte_atomic32_t link_thread_running;\n-\tpthread_t link_thread_tid;\n+\trte_thread_t link_thread_tid;\n };\n \n struct ixgbe_vf_representor {\ndiff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c\nindex 9ce74e549..3518b913e 100644\n--- a/drivers/net/kni/rte_eth_kni.c\n+++ b/drivers/net/kni/rte_eth_kni.c\n@@ -50,7 +50,7 @@ struct pmd_internals {\n \tuint16_t port_id;\n \tint is_kni_started;\n \n-\tpthread_t thread;\n+\trte_thread_t thread;\n \tint stop_thread;\n \tint no_request_thread;\n \n@@ -186,11 +186,11 @@ eth_kni_dev_stop(struct rte_eth_dev *dev)\n \tif (internals->no_request_thread == 0 && internals->stop_thread == 0) {\n \t\tinternals->stop_thread = 1;\n \n-\t\tret = pthread_cancel(internals->thread);\n+\t\tret = rte_thread_cancel(internals->thread);\n \t\tif (ret)\n \t\t\tPMD_LOG(ERR, \"Can't cancel the thread\");\n \n-\t\tret = pthread_join(internals->thread, NULL);\n+\t\tret = rte_thread_join(internals->thread, NULL);\n \t\tif (ret)\n \t\t\tPMD_LOG(ERR, \"Can't join the thread\");\n \t}\ndiff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c\nindex 5e3ae9f10..21689c596 100644\n--- a/drivers/net/mlx5/linux/mlx5_os.c\n+++ b/drivers/net/mlx5/linux/mlx5_os.c\n@@ -2349,7 +2349,7 @@ mlx5_os_open_device(const struct mlx5_dev_spawn_data *spawn,\n \tint err = 0;\n \n \tsh->numa_node = spawn->pci_dev->device.numa_node;\n-\tpthread_mutex_init(&sh->txpp.mutex, NULL);\n+\trte_thread_mutex_init(&sh->txpp.mutex);\n \t/*\n \t * Configure environment variable \"MLX5_BF_SHUT_UP\"\n \t * before the device creation. The rdma_core library\ndiff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c\nindex abd7ff70d..57645aed1 100644\n--- a/drivers/net/mlx5/mlx5.c\n+++ b/drivers/net/mlx5/mlx5.c\n@@ -181,7 +181,7 @@ int mlx5_logtype;\n \n static LIST_HEAD(, mlx5_dev_ctx_shared) mlx5_dev_ctx_list =\n \t\t\t\t\t\tLIST_HEAD_INITIALIZER();\n-static pthread_mutex_t mlx5_dev_ctx_list_mutex;\n+static rte_thread_mutex_t mlx5_dev_ctx_list_mutex;\n static const struct mlx5_indexed_pool_config mlx5_ipool_cfg[] = {\n #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)\n \t[MLX5_IPOOL_DECAP_ENCAP] = {\n@@ -884,7 +884,7 @@ mlx5_alloc_shared_dev_ctx(const struct mlx5_dev_spawn_data *spawn,\n \tMLX5_ASSERT(spawn);\n \t/* Secondary process should not create the shared context. */\n \tMLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);\n-\tpthread_mutex_lock(&mlx5_dev_ctx_list_mutex);\n+\trte_thread_mutex_lock(&mlx5_dev_ctx_list_mutex);\n \t/* Search for IB context by device name. */\n \tLIST_FOREACH(sh, &mlx5_dev_ctx_list, next) {\n \t\tif (!strcmp(sh->ibdev_name,\n@@ -1010,11 +1010,11 @@ mlx5_alloc_shared_dev_ctx(const struct mlx5_dev_spawn_data *spawn,\n \tLIST_INSERT_HEAD(&mlx5_dev_ctx_list, sh, next);\n \trte_spinlock_init(&sh->geneve_tlv_opt_sl);\n exit:\n-\tpthread_mutex_unlock(&mlx5_dev_ctx_list_mutex);\n+\trte_thread_mutex_unlock(&mlx5_dev_ctx_list_mutex);\n \treturn sh;\n error:\n-\tpthread_mutex_destroy(&sh->txpp.mutex);\n-\tpthread_mutex_unlock(&mlx5_dev_ctx_list_mutex);\n+\trte_thread_mutex_destroy(&sh->txpp.mutex);\n+\trte_thread_mutex_unlock(&mlx5_dev_ctx_list_mutex);\n \tMLX5_ASSERT(sh);\n \tif (sh->cnt_id_tbl)\n \t\tmlx5_l3t_destroy(sh->cnt_id_tbl);\n@@ -1046,7 +1046,7 @@ mlx5_alloc_shared_dev_ctx(const struct mlx5_dev_spawn_data *spawn,\n void\n mlx5_free_shared_dev_ctx(struct mlx5_dev_ctx_shared *sh)\n {\n-\tpthread_mutex_lock(&mlx5_dev_ctx_list_mutex);\n+\trte_thread_mutex_lock(&mlx5_dev_ctx_list_mutex);\n #ifdef RTE_LIBRTE_MLX5_DEBUG\n \t/* Check the object presence in the list. */\n \tstruct mlx5_dev_ctx_shared *lctx;\n@@ -1077,7 +1077,7 @@ mlx5_free_shared_dev_ctx(struct mlx5_dev_ctx_shared *sh)\n \t/* Release flow workspaces objects on the last device. */\n \tif (LIST_EMPTY(&mlx5_dev_ctx_list))\n \t\tmlx5_flow_os_release_workspace();\n-\tpthread_mutex_unlock(&mlx5_dev_ctx_list_mutex);\n+\trte_thread_mutex_unlock(&mlx5_dev_ctx_list_mutex);\n \t/*\n \t *  Ensure there is no async event handler installed.\n \t *  Only primary process handles async device events.\n@@ -1108,11 +1108,11 @@ mlx5_free_shared_dev_ctx(struct mlx5_dev_ctx_shared *sh)\n \tif (sh->ctx)\n \t\tclaim_zero(mlx5_glue->close_device(sh->ctx));\n \tMLX5_ASSERT(sh->geneve_tlv_option_resource == NULL);\n-\tpthread_mutex_destroy(&sh->txpp.mutex);\n+\trte_thread_mutex_destroy(&sh->txpp.mutex);\n \tmlx5_free(sh);\n \treturn;\n exit:\n-\tpthread_mutex_unlock(&mlx5_dev_ctx_list_mutex);\n+\trte_thread_mutex_unlock(&mlx5_dev_ctx_list_mutex);\n }\n \n /**\n@@ -2234,7 +2234,7 @@ RTE_LOG_REGISTER(mlx5_logtype, pmd.net.mlx5, NOTICE)\n  */\n RTE_INIT(rte_mlx5_pmd_init)\n {\n-\tpthread_mutex_init(&mlx5_dev_ctx_list_mutex, NULL);\n+\trte_thread_mutex_init(&mlx5_dev_ctx_list_mutex);\n \tmlx5_common_init();\n \t/* Build the static tables for Verbs conversion. */\n \tmlx5_set_ptype_table();\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 14043b68d..40e5bc76c 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -632,7 +632,7 @@ struct mlx5_txpp_ts {\n \n /* Tx packet pacing structure. */\n struct mlx5_dev_txpp {\n-\tpthread_mutex_t mutex; /* Pacing create/destroy mutex. */\n+\trte_thread_mutex_t mutex; /* Pacing create/destroy mutex. */\n \tuint32_t refcnt; /* Pacing reference counter. */\n \tuint32_t freq; /* Timestamp frequency, Hz. */\n \tuint32_t tick; /* Completion tick duration in nanoseconds. */\ndiff --git a/drivers/net/mlx5/mlx5_txpp.c b/drivers/net/mlx5/mlx5_txpp.c\nindex e8d632ad2..2a149f5bf 100644\n--- a/drivers/net/mlx5/mlx5_txpp.c\n+++ b/drivers/net/mlx5/mlx5_txpp.c\n@@ -904,7 +904,7 @@ mlx5_txpp_start(struct rte_eth_dev *dev)\n \t\tif (ret < 0)\n \t\t\treturn 0;\n \t}\n-\tret = pthread_mutex_lock(&sh->txpp.mutex);\n+\tret = rte_thread_mutex_lock(&sh->txpp.mutex);\n \tMLX5_ASSERT(!ret);\n \tRTE_SET_USED(ret);\n \tif (sh->txpp.refcnt) {\n@@ -920,7 +920,7 @@ mlx5_txpp_start(struct rte_eth_dev *dev)\n \t\t\trte_errno = -err;\n \t\t}\n \t}\n-\tret = pthread_mutex_unlock(&sh->txpp.mutex);\n+\tret = rte_thread_mutex_unlock(&sh->txpp.mutex);\n \tMLX5_ASSERT(!ret);\n \tRTE_SET_USED(ret);\n \treturn err;\n@@ -947,7 +947,7 @@ mlx5_txpp_stop(struct rte_eth_dev *dev)\n \t\treturn;\n \t}\n \tpriv->txpp_en = 0;\n-\tret = pthread_mutex_lock(&sh->txpp.mutex);\n+\tret = rte_thread_mutex_lock(&sh->txpp.mutex);\n \tMLX5_ASSERT(!ret);\n \tRTE_SET_USED(ret);\n \tMLX5_ASSERT(sh->txpp.refcnt);\n@@ -955,7 +955,7 @@ mlx5_txpp_stop(struct rte_eth_dev *dev)\n \t\treturn;\n \t/* No references any more, do actual destroy. */\n \tmlx5_txpp_destroy(sh);\n-\tret = pthread_mutex_unlock(&sh->txpp.mutex);\n+\tret = rte_thread_mutex_unlock(&sh->txpp.mutex);\n \tMLX5_ASSERT(!ret);\n \tRTE_SET_USED(ret);\n }\ndiff --git a/drivers/net/mlx5/windows/mlx5_flow_os.c b/drivers/net/mlx5/windows/mlx5_flow_os.c\nindex c4d579072..229bad3ea 100644\n--- a/drivers/net/mlx5/windows/mlx5_flow_os.c\n+++ b/drivers/net/mlx5/windows/mlx5_flow_os.c\n@@ -253,7 +253,7 @@ struct mlx5_workspace_thread {\n static struct mlx5_workspace_thread *curr;\n static struct mlx5_workspace_thread *first;\n rte_thread_key ws_tls_index;\n-static pthread_mutex_t lock_thread_list;\n+static rte_thread_mutex_t lock_thread_list;\n \n static bool\n mlx5_is_thread_alive(HANDLE thread_handle)\n@@ -330,7 +330,7 @@ mlx5_flow_os_release_workspace(void)\n \t\tfree(first);\n \t}\n \trte_thread_key_delete(ws_tls_index);\n-\tpthread_mutex_destroy(&lock_thread_list);\n+\trte_thread_mutex_destroy(&lock_thread_list);\n }\n \n static int\n@@ -352,7 +352,7 @@ mlx5_add_workspace_to_list(struct mlx5_flow_workspace *data)\n \t}\n \ttemp->mlx5_ws = data;\n \ttemp->thread_handle = curr_thread;\n-\tpthread_mutex_lock(&lock_thread_list);\n+\trte_thread_mutex_lock(&lock_thread_list);\n \tmlx5_clear_thread_list();\n \tif (!first) {\n \t\tfirst = temp;\n@@ -361,7 +361,7 @@ mlx5_add_workspace_to_list(struct mlx5_flow_workspace *data)\n \t\tcurr->next = temp;\n \t\tcurr = curr->next;\n \t}\n-\tpthread_mutex_unlock(&lock_thread_list);\n+\trte_thread_mutex_unlock(&lock_thread_list);\n \treturn 0;\n }\n \n@@ -374,7 +374,7 @@ mlx5_flow_os_init_workspace_once(void)\n \t\tDRV_LOG(ERR, \"Can't create flow workspace data thread key.\");\n \t\treturn err;\n \t}\n-\tpthread_mutex_init(&lock_thread_list, NULL);\n+\trte_thread_mutex_init(&lock_thread_list);\n \treturn 0;\n }\n \ndiff --git a/drivers/net/mlx5/windows/mlx5_os.c b/drivers/net/mlx5/windows/mlx5_os.c\nindex 6f3927614..956e92d68 100644\n--- a/drivers/net/mlx5/windows/mlx5_os.c\n+++ b/drivers/net/mlx5/windows/mlx5_os.c\n@@ -226,7 +226,7 @@ mlx5_os_open_device(const struct mlx5_dev_spawn_data *spawn,\n \tint err = 0;\n \tstruct mlx5_context *mlx5_ctx;\n \n-\tpthread_mutex_init(&sh->txpp.mutex, NULL);\n+\trte_thread_mutex_init(&sh->txpp.mutex);\n \t/* Set numa node from pci probe */\n \tsh->numa_node = spawn->pci_dev->device.numa_node;\n \ndiff --git a/drivers/net/qede/base/bcm_osal.h b/drivers/net/qede/base/bcm_osal.h\nindex c5b539928..f0cb71c93 100644\n--- a/drivers/net/qede/base/bcm_osal.h\n+++ b/drivers/net/qede/base/bcm_osal.h\n@@ -153,10 +153,10 @@ void osal_dma_free_mem(struct ecore_dev *edev, dma_addr_t phys);\n \n /* Mutexes */\n \n-typedef pthread_mutex_t osal_mutex_t;\n-#define OSAL_MUTEX_RELEASE(lock) pthread_mutex_unlock(lock)\n-#define OSAL_MUTEX_INIT(lock) pthread_mutex_init(lock, NULL)\n-#define OSAL_MUTEX_ACQUIRE(lock) pthread_mutex_lock(lock)\n+typedef rte_thread_mutex_t osal_mutex_t;\n+#define OSAL_MUTEX_RELEASE(lock) rte_thread_mutex_unlock(lock)\n+#define OSAL_MUTEX_INIT(lock) rte_thread_mutex_init(lock)\n+#define OSAL_MUTEX_ACQUIRE(lock) rte_thread_mutex_lock(lock)\n #define OSAL_MUTEX_ALLOC(hwfn, lock) nothing\n #define OSAL_MUTEX_DEALLOC(lock) nothing\n \ndiff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c\nindex d198fc8a8..1004ec289 100644\n--- a/drivers/net/vhost/rte_eth_vhost.c\n+++ b/drivers/net/vhost/rte_eth_vhost.c\n@@ -121,7 +121,7 @@ TAILQ_HEAD(internal_list_head, internal_list);\n static struct internal_list_head internal_list =\n \tTAILQ_HEAD_INITIALIZER(internal_list);\n \n-static pthread_mutex_t internal_list_lock = PTHREAD_MUTEX_INITIALIZER;\n+static rte_thread_mutex_t internal_list_lock = RTE_THREAD_MUTEX_INITIALIZER;\n \n static struct rte_eth_link pmd_link = {\n \t\t.link_speed = 10000,\n@@ -507,7 +507,7 @@ find_internal_resource(char *ifname)\n \tif (ifname == NULL)\n \t\treturn NULL;\n \n-\tpthread_mutex_lock(&internal_list_lock);\n+\trte_thread_mutex_lock(&internal_list_lock);\n \n \tTAILQ_FOREACH(list, &internal_list, next) {\n \t\tinternal = list->eth_dev->data->dev_private;\n@@ -517,7 +517,7 @@ find_internal_resource(char *ifname)\n \t\t}\n \t}\n \n-\tpthread_mutex_unlock(&internal_list_lock);\n+\trte_thread_mutex_unlock(&internal_list_lock);\n \n \tif (!found)\n \t\treturn NULL;\n@@ -1001,9 +1001,9 @@ vhost_driver_setup(struct rte_eth_dev *eth_dev)\n \t\tgoto free_list;\n \n \tlist->eth_dev = eth_dev;\n-\tpthread_mutex_lock(&internal_list_lock);\n+\trte_thread_mutex_lock(&internal_list_lock);\n \tTAILQ_INSERT_TAIL(&internal_list, list, next);\n-\tpthread_mutex_unlock(&internal_list_lock);\n+\trte_thread_mutex_unlock(&internal_list_lock);\n \n \trte_spinlock_init(&vring_state->lock);\n \tvring_states[eth_dev->data->port_id] = vring_state;\n@@ -1035,9 +1035,9 @@ vhost_driver_setup(struct rte_eth_dev *eth_dev)\n \trte_vhost_driver_unregister(internal->iface_name);\n list_remove:\n \tvring_states[eth_dev->data->port_id] = NULL;\n-\tpthread_mutex_lock(&internal_list_lock);\n+\trte_thread_mutex_lock(&internal_list_lock);\n \tTAILQ_REMOVE(&internal_list, list, next);\n-\tpthread_mutex_unlock(&internal_list_lock);\n+\trte_thread_mutex_unlock(&internal_list_lock);\n \trte_free(vring_state);\n free_list:\n \trte_free(list);\n@@ -1093,7 +1093,7 @@ rte_eth_vhost_get_vid_from_port_id(uint16_t port_id)\n \tif (!rte_eth_dev_is_valid_port(port_id))\n \t\treturn -1;\n \n-\tpthread_mutex_lock(&internal_list_lock);\n+\trte_thread_mutex_lock(&internal_list_lock);\n \n \tTAILQ_FOREACH(list, &internal_list, next) {\n \t\teth_dev = list->eth_dev;\n@@ -1106,7 +1106,7 @@ rte_eth_vhost_get_vid_from_port_id(uint16_t port_id)\n \t\t}\n \t}\n \n-\tpthread_mutex_unlock(&internal_list_lock);\n+\trte_thread_mutex_unlock(&internal_list_lock);\n \n \treturn vid;\n }\n@@ -1184,9 +1184,9 @@ eth_dev_close(struct rte_eth_dev *dev)\n \tlist = find_internal_resource(internal->iface_name);\n \tif (list) {\n \t\trte_vhost_driver_unregister(internal->iface_name);\n-\t\tpthread_mutex_lock(&internal_list_lock);\n+\t\trte_thread_mutex_lock(&internal_list_lock);\n \t\tTAILQ_REMOVE(&internal_list, list, next);\n-\t\tpthread_mutex_unlock(&internal_list_lock);\n+\t\trte_thread_mutex_unlock(&internal_list_lock);\n \t\trte_free(list);\n \t}\n \ndiff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c\nindex 1b54d55bd..2052d03a3 100644\n--- a/drivers/net/virtio/virtio_user/virtio_user_dev.c\n+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c\n@@ -142,7 +142,7 @@ virtio_user_dev_set_features(struct virtio_user_dev *dev)\n \tuint64_t features;\n \tint ret = -1;\n \n-\tpthread_mutex_lock(&dev->mutex);\n+\trte_thread_mutex_lock(&dev->mutex);\n \n \t/* Step 0: tell vhost to create queues */\n \tif (virtio_user_queue_setup(dev, virtio_user_create_queue) < 0)\n@@ -160,7 +160,7 @@ virtio_user_dev_set_features(struct virtio_user_dev *dev)\n \t\tgoto error;\n \tPMD_DRV_LOG(INFO, \"(%s) set features: 0x%\" PRIx64, dev->path, features);\n error:\n-\tpthread_mutex_unlock(&dev->mutex);\n+\trte_thread_mutex_unlock(&dev->mutex);\n \n \treturn ret;\n }\n@@ -184,7 +184,7 @@ virtio_user_start_device(struct virtio_user_dev *dev)\n \t * memory subsystem in the future.\n \t */\n \trte_mcfg_mem_read_lock();\n-\tpthread_mutex_lock(&dev->mutex);\n+\trte_thread_mutex_lock(&dev->mutex);\n \n \t/* Step 2: share memory regions */\n \tret = dev->ops->set_memory_table(dev);\n@@ -205,12 +205,12 @@ virtio_user_start_device(struct virtio_user_dev *dev)\n \n \tdev->started = true;\n \n-\tpthread_mutex_unlock(&dev->mutex);\n+\trte_thread_mutex_unlock(&dev->mutex);\n \trte_mcfg_mem_read_unlock();\n \n \treturn 0;\n error:\n-\tpthread_mutex_unlock(&dev->mutex);\n+\trte_thread_mutex_unlock(&dev->mutex);\n \trte_mcfg_mem_read_unlock();\n \n \tPMD_INIT_LOG(ERR, \"(%s) Failed to start device\\n\", dev->path);\n@@ -225,7 +225,7 @@ int virtio_user_stop_device(struct virtio_user_dev *dev)\n \tuint32_t i;\n \tint ret;\n \n-\tpthread_mutex_lock(&dev->mutex);\n+\trte_thread_mutex_lock(&dev->mutex);\n \tif (!dev->started)\n \t\tgoto out;\n \n@@ -248,11 +248,11 @@ int virtio_user_stop_device(struct virtio_user_dev *dev)\n \tdev->started = false;\n \n out:\n-\tpthread_mutex_unlock(&dev->mutex);\n+\trte_thread_mutex_unlock(&dev->mutex);\n \n \treturn 0;\n err:\n-\tpthread_mutex_unlock(&dev->mutex);\n+\trte_thread_mutex_unlock(&dev->mutex);\n \n \tPMD_INIT_LOG(ERR, \"(%s) Failed to stop device\\n\", dev->path);\n \n@@ -379,7 +379,7 @@ virtio_user_mem_event_cb(enum rte_mem_event type __rte_unused,\n \tif (msl->external)\n \t\treturn;\n \n-\tpthread_mutex_lock(&dev->mutex);\n+\trte_thread_mutex_lock(&dev->mutex);\n \n \tif (dev->started == false)\n \t\tgoto exit;\n@@ -404,7 +404,7 @@ virtio_user_mem_event_cb(enum rte_mem_event type __rte_unused,\n \t}\n \n exit:\n-\tpthread_mutex_unlock(&dev->mutex);\n+\trte_thread_mutex_unlock(&dev->mutex);\n \n \tif (ret < 0)\n \t\tPMD_DRV_LOG(ERR, \"(%s) Failed to update memory table\\n\", dev->path);\n@@ -490,7 +490,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,\n \tuint64_t backend_features;\n \tint i;\n \n-\tpthread_mutex_init(&dev->mutex, NULL);\n+\trte_thread_mutex_init(&dev->mutex);\n \tstrlcpy(dev->path, path, PATH_MAX);\n \n \tfor (i = 0; i < VIRTIO_MAX_VIRTQUEUES; i++) {\n@@ -795,13 +795,13 @@ virtio_user_dev_set_status(struct virtio_user_dev *dev, uint8_t status)\n {\n \tint ret;\n \n-\tpthread_mutex_lock(&dev->mutex);\n+\trte_thread_mutex_lock(&dev->mutex);\n \tdev->status = status;\n \tret = dev->ops->set_status(dev, status);\n \tif (ret && ret != -ENOTSUP)\n \t\tPMD_INIT_LOG(ERR, \"(%s) Failed to set backend status\\n\", dev->path);\n \n-\tpthread_mutex_unlock(&dev->mutex);\n+\trte_thread_mutex_unlock(&dev->mutex);\n \treturn ret;\n }\n \n@@ -811,7 +811,7 @@ virtio_user_dev_update_status(struct virtio_user_dev *dev)\n \tint ret;\n \tuint8_t status;\n \n-\tpthread_mutex_lock(&dev->mutex);\n+\trte_thread_mutex_lock(&dev->mutex);\n \n \tret = dev->ops->get_status(dev, &status);\n \tif (!ret) {\n@@ -836,7 +836,7 @@ virtio_user_dev_update_status(struct virtio_user_dev *dev)\n \t\tPMD_INIT_LOG(ERR, \"(%s) Failed to get backend status\\n\", dev->path);\n \t}\n \n-\tpthread_mutex_unlock(&dev->mutex);\n+\trte_thread_mutex_unlock(&dev->mutex);\n \treturn ret;\n }\n \ndiff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h\nindex 8a62f7ea7..db393e55b 100644\n--- a/drivers/net/virtio/virtio_user/virtio_user_dev.h\n+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h\n@@ -56,7 +56,7 @@ struct virtio_user_dev {\n \tbool\t\tqp_enabled[VIRTIO_MAX_VIRTQUEUE_PAIRS];\n \n \tstruct virtio_user_backend_ops *ops;\n-\tpthread_mutex_t\tmutex;\n+\trte_thread_mutex_t\tmutex;\n \tbool\t\tstarted;\n \n \tvoid *backend_data;\ndiff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c\nindex 05d79bfcc..6f97695e0 100644\n--- a/drivers/raw/ifpga/ifpga_rawdev.c\n+++ b/drivers/raw/ifpga/ifpga_rawdev.c\n@@ -69,7 +69,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_start;\n-static pthread_t ifpga_monitor_start_thread;\n+static rte_thread_t ifpga_monitor_start_thread;\n \n #define IFPGA_MAX_IRQ 12\n /* 0 for FME interrupt, others are reserved for AFU irq */\n@@ -526,7 +526,7 @@ ifpga_monitor_start_func(void)\n \tint ret;\n \n \tif (ifpga_monitor_start == 0) {\n-\t\tret = pthread_create(&ifpga_monitor_start_thread,\n+\t\tret = rte_thread_create(&ifpga_monitor_start_thread,\n \t\t\tNULL,\n \t\t\tifpga_rawdev_gsd_handle, NULL);\n \t\tif (ret) {\n@@ -545,11 +545,11 @@ ifpga_monitor_stop_func(void)\n \tint ret;\n \n \tif (ifpga_monitor_start == 1) {\n-\t\tret = pthread_cancel(ifpga_monitor_start_thread);\n+\t\tret = rte_thread_cancel(ifpga_monitor_start_thread);\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 39237aecf..6ff8dd123 100644\n--- a/drivers/vdpa/ifc/ifcvf_vdpa.c\n+++ b/drivers/vdpa/ifc/ifcvf_vdpa.c\n@@ -50,7 +50,7 @@ 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+\trte_thread_t tid;\t/* thread for notify relay */\n \tint epfd;\n \tint vid;\n \tstruct rte_vdpa_device *vdev;\n@@ -77,7 +77,7 @@ TAILQ_HEAD(internal_list_head, internal_list);\n static struct internal_list_head internal_list =\n \tTAILQ_HEAD_INITIALIZER(internal_list);\n \n-static pthread_mutex_t internal_list_lock = PTHREAD_MUTEX_INITIALIZER;\n+static rte_thread_mutex_t internal_list_lock = RTE_THREAD_MUTEX_INITIALIZER;\n \n static void update_used_ring(struct ifcvf_internal *internal, uint16_t qid);\n \n@@ -87,7 +87,7 @@ find_internal_resource_by_vdev(struct rte_vdpa_device *vdev)\n \tint found = 0;\n \tstruct internal_list *list;\n \n-\tpthread_mutex_lock(&internal_list_lock);\n+\trte_thread_mutex_lock(&internal_list_lock);\n \n \tTAILQ_FOREACH(list, &internal_list, next) {\n \t\tif (vdev == list->internal->vdev) {\n@@ -96,7 +96,7 @@ find_internal_resource_by_vdev(struct rte_vdpa_device *vdev)\n \t\t}\n \t}\n \n-\tpthread_mutex_unlock(&internal_list_lock);\n+\trte_thread_mutex_unlock(&internal_list_lock);\n \n \tif (!found)\n \t\treturn NULL;\n@@ -110,7 +110,7 @@ find_internal_resource_by_dev(struct rte_pci_device *pdev)\n \tint found = 0;\n \tstruct internal_list *list;\n \n-\tpthread_mutex_lock(&internal_list_lock);\n+\trte_thread_mutex_lock(&internal_list_lock);\n \n \tTAILQ_FOREACH(list, &internal_list, next) {\n \t\tif (!rte_pci_addr_cmp(&pdev->addr,\n@@ -120,7 +120,7 @@ find_internal_resource_by_dev(struct rte_pci_device *pdev)\n \t\t}\n \t}\n \n-\tpthread_mutex_unlock(&internal_list_lock);\n+\trte_thread_mutex_unlock(&internal_list_lock);\n \n \tif (!found)\n \t\treturn NULL;\n@@ -496,7 +496,7 @@ setup_notify_relay(struct ifcvf_internal *internal)\n {\n \tint ret;\n \n-\tret = pthread_create(&internal->tid, NULL, notify_relay,\n+\tret = rte_thread_create(&internal->tid, NULL, notify_relay,\n \t\t\t(void *)internal);\n \tif (ret) {\n \t\tDRV_LOG(ERR, \"failed to create notify relay pthread.\");\n@@ -508,11 +508,9 @@ 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+\t\trte_thread_cancel(internal->tid);\n+\t\trte_thread_join(internal->tid, NULL);\n \t}\n \tinternal->tid = 0;\n \n@@ -799,7 +797,7 @@ setup_vring_relay(struct ifcvf_internal *internal)\n {\n \tint ret;\n \n-\tret = pthread_create(&internal->tid, NULL, vring_relay,\n+\tret = rte_thread_create(&internal->tid, NULL, vring_relay,\n \t\t\t(void *)internal);\n \tif (ret) {\n \t\tDRV_LOG(ERR, \"failed to create ring relay pthread.\");\n@@ -811,11 +809,9 @@ 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+\t\trte_thread_cancel(internal->tid);\n+\t\trte_thread_join(internal->tid, NULL);\n \t}\n \tinternal->tid = 0;\n \n@@ -1245,9 +1241,9 @@ ifcvf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,\n \t\tgoto error;\n \t}\n \n-\tpthread_mutex_lock(&internal_list_lock);\n+\trte_thread_mutex_lock(&internal_list_lock);\n \tTAILQ_INSERT_TAIL(&internal_list, list, next);\n-\tpthread_mutex_unlock(&internal_list_lock);\n+\trte_thread_mutex_unlock(&internal_list_lock);\n \n \trte_atomic32_set(&internal->started, 1);\n \tupdate_datapath(internal);\n@@ -1285,9 +1281,9 @@ ifcvf_pci_remove(struct rte_pci_device *pci_dev)\n \trte_vfio_container_destroy(internal->vfio_container_fd);\n \trte_vdpa_unregister_device(internal->vdev);\n \n-\tpthread_mutex_lock(&internal_list_lock);\n+\trte_thread_mutex_lock(&internal_list_lock);\n \tTAILQ_REMOVE(&internal_list, list, next);\n-\tpthread_mutex_unlock(&internal_list_lock);\n+\trte_thread_mutex_unlock(&internal_list_lock);\n \n \trte_free(list);\n \trte_free(internal);\ndiff --git a/drivers/vdpa/mlx5/mlx5_vdpa.c b/drivers/vdpa/mlx5/mlx5_vdpa.c\nindex 898e50f80..bcb744f5b 100644\n--- a/drivers/vdpa/mlx5/mlx5_vdpa.c\n+++ b/drivers/vdpa/mlx5/mlx5_vdpa.c\n@@ -48,7 +48,7 @@\n \n TAILQ_HEAD(mlx5_vdpa_privs, mlx5_vdpa_priv) priv_list =\n \t\t\t\t\t      TAILQ_HEAD_INITIALIZER(priv_list);\n-static pthread_mutex_t priv_list_lock = PTHREAD_MUTEX_INITIALIZER;\n+static rte_thread_mutex_t priv_list_lock = RTE_THREAD_MUTEX_INITIALIZER;\n \n static struct mlx5_vdpa_priv *\n mlx5_vdpa_find_priv_resource_by_vdev(struct rte_vdpa_device *vdev)\n@@ -56,14 +56,14 @@ mlx5_vdpa_find_priv_resource_by_vdev(struct rte_vdpa_device *vdev)\n \tstruct mlx5_vdpa_priv *priv;\n \tint found = 0;\n \n-\tpthread_mutex_lock(&priv_list_lock);\n+\trte_thread_mutex_lock(&priv_list_lock);\n \tTAILQ_FOREACH(priv, &priv_list, next) {\n \t\tif (vdev == priv->vdev) {\n \t\t\tfound = 1;\n \t\t\tbreak;\n \t\t}\n \t}\n-\tpthread_mutex_unlock(&priv_list_lock);\n+\trte_thread_mutex_unlock(&priv_list_lock);\n \tif (!found) {\n \t\tDRV_LOG(ERR, \"Invalid vDPA device: %s.\", vdev->device->name);\n \t\trte_errno = EINVAL;\n@@ -143,9 +143,9 @@ mlx5_vdpa_set_vring_state(int vid, int vring, int state)\n \t\tDRV_LOG(ERR, \"Too big vring id: %d.\", vring);\n \t\treturn -E2BIG;\n \t}\n-\tpthread_mutex_lock(&priv->vq_config_lock);\n+\trte_thread_mutex_lock(&priv->vq_config_lock);\n \tret = mlx5_vdpa_virtq_enable(priv, vring, state);\n-\tpthread_mutex_unlock(&priv->vq_config_lock);\n+\trte_thread_mutex_unlock(&priv->vq_config_lock);\n \treturn ret;\n }\n \n@@ -296,7 +296,7 @@ mlx5_vdpa_dev_close(int vid)\n \tpriv->configured = 0;\n \tpriv->vid = 0;\n \t/* The mutex may stay locked after event thread cancel - initiate it. */\n-\tpthread_mutex_init(&priv->vq_config_lock, NULL);\n+\trte_thread_mutex_init(&priv->vq_config_lock);\n \tDRV_LOG(INFO, \"vDPA device %d was closed.\", vid);\n \treturn ret;\n }\n@@ -764,10 +764,10 @@ mlx5_vdpa_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,\n \t}\n \tmlx5_vdpa_config_get(pci_dev->device.devargs, priv);\n \tSLIST_INIT(&priv->mr_list);\n-\tpthread_mutex_init(&priv->vq_config_lock, NULL);\n-\tpthread_mutex_lock(&priv_list_lock);\n+\trte_thread_mutex_init(&priv->vq_config_lock);\n+\trte_thread_mutex_lock(&priv_list_lock);\n \tTAILQ_INSERT_TAIL(&priv_list, priv, next);\n-\tpthread_mutex_unlock(&priv_list_lock);\n+\trte_thread_mutex_unlock(&priv_list_lock);\n \treturn 0;\n \n error:\n@@ -798,7 +798,7 @@ mlx5_vdpa_pci_remove(struct rte_pci_device *pci_dev)\n \tstruct mlx5_vdpa_priv *priv = NULL;\n \tint found = 0;\n \n-\tpthread_mutex_lock(&priv_list_lock);\n+\trte_thread_mutex_lock(&priv_list_lock);\n \tTAILQ_FOREACH(priv, &priv_list, next) {\n \t\tif (!rte_pci_addr_cmp(&priv->pci_dev->addr, &pci_dev->addr)) {\n \t\t\tfound = 1;\n@@ -807,7 +807,7 @@ mlx5_vdpa_pci_remove(struct rte_pci_device *pci_dev)\n \t}\n \tif (found)\n \t\tTAILQ_REMOVE(&priv_list, priv, next);\n-\tpthread_mutex_unlock(&priv_list_lock);\n+\trte_thread_mutex_unlock(&priv_list_lock);\n \tif (found) {\n \t\tif (priv->configured)\n \t\t\tmlx5_vdpa_dev_close(priv->vid);\n@@ -816,7 +816,7 @@ mlx5_vdpa_pci_remove(struct rte_pci_device *pci_dev)\n \t\t\tpriv->var = NULL;\n \t\t}\n \t\tmlx5_glue->close_device(priv->ctx);\n-\t\tpthread_mutex_destroy(&priv->vq_config_lock);\n+\t\trte_thread_mutex_destroy(&priv->vq_config_lock);\n \t\trte_free(priv);\n \t}\n \treturn 0;\ndiff --git a/drivers/vdpa/mlx5/mlx5_vdpa.h b/drivers/vdpa/mlx5/mlx5_vdpa.h\nindex d93b430c9..568b84c3f 100644\n--- a/drivers/vdpa/mlx5/mlx5_vdpa.h\n+++ b/drivers/vdpa/mlx5/mlx5_vdpa.h\n@@ -119,10 +119,10 @@ enum {\n struct mlx5_vdpa_priv {\n \tTAILQ_ENTRY(mlx5_vdpa_priv) next;\n \tuint8_t configured;\n-\tpthread_mutex_t vq_config_lock;\n+\trte_thread_mutex_t vq_config_lock;\n \tuint64_t last_traffic_tic;\n-\tpthread_t timer_tid;\n-\tpthread_mutex_t timer_lock;\n+\trte_thread_t timer_tid;\n+\trte_thread_mutex_t timer_lock;\n \tpthread_cond_t timer_cond;\n \tvolatile uint8_t timer_on;\n \tint event_mode;\ndiff --git a/drivers/vdpa/mlx5/mlx5_vdpa_event.c b/drivers/vdpa/mlx5/mlx5_vdpa_event.c\nindex 404e135d5..ebb53f4b1 100644\n--- a/drivers/vdpa/mlx5/mlx5_vdpa_event.c\n+++ b/drivers/vdpa/mlx5/mlx5_vdpa_event.c\n@@ -247,17 +247,17 @@ mlx5_vdpa_poll_handle(void *arg)\n \tuint32_t max;\n \tuint64_t current_tic;\n \n-\tpthread_mutex_lock(&priv->timer_lock);\n+\trte_thread_mutex_lock(&priv->timer_lock);\n \twhile (!priv->timer_on)\n \t\tpthread_cond_wait(&priv->timer_cond, &priv->timer_lock);\n-\tpthread_mutex_unlock(&priv->timer_lock);\n+\trte_thread_mutex_unlock(&priv->timer_lock);\n \tpriv->timer_delay_us = priv->event_mode ==\n \t\t\t\t\t    MLX5_VDPA_EVENT_MODE_DYNAMIC_TIMER ?\n \t\t\t\t\t      MLX5_VDPA_DEFAULT_TIMER_DELAY_US :\n \t\t\t\t\t\t\t\t priv->event_us;\n \twhile (1) {\n \t\tmax = 0;\n-\t\tpthread_mutex_lock(&priv->vq_config_lock);\n+\t\trte_thread_mutex_lock(&priv->vq_config_lock);\n \t\tfor (i = 0; i < priv->nr_virtqs; i++) {\n \t\t\tcq = &priv->virtqs[i].eqp.cq;\n \t\t\tif (cq->cq_obj.cq && !cq->armed) {\n@@ -281,13 +281,13 @@ mlx5_vdpa_poll_handle(void *arg)\n \t\t\t\tDRV_LOG(DEBUG, \"Device %s traffic was stopped.\",\n \t\t\t\t\tpriv->vdev->device->name);\n \t\t\t\tmlx5_vdpa_arm_all_cqs(priv);\n-\t\t\t\tpthread_mutex_unlock(&priv->vq_config_lock);\n-\t\t\t\tpthread_mutex_lock(&priv->timer_lock);\n+\t\t\t\trte_thread_mutex_unlock(&priv->vq_config_lock);\n+\t\t\t\trte_thread_mutex_lock(&priv->timer_lock);\n \t\t\t\tpriv->timer_on = 0;\n \t\t\t\twhile (!priv->timer_on)\n \t\t\t\t\tpthread_cond_wait(&priv->timer_cond,\n \t\t\t\t\t\t\t  &priv->timer_lock);\n-\t\t\t\tpthread_mutex_unlock(&priv->timer_lock);\n+\t\t\t\trte_thread_mutex_unlock(&priv->timer_lock);\n \t\t\t\tpriv->timer_delay_us = priv->event_mode ==\n \t\t\t\t\t    MLX5_VDPA_EVENT_MODE_DYNAMIC_TIMER ?\n \t\t\t\t\t      MLX5_VDPA_DEFAULT_TIMER_DELAY_US :\n@@ -297,7 +297,7 @@ mlx5_vdpa_poll_handle(void *arg)\n \t\t} else {\n \t\t\tpriv->last_traffic_tic = current_tic;\n \t\t}\n-\t\tpthread_mutex_unlock(&priv->vq_config_lock);\n+\t\trte_thread_mutex_unlock(&priv->vq_config_lock);\n \t\tmlx5_vdpa_timer_sleep(priv, max);\n \t}\n \treturn NULL;\n@@ -313,7 +313,7 @@ mlx5_vdpa_interrupt_handler(void *cb_arg)\n \t\tuint8_t buf[sizeof(struct mlx5dv_devx_async_event_hdr) + 128];\n \t} out;\n \n-\tpthread_mutex_lock(&priv->vq_config_lock);\n+\trte_thread_mutex_lock(&priv->vq_config_lock);\n \twhile (mlx5_glue->devx_get_event(priv->eventc, &out.event_resp,\n \t\t\t\t\t sizeof(out.buf)) >=\n \t\t\t\t       (ssize_t)sizeof(out.event_resp.cookie)) {\n@@ -332,7 +332,7 @@ mlx5_vdpa_interrupt_handler(void *cb_arg)\n \t\t\teventfd_write(cq->callfd, (eventfd_t)1);\n \t\tif (priv->event_mode == MLX5_VDPA_EVENT_MODE_ONLY_INTERRUPT) {\n \t\t\tmlx5_vdpa_cq_arm(priv, cq);\n-\t\t\tpthread_mutex_unlock(&priv->vq_config_lock);\n+\t\t\trte_thread_mutex_unlock(&priv->vq_config_lock);\n \t\t\treturn;\n \t\t}\n \t\t/* Don't arm again - timer will take control. */\n@@ -347,13 +347,13 @@ mlx5_vdpa_interrupt_handler(void *cb_arg)\n \n \t/* Traffic detected: make sure timer is on. */\n \tpriv->last_traffic_tic = rte_rdtsc();\n-\tpthread_mutex_lock(&priv->timer_lock);\n+\trte_thread_mutex_lock(&priv->timer_lock);\n \tif (!priv->timer_on) {\n \t\tpriv->timer_on = 1;\n \t\tpthread_cond_signal(&priv->timer_cond);\n \t}\n-\tpthread_mutex_unlock(&priv->timer_lock);\n-\tpthread_mutex_unlock(&priv->vq_config_lock);\n+\trte_thread_mutex_unlock(&priv->timer_lock);\n+\trte_thread_mutex_unlock(&priv->vq_config_lock);\n }\n \n static void\n@@ -369,7 +369,7 @@ mlx5_vdpa_err_interrupt_handler(void *cb_arg __rte_unused)\n \tstruct mlx5_vdpa_virtq *virtq;\n \tuint64_t sec;\n \n-\tpthread_mutex_lock(&priv->vq_config_lock);\n+\trte_thread_mutex_lock(&priv->vq_config_lock);\n \twhile (mlx5_glue->devx_get_event(priv->err_chnl, &out.event_resp,\n \t\t\t\t\t sizeof(out.buf)) >=\n \t\t\t\t       (ssize_t)sizeof(out.event_resp.cookie)) {\n@@ -415,7 +415,7 @@ mlx5_vdpa_err_interrupt_handler(void *cb_arg __rte_unused)\n \t\t\tvirtq->err_time[i - 1] = virtq->err_time[i];\n \t\tvirtq->err_time[RTE_DIM(virtq->err_time) - 1] = rte_rdtsc();\n \t}\n-\tpthread_mutex_unlock(&priv->vq_config_lock);\n+\trte_thread_mutex_unlock(&priv->vq_config_lock);\n #endif\n }\n \n@@ -502,47 +502,39 @@ mlx5_vdpa_cqe_event_setup(struct mlx5_vdpa_priv *priv)\n {\n \tint ret;\n \trte_cpuset_t cpuset;\n-\tpthread_attr_t attr;\n+\trte_thread_attr_t attr;\n \tchar name[16];\n-\tconst struct sched_param sp = {\n-\t\t.sched_priority = sched_get_priority_max(SCHED_RR),\n-\t};\n \n \tif (!priv->eventc)\n \t\t/* All virtqs are in poll mode. */\n \t\treturn 0;\n \tif (priv->event_mode != MLX5_VDPA_EVENT_MODE_ONLY_INTERRUPT) {\n-\t\tpthread_mutex_init(&priv->timer_lock, NULL);\n+\t\trte_thread_mutex_init(&priv->timer_lock);\n \t\tpthread_cond_init(&priv->timer_cond, NULL);\n \t\tpriv->timer_on = 0;\n-\t\tpthread_attr_init(&attr);\n-\t\tret = pthread_attr_setschedpolicy(&attr, SCHED_RR);\n+\t\trte_thread_attr_init(&attr);\n+\t\tCPU_ZERO(&cpuset);\n+\t\tif (priv->event_core != -1)\n+\t\t\tCPU_SET(priv->event_core, &cpuset);\n+\t\telse\n+\t\t\tcpuset = rte_lcore_cpuset(rte_get_main_lcore());\n+\t\tret = rte_thread_attr_set_affinity(&attr, &cpuset);\n \t\tif (ret) {\n-\t\t\tDRV_LOG(ERR, \"Failed to set thread sched policy = RR.\");\n+\t\t\tDRV_LOG(ERR, \"Failed to set thread affinity.\");\n \t\t\treturn -1;\n \t\t}\n-\t\tret = pthread_attr_setschedparam(&attr, &sp);\n+\t\tret = rte_thread_attr_set_priority(&attr,\n+\t\t\t\t\tRTE_THREAD_PRIORITY_REALTIME_CRITICAL);\n \t\tif (ret) {\n \t\t\tDRV_LOG(ERR, \"Failed to set thread priority.\");\n \t\t\treturn -1;\n \t\t}\n-\t\tret = pthread_create(&priv->timer_tid, &attr,\n+\t\tret = rte_thread_create(&priv->timer_tid, &attr,\n \t\t\t\t     mlx5_vdpa_poll_handle, (void *)priv);\n \t\tif (ret) {\n \t\t\tDRV_LOG(ERR, \"Failed to create timer thread.\");\n \t\t\treturn -1;\n \t\t}\n-\t\tCPU_ZERO(&cpuset);\n-\t\tif (priv->event_core != -1)\n-\t\t\tCPU_SET(priv->event_core, &cpuset);\n-\t\telse\n-\t\t\tcpuset = rte_lcore_cpuset(rte_get_main_lcore());\n-\t\tret = pthread_setaffinity_np(priv->timer_tid,\n-\t\t\t\t\t     sizeof(cpuset), &cpuset);\n-\t\tif (ret) {\n-\t\t\tDRV_LOG(ERR, \"Failed to set thread affinity.\");\n-\t\t\tgoto error;\n-\t\t}\n \t\tsnprintf(name, sizeof(name), \"vDPA-mlx5-%d\", priv->vid);\n \t\tret = pthread_setname_np(priv->timer_tid, name);\n \t\tif (ret) {\n@@ -569,7 +561,6 @@ mlx5_vdpa_cqe_event_unset(struct mlx5_vdpa_priv *priv)\n {\n \tint retries = MLX5_VDPA_INTR_RETRIES;\n \tint ret = -EAGAIN;\n-\tvoid *status;\n \n \tif (priv->intr_handle.fd) {\n \t\twhile (retries-- && ret == -EAGAIN) {\n@@ -586,8 +577,8 @@ mlx5_vdpa_cqe_event_unset(struct mlx5_vdpa_priv *priv)\n \t\tmemset(&priv->intr_handle, 0, sizeof(priv->intr_handle));\n \t}\n \tif (priv->timer_tid) {\n-\t\tpthread_cancel(priv->timer_tid);\n-\t\tpthread_join(priv->timer_tid, &status);\n+\t\trte_thread_cancel(priv->timer_tid);\n+\t\trte_thread_join(priv->timer_tid, NULL);\n \t}\n \tpriv->timer_tid = 0;\n }\ndiff --git a/examples/kni/main.c b/examples/kni/main.c\nindex fe93b8618..d29cbf7ba 100644\n--- a/examples/kni/main.c\n+++ b/examples/kni/main.c\n@@ -1042,8 +1042,8 @@ main(int argc, char** argv)\n \tint ret;\n \tuint16_t nb_sys_ports, port;\n \tunsigned i;\n-\tvoid *retval;\n-\tpthread_t kni_link_tid;\n+\tint retval;\n+\trte_thread_t kni_link_tid;\n \tint pid;\n \n \t/* Associate signal_hanlder function with USR signals */\n@@ -1126,7 +1126,7 @@ main(int argc, char** argv)\n \t\t\treturn -1;\n \t}\n \tmonitor_links = 0;\n-\tpthread_join(kni_link_tid, &retval);\n+\trte_thread_join(kni_link_tid, &retval);\n \n \t/* Release resources */\n \tRTE_ETH_FOREACH_DEV(port) {\ndiff --git a/examples/vhost/main.c b/examples/vhost/main.c\nindex 2ca7d98c5..c3b2273ef 100644\n--- a/examples/vhost/main.c\n+++ b/examples/vhost/main.c\n@@ -1635,7 +1635,7 @@ main(int argc, char *argv[])\n \tunsigned nb_ports, valid_num_ports;\n \tint ret, i;\n \tuint16_t portid;\n-\tstatic pthread_t tid;\n+\tstatic rte_thread_t tid;\n \tuint64_t flags = 0;\n \n \tsignal(SIGINT, sigint_handler);\ndiff --git a/examples/vhost_blk/vhost_blk.c b/examples/vhost_blk/vhost_blk.c\nindex 7ea60863d..5ea1b45ac 100644\n--- a/examples/vhost_blk/vhost_blk.c\n+++ b/examples/vhost_blk/vhost_blk.c\n@@ -533,7 +533,7 @@ ctrlr_worker(void *arg)\n {\n \tstruct vhost_blk_ctrlr *ctrlr = (struct vhost_blk_ctrlr *)arg;\n \tcpu_set_t cpuset;\n-\tpthread_t thread;\n+\trte_thread_t thread;\n \tint i;\n \n \tfprintf(stdout, \"Ctrlr Worker Thread start\\n\");\n@@ -545,10 +545,10 @@ ctrlr_worker(void *arg)\n \t\texit(0);\n \t}\n \n-\tthread = pthread_self();\n+\tthread = rte_thread_self();\n \tCPU_ZERO(&cpuset);\n \tCPU_SET(0, &cpuset);\n-\tpthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);\n+\trte_thread_set_affinity_by_id(thread, sizeof(cpu_set_t), &cpuset);\n \n \tfor (i = 0; i < NUM_OF_BLK_QUEUES; i++)\n \t\tsubmit_inflight_vq(&ctrlr->queues[i]);\n@@ -604,7 +604,7 @@ new_device(int vid)\n \tstruct vhost_blk_queue *vq;\n \tchar path[PATH_MAX];\n \tuint64_t features;\n-\tpthread_t tid;\n+\trte_thread_t tid;\n \tint i, ret;\n \tbool packed_ring;\n \n@@ -672,7 +672,7 @@ new_device(int vid)\n \t/* start polling vring */\n \tworker_thread_status = WORKER_STATE_START;\n \tfprintf(stdout, \"New Device %s, Device ID %d\\n\", path, vid);\n-\tif (pthread_create(&tid, NULL, &ctrlr_worker, ctrlr) < 0) {\n+\tif (rte_thread_create(&tid, NULL, &ctrlr_worker, ctrlr) < 0) {\n \t\tfprintf(stderr, \"Worker Thread Started Failed\\n\");\n \t\treturn -1;\n \t}\ndiff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c\nindex 287a89a75..839d837f2 100644\n--- a/lib/librte_eal/common/eal_common_options.c\n+++ b/lib/librte_eal/common/eal_common_options.c\n@@ -1843,8 +1843,8 @@ eal_auto_detect_cores(struct rte_config *cfg)\n \tunsigned int removed = 0;\n \trte_cpuset_t affinity_set;\n \n-\tif (pthread_getaffinity_np(pthread_self(), sizeof(rte_cpuset_t),\n-\t\t\t\t&affinity_set))\n+\tif (rte_thread_get_affinity_by_id(rte_thread_self(),\n+\t\t\t\t\tsizeof(rte_cpuset_t),  &affinity_set))\n \t\tCPU_ZERO(&affinity_set);\n \n \tfor (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {\n@@ -1872,8 +1872,8 @@ compute_ctrl_threads_cpuset(struct internal_config *internal_cfg)\n \t}\n \tRTE_CPU_NOT(cpuset, cpuset);\n \n-\tif (pthread_getaffinity_np(pthread_self(), sizeof(rte_cpuset_t),\n-\t\t\t\t&default_set))\n+\tif (rte_thread_get_affinity_by_id(rte_thread_self(),\n+\t\t\t\t\t  sizeof(rte_cpuset_t), &default_set))\n \t\tCPU_ZERO(&default_set);\n \n \tRTE_CPU_AND(cpuset, cpuset, &default_set);\ndiff --git a/lib/librte_eal/common/eal_common_proc.c b/lib/librte_eal/common/eal_common_proc.c\nindex 6d1af3c0e..6eb2bbb3a 100644\n--- a/lib/librte_eal/common/eal_common_proc.c\n+++ b/lib/librte_eal/common/eal_common_proc.c\n@@ -37,7 +37,7 @@\n static int mp_fd = -1;\n static char mp_filter[PATH_MAX];   /* Filter for secondary process sockets */\n static char mp_dir_path[PATH_MAX]; /* The directory path for all mp sockets */\n-static pthread_mutex_t mp_mutex_action = PTHREAD_MUTEX_INITIALIZER;\n+static rte_thread_mutex_t mp_mutex_action = RTE_THREAD_MUTEX_INITIALIZER;\n static char peer_name[PATH_MAX];\n \n struct action_entry {\n@@ -96,10 +96,10 @@ TAILQ_HEAD(pending_request_list, pending_request);\n \n static struct {\n \tstruct pending_request_list requests;\n-\tpthread_mutex_t lock;\n+\trte_thread_mutex_t lock;\n } pending_requests = {\n \t.requests = TAILQ_HEAD_INITIALIZER(pending_requests.requests),\n-\t.lock = PTHREAD_MUTEX_INITIALIZER,\n+\t.lock = RTE_THREAD_MUTEX_INITIALIZER,\n \t/**< used in async requests only */\n };\n \n@@ -222,15 +222,15 @@ rte_mp_action_register(const char *name, rte_mp_t action)\n \tstrlcpy(entry->action_name, name, sizeof(entry->action_name));\n \tentry->action = action;\n \n-\tpthread_mutex_lock(&mp_mutex_action);\n+\trte_thread_mutex_lock(&mp_mutex_action);\n \tif (find_action_entry_by_name(name) != NULL) {\n-\t\tpthread_mutex_unlock(&mp_mutex_action);\n+\t\trte_thread_mutex_unlock(&mp_mutex_action);\n \t\trte_errno = EEXIST;\n \t\tfree(entry);\n \t\treturn -1;\n \t}\n \tTAILQ_INSERT_TAIL(&action_entry_list, entry, next);\n-\tpthread_mutex_unlock(&mp_mutex_action);\n+\trte_thread_mutex_unlock(&mp_mutex_action);\n \treturn 0;\n }\n \n@@ -249,14 +249,14 @@ rte_mp_action_unregister(const char *name)\n \t\treturn;\n \t}\n \n-\tpthread_mutex_lock(&mp_mutex_action);\n+\trte_thread_mutex_lock(&mp_mutex_action);\n \tentry = find_action_entry_by_name(name);\n \tif (entry == NULL) {\n-\t\tpthread_mutex_unlock(&mp_mutex_action);\n+\t\trte_thread_mutex_unlock(&mp_mutex_action);\n \t\treturn;\n \t}\n \tTAILQ_REMOVE(&action_entry_list, entry, next);\n-\tpthread_mutex_unlock(&mp_mutex_action);\n+\trte_thread_mutex_unlock(&mp_mutex_action);\n \tfree(entry);\n }\n \n@@ -328,7 +328,7 @@ process_msg(struct mp_msg_internal *m, struct sockaddr_un *s)\n \tif (m->type == MP_REP || m->type == MP_IGN) {\n \t\tstruct pending_request *req = NULL;\n \n-\t\tpthread_mutex_lock(&pending_requests.lock);\n+\t\trte_thread_mutex_lock(&pending_requests.lock);\n \t\tpending_req = find_pending_request(s->sun_path, msg->name);\n \t\tif (pending_req) {\n \t\t\tmemcpy(pending_req->reply, msg, sizeof(*msg));\n@@ -343,18 +343,18 @@ process_msg(struct mp_msg_internal *m, struct sockaddr_un *s)\n \t\t\t\t\t\tpending_req);\n \t\t} else\n \t\t\tRTE_LOG(ERR, EAL, \"Drop mp reply: %s\\n\", msg->name);\n-\t\tpthread_mutex_unlock(&pending_requests.lock);\n+\t\trte_thread_mutex_unlock(&pending_requests.lock);\n \n \t\tif (req != NULL)\n \t\t\ttrigger_async_action(req);\n \t\treturn;\n \t}\n \n-\tpthread_mutex_lock(&mp_mutex_action);\n+\trte_thread_mutex_lock(&mp_mutex_action);\n \tentry = find_action_entry_by_name(msg->name);\n \tif (entry != NULL)\n \t\taction = entry->action;\n-\tpthread_mutex_unlock(&mp_mutex_action);\n+\trte_thread_mutex_unlock(&mp_mutex_action);\n \n \tif (!action) {\n \t\tif (m->type == MP_REQ && !internal_conf->init_complete) {\n@@ -527,9 +527,9 @@ async_reply_handle(void *arg)\n {\n \tstruct pending_request *req;\n \n-\tpthread_mutex_lock(&pending_requests.lock);\n+\trte_thread_mutex_lock(&pending_requests.lock);\n \treq = async_reply_handle_thread_unsafe(arg);\n-\tpthread_mutex_unlock(&pending_requests.lock);\n+\trte_thread_mutex_unlock(&pending_requests.lock);\n \n \tif (req != NULL)\n \t\ttrigger_async_action(req);\n@@ -587,7 +587,7 @@ rte_mp_channel_init(void)\n {\n \tchar path[PATH_MAX];\n \tint dir_fd;\n-\tpthread_t mp_handle_tid;\n+\trte_thread_t mp_handle_tid;\n \tconst struct internal_config *internal_conf =\n \t\teal_get_internal_configuration();\n \n@@ -999,9 +999,9 @@ rte_mp_request_sync(struct rte_mp_msg *req, struct rte_mp_reply *reply,\n \n \t/* for secondary process, send request to the primary process only */\n \tif (rte_eal_process_type() == RTE_PROC_SECONDARY) {\n-\t\tpthread_mutex_lock(&pending_requests.lock);\n+\t\trte_thread_mutex_lock(&pending_requests.lock);\n \t\tret = mp_request_sync(eal_mp_socket_path(), req, reply, &end);\n-\t\tpthread_mutex_unlock(&pending_requests.lock);\n+\t\trte_thread_mutex_unlock(&pending_requests.lock);\n \t\tgoto end;\n \t}\n \n@@ -1022,7 +1022,7 @@ rte_mp_request_sync(struct rte_mp_msg *req, struct rte_mp_reply *reply,\n \t\tgoto close_end;\n \t}\n \n-\tpthread_mutex_lock(&pending_requests.lock);\n+\trte_thread_mutex_lock(&pending_requests.lock);\n \twhile ((ent = readdir(mp_dir))) {\n \t\tchar path[PATH_MAX];\n \n@@ -1041,7 +1041,7 @@ rte_mp_request_sync(struct rte_mp_msg *req, struct rte_mp_reply *reply,\n \tret = 0;\n \n unlock_end:\n-\tpthread_mutex_unlock(&pending_requests.lock);\n+\trte_thread_mutex_unlock(&pending_requests.lock);\n \t/* unlock the directory */\n \tflock(dir_fd, LOCK_UN);\n \n@@ -1119,7 +1119,7 @@ rte_mp_request_async(struct rte_mp_msg *req, const struct timespec *ts,\n \t * of requests to the queue at once, and some of the replies may arrive\n \t * before we add all of the requests to the queue.\n \t */\n-\tpthread_mutex_lock(&pending_requests.lock);\n+\trte_thread_mutex_lock(&pending_requests.lock);\n \n \t/* we have to ensure that callback gets triggered even if we don't send\n \t * anything, therefore earlier we have allocated a dummy request. fill\n@@ -1142,7 +1142,7 @@ rte_mp_request_async(struct rte_mp_msg *req, const struct timespec *ts,\n \t\t\tdummy_used = true;\n \t\t}\n \n-\t\tpthread_mutex_unlock(&pending_requests.lock);\n+\t\trte_thread_mutex_unlock(&pending_requests.lock);\n \n \t\t/* if we couldn't send anything, clean up */\n \t\tif (ret != 0)\n@@ -1186,7 +1186,7 @@ rte_mp_request_async(struct rte_mp_msg *req, const struct timespec *ts,\n \t}\n \n \t/* finally, unlock the queue */\n-\tpthread_mutex_unlock(&pending_requests.lock);\n+\trte_thread_mutex_unlock(&pending_requests.lock);\n \n \t/* unlock the directory */\n \tflock(dir_fd, LOCK_UN);\n@@ -1202,7 +1202,7 @@ rte_mp_request_async(struct rte_mp_msg *req, const struct timespec *ts,\n closedir_fail:\n \tclosedir(mp_dir);\n unlock_fail:\n-\tpthread_mutex_unlock(&pending_requests.lock);\n+\trte_thread_mutex_unlock(&pending_requests.lock);\n fail:\n \tfree(dummy);\n \tfree(param);\ndiff --git a/lib/librte_eal/common/eal_common_thread.c b/lib/librte_eal/common/eal_common_thread.c\nindex 73a055902..4cd09d230 100644\n--- a/lib/librte_eal/common/eal_common_thread.c\n+++ b/lib/librte_eal/common/eal_common_thread.c\n@@ -6,7 +6,6 @@\n #include <stdlib.h>\n #include <stdint.h>\n #include <unistd.h>\n-#include <pthread.h>\n #include <signal.h>\n #include <sched.h>\n #include <assert.h>\n@@ -86,9 +85,9 @@ thread_update_affinity(rte_cpuset_t *cpusetp)\n int\n rte_thread_set_affinity(rte_cpuset_t *cpusetp)\n {\n-\tif (pthread_setaffinity_np(pthread_self(), sizeof(rte_cpuset_t),\n-\t\t\tcpusetp) != 0) {\n-\t\tRTE_LOG(ERR, EAL, \"pthread_setaffinity_np failed\\n\");\n+\tif (rte_thread_set_affinity_by_id(rte_thread_self(),\n+\t\t\t\t\tsizeof(rte_cpuset_t), cpusetp) != 0) {\n+\t\tRTE_LOG(ERR, EAL, \"rte_thread_set_affinity failed\\n\");\n \t\treturn -1;\n \t}\n \n@@ -169,7 +168,7 @@ __rte_thread_uninit(void)\n struct rte_thread_ctrl_params {\n \tvoid *(*start_routine)(void *);\n \tvoid *arg;\n-\tpthread_barrier_t configured;\n+\trte_thread_barrier_t configured;\n };\n \n static void *ctrl_thread_init(void *arg)\n@@ -184,9 +183,9 @@ static void *ctrl_thread_init(void *arg)\n \n \t__rte_thread_init(rte_lcore_id(), cpuset);\n \n-\tret = pthread_barrier_wait(&params->configured);\n-\tif (ret == PTHREAD_BARRIER_SERIAL_THREAD) {\n-\t\tpthread_barrier_destroy(&params->configured);\n+\tret = rte_thread_barrier_wait(&params->configured);\n+\tif (ret == RTE_THREAD_BARRIER_SERIAL_THREAD) {\n+\t\trte_thread_barrier_destroy(&params->configured);\n \t\tfree(params);\n \t}\n \n@@ -194,8 +193,8 @@ static void *ctrl_thread_init(void *arg)\n }\n \n int\n-rte_ctrl_thread_create(pthread_t *thread, const char *name,\n-\t\tconst pthread_attr_t *attr,\n+rte_ctrl_thread_create(rte_thread_t *thread, const char *name,\n+\t\tconst rte_thread_attr_t *attr,\n \t\tvoid *(*start_routine)(void *), void *arg)\n {\n \tstruct internal_config *internal_conf =\n@@ -211,9 +210,9 @@ rte_ctrl_thread_create(pthread_t *thread, const char *name,\n \tparams->start_routine = start_routine;\n \tparams->arg = arg;\n \n-\tpthread_barrier_init(&params->configured, NULL, 2);\n+\trte_thread_barrier_init(&params->configured, 2);\n \n-\tret = pthread_create(thread, attr, ctrl_thread_init, (void *)params);\n+\tret = rte_thread_create(thread, attr, ctrl_thread_init, params);\n \tif (ret != 0) {\n \t\tfree(params);\n \t\treturn -ret;\n@@ -226,26 +225,26 @@ rte_ctrl_thread_create(pthread_t *thread, const char *name,\n \t\t\t\t\"Cannot set name for ctrl thread\\n\");\n \t}\n \n-\tret = pthread_setaffinity_np(*thread, sizeof(*cpuset), cpuset);\n+\tret = rte_thread_set_affinity_by_id(*thread, sizeof(*cpuset), cpuset);\n \tif (ret)\n \t\tgoto fail;\n \n-\tret = pthread_barrier_wait(&params->configured);\n-\tif (ret == PTHREAD_BARRIER_SERIAL_THREAD) {\n-\t\tpthread_barrier_destroy(&params->configured);\n+\tret = rte_thread_barrier_wait(&params->configured);\n+\tif (ret == RTE_THREAD_BARRIER_SERIAL_THREAD) {\n+\t\trte_thread_barrier_destroy(&params->configured);\n \t\tfree(params);\n \t}\n \n \treturn 0;\n \n fail:\n-\tif (PTHREAD_BARRIER_SERIAL_THREAD ==\n-\t    pthread_barrier_wait(&params->configured)) {\n-\t\tpthread_barrier_destroy(&params->configured);\n+\tif (RTE_THREAD_BARRIER_SERIAL_THREAD ==\n+\t    rte_thread_barrier_wait(&params->configured)) {\n+\t\trte_thread_barrier_destroy(&params->configured);\n \t\tfree(params);\n \t}\n-\tpthread_cancel(*thread);\n-\tpthread_join(*thread, NULL);\n+\trte_thread_cancel(*thread);\n+\trte_thread_join(*thread, NULL);\n \treturn -ret;\n }\n \n@@ -266,7 +265,7 @@ rte_thread_register(void)\n \t\trte_errno = EINVAL;\n \t\treturn -1;\n \t}\n-\tif (pthread_getaffinity_np(pthread_self(), sizeof(cpuset),\n+\tif (rte_thread_get_affinity_by_id(rte_thread_self(), sizeof(cpuset),\n \t\t\t&cpuset) != 0)\n \t\tCPU_ZERO(&cpuset);\n \tlcore_id = eal_lcore_non_eal_allocate();\ndiff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c\nindex 24e27387b..6df4a0127 100644\n--- a/lib/librte_eal/common/eal_common_trace.c\n+++ b/lib/librte_eal/common/eal_common_trace.c\n@@ -359,7 +359,7 @@ __rte_trace_mem_per_thread_alloc(void)\n \t/* Store the thread name */\n \tchar *name = header->stream_header.thread_name;\n \tmemset(name, 0, __RTE_TRACE_EMIT_STRING_LEN_MAX);\n-\trte_thread_getname(pthread_self(), name,\n+\trte_thread_getname(rte_thread_self(), name,\n \t\t__RTE_TRACE_EMIT_STRING_LEN_MAX);\n \n \ttrace->lcore_meta[count].mem = header;\ndiff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h\nindex b8a0d2002..d5a6abe9a 100644\n--- a/lib/librte_eal/common/eal_private.h\n+++ b/lib/librte_eal/common/eal_private.h\n@@ -19,7 +19,7 @@\n  * Structure storing internal configuration (per-lcore)\n  */\n struct lcore_config {\n-\tpthread_t thread_id;       /**< pthread identifier */\n+\trte_thread_t thread_id;       /**< pthread identifier */\n \tint pipe_main2worker[2];   /**< communication pipe with main */\n \tint pipe_worker2main[2];   /**< communication pipe with main */\n \ndiff --git a/lib/librte_eal/common/malloc_mp.c b/lib/librte_eal/common/malloc_mp.c\nindex c7101b32d..fdc3a2cfe 100644\n--- a/lib/librte_eal/common/malloc_mp.c\n+++ b/lib/librte_eal/common/malloc_mp.c\n@@ -75,10 +75,10 @@ struct mp_request {\n TAILQ_HEAD(mp_request_list, mp_request);\n static struct {\n \tstruct mp_request_list list;\n-\tpthread_mutex_t lock;\n+\trte_thread_mutex_t lock;\n } mp_request_list = {\n \t.list = TAILQ_HEAD_INITIALIZER(mp_request_list.list),\n-\t.lock = PTHREAD_MUTEX_INITIALIZER\n+\t.lock = RTE_THREAD_MUTEX_INITIALIZER\n };\n \n /**\n@@ -303,7 +303,7 @@ handle_request(const struct rte_mp_msg *msg, const void *peer __rte_unused)\n \tint ret;\n \n \t/* lock access to request */\n-\tpthread_mutex_lock(&mp_request_list.lock);\n+\trte_thread_mutex_lock(&mp_request_list.lock);\n \n \t/* make sure it's not a dupe */\n \tentry = find_request_by_id(m->id);\n@@ -389,10 +389,10 @@ handle_request(const struct rte_mp_msg *msg, const void *peer __rte_unused)\n \n \t\tTAILQ_INSERT_TAIL(&mp_request_list.list, entry, next);\n \t}\n-\tpthread_mutex_unlock(&mp_request_list.lock);\n+\trte_thread_mutex_unlock(&mp_request_list.lock);\n \treturn 0;\n fail:\n-\tpthread_mutex_unlock(&mp_request_list.lock);\n+\trte_thread_mutex_unlock(&mp_request_list.lock);\n \tfree(entry);\n \treturn -1;\n }\n@@ -411,7 +411,7 @@ handle_sync_response(const struct rte_mp_msg *request,\n \tint i;\n \n \t/* lock the request */\n-\tpthread_mutex_lock(&mp_request_list.lock);\n+\trte_thread_mutex_lock(&mp_request_list.lock);\n \n \tentry = find_request_by_id(mpreq->id);\n \tif (entry == NULL) {\n@@ -541,10 +541,10 @@ handle_sync_response(const struct rte_mp_msg *request,\n \t\tgoto fail;\n \t}\n \n-\tpthread_mutex_unlock(&mp_request_list.lock);\n+\trte_thread_mutex_unlock(&mp_request_list.lock);\n \treturn 0;\n fail:\n-\tpthread_mutex_unlock(&mp_request_list.lock);\n+\trte_thread_mutex_unlock(&mp_request_list.lock);\n \treturn -1;\n }\n \n@@ -559,7 +559,7 @@ handle_rollback_response(const struct rte_mp_msg *request,\n \tstruct mp_request *entry;\n \n \t/* lock the request */\n-\tpthread_mutex_lock(&mp_request_list.lock);\n+\trte_thread_mutex_lock(&mp_request_list.lock);\n \n \tmemset(&msg, 0, sizeof(msg));\n \n@@ -590,10 +590,10 @@ handle_rollback_response(const struct rte_mp_msg *request,\n \tfree(entry->alloc_state.ms);\n \tfree(entry);\n \n-\tpthread_mutex_unlock(&mp_request_list.lock);\n+\trte_thread_mutex_unlock(&mp_request_list.lock);\n \treturn 0;\n fail:\n-\tpthread_mutex_unlock(&mp_request_list.lock);\n+\trte_thread_mutex_unlock(&mp_request_list.lock);\n \treturn -1;\n }\n \n@@ -605,7 +605,7 @@ handle_response(const struct rte_mp_msg *msg, const void *peer  __rte_unused)\n \t\t\t(const struct malloc_mp_req *)msg->param;\n \tstruct mp_request *entry;\n \n-\tpthread_mutex_lock(&mp_request_list.lock);\n+\trte_thread_mutex_lock(&mp_request_list.lock);\n \n \tentry = find_request_by_id(m->id);\n \tif (entry != NULL) {\n@@ -618,7 +618,7 @@ handle_response(const struct rte_mp_msg *msg, const void *peer  __rte_unused)\n \t\tpthread_cond_signal(&entry->cond);\n \t}\n \n-\tpthread_mutex_unlock(&mp_request_list.lock);\n+\trte_thread_mutex_unlock(&mp_request_list.lock);\n \n \treturn 0;\n }\n@@ -708,7 +708,7 @@ request_to_primary(struct malloc_mp_req *user_req)\n \tmemset(&msg, 0, sizeof(msg));\n \tmemset(&ts, 0, sizeof(ts));\n \n-\tpthread_mutex_lock(&mp_request_list.lock);\n+\trte_thread_mutex_lock(&mp_request_list.lock);\n \n \tentry = malloc(sizeof(*entry));\n \tif (entry == NULL) {\n@@ -769,10 +769,10 @@ request_to_primary(struct malloc_mp_req *user_req)\n \tTAILQ_REMOVE(&mp_request_list.list, entry, next);\n \tfree(entry);\n \n-\tpthread_mutex_unlock(&mp_request_list.lock);\n+\trte_thread_mutex_unlock(&mp_request_list.lock);\n \treturn ret;\n fail:\n-\tpthread_mutex_unlock(&mp_request_list.lock);\n+\trte_thread_mutex_unlock(&mp_request_list.lock);\n \tfree(entry);\n \treturn -1;\n }\ndiff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build\nindex 70bd854fe..4cd4e8e70 100644\n--- a/lib/librte_eal/common/meson.build\n+++ b/lib/librte_eal/common/meson.build\n@@ -80,6 +80,7 @@ sources += files(\n \t'rte_random.c',\n \t'rte_reciprocal.c',\n \t'rte_service.c',\n+\t'rte_thread.c',\n \t'rte_version.c',\n )\n \ndiff --git a/lib/librte_eal/freebsd/eal.c b/lib/librte_eal/freebsd/eal.c\nindex 32442e5ba..0960dc90e 100644\n--- a/lib/librte_eal/freebsd/eal.c\n+++ b/lib/librte_eal/freebsd/eal.c\n@@ -663,7 +663,7 @@ int\n rte_eal_init(int argc, char **argv)\n {\n \tint i, fctret, ret;\n-\tpthread_t thread_id;\n+\trte_thread_t thread_id;\n \tstatic uint32_t run_once;\n \tuint32_t has_run = 0;\n \tchar cpuset[RTE_CPU_AFFINITY_STR_LEN];\n@@ -686,7 +686,7 @@ rte_eal_init(int argc, char **argv)\n \t\treturn -1;\n \t}\n \n-\tthread_id = pthread_self();\n+\tthread_id = rte_thread_self();\n \n \teal_reset_internal_config(internal_conf);\n \n@@ -850,7 +850,15 @@ rte_eal_init(int argc, char **argv)\n \n \teal_check_mem_on_local_socket();\n \n-\tif (pthread_setaffinity_np(pthread_self(), sizeof(rte_cpuset_t),\n+\tret = rte_thread_set_priority(rte_thread_self(),\n+\t\t\t\t      internal_conf->thread_priority);\n+\tif (ret != 0) {\n+\t\trte_eal_init_alert(\"Cannot set thread priority\");\n+\t\trte_errno = ret;\n+\t\treturn -1;\n+\t}\n+\tif (rte_thread_set_affinity_by_id(rte_thread_self(),\n+\t\t\tsizeof(rte_cpuset_t),\n \t\t\t&lcore_config[config->main_lcore].cpuset) != 0) {\n \t\trte_eal_init_alert(\"Cannot set affinity\");\n \t\trte_errno = EINVAL;\n@@ -865,6 +873,21 @@ rte_eal_init(int argc, char **argv)\n \t\tconfig->main_lcore, thread_id, cpuset,\n \t\tret == 0 ? \"\" : \"...\");\n \n+\trte_thread_attr_t thread_attr;\n+\tret = rte_thread_attr_init(&thread_attr);\n+\tif (ret != 0) {\n+\t\trte_eal_init_alert(\"Cannot initialize thread attributes\");\n+\t\trte_errno = ret;\n+\t\treturn -1;\n+\t}\n+\tret = rte_thread_attr_set_priority(&thread_attr,\n+\t\t\t\t\t   internal_conf->thread_priority);\n+\tif (ret != 0) {\n+\t\trte_eal_init_alert(\"Cannot set thread priority attribute\");\n+\t\trte_errno = ret;\n+\t\treturn -1;\n+\t}\n+\n \tRTE_LCORE_FOREACH_WORKER(i) {\n \n \t\t/*\n@@ -878,8 +901,10 @@ rte_eal_init(int argc, char **argv)\n \n \t\tlcore_config[i].state = WAIT;\n \n+\t\trte_thread_attr_set_affinity(&thread_attr,\n+\t\t\t\t\t     &lcore_config[i].cpuset);\n \t\t/* create a thread for each lcore */\n-\t\tret = pthread_create(&lcore_config[i].thread_id, NULL,\n+\t\tret = rte_thread_create(&lcore_config[i].thread_id, &thread_attr,\n \t\t\t\t     eal_thread_loop, NULL);\n \t\tif (ret != 0)\n \t\t\trte_panic(\"Cannot create thread\\n\");\n@@ -889,10 +914,6 @@ rte_eal_init(int argc, char **argv)\n \t\t\t\t\"lcore-worker-%d\", i);\n \t\trte_thread_setname(lcore_config[i].thread_id, thread_name);\n \n-\t\tret = pthread_setaffinity_np(lcore_config[i].thread_id,\n-\t\t\tsizeof(rte_cpuset_t), &lcore_config[i].cpuset);\n-\t\tif (ret != 0)\n-\t\t\trte_panic(\"Cannot set affinity\\n\");\n \t}\n \n \t/*\ndiff --git a/lib/librte_eal/freebsd/eal_alarm.c b/lib/librte_eal/freebsd/eal_alarm.c\nindex c38b2e04f..e5d7b130b 100644\n--- a/lib/librte_eal/freebsd/eal_alarm.c\n+++ b/lib/librte_eal/freebsd/eal_alarm.c\n@@ -37,7 +37,7 @@ struct alarm_entry {\n \trte_eal_alarm_callback cb_fn;\n \tvoid *cb_arg;\n \tvolatile uint8_t executing;\n-\tvolatile pthread_t executing_id;\n+\tvolatile rte_thread_t executing_id;\n };\n \n static LIST_HEAD(alarm_list, alarm_entry) alarm_list = LIST_HEAD_INITIALIZER();\n@@ -156,7 +156,7 @@ eal_alarm_callback(void *arg __rte_unused)\n \n \twhile (ap != NULL && timespec_cmp(&now, &ap->time) >= 0) {\n \t\tap->executing = 1;\n-\t\tap->executing_id = pthread_self();\n+\t\tap->executing_id = rte_thread_self();\n \t\trte_spinlock_unlock(&alarm_list_lk);\n \n \t\tap->cb_fn(ap->cb_arg);\n@@ -263,8 +263,8 @@ rte_eal_alarm_cancel(rte_eal_alarm_callback cb_fn, void *cb_arg)\n \t\t\t\t * finish. Otherwise we are trying to cancel\n \t\t\t\t * ourselves - mark it by EINPROGRESS.\n \t\t\t\t */\n-\t\t\t\tif (pthread_equal(ap->executing_id,\n-\t\t\t\t\t\tpthread_self()) == 0)\n+\t\t\t\tif (rte_thread_equal(ap->executing_id,\n+\t\t\t\t\t\trte_thread_self()) == 0)\n \t\t\t\t\texecuting++;\n \t\t\t\telse\n \t\t\t\t\terr = EINPROGRESS;\n@@ -285,8 +285,8 @@ rte_eal_alarm_cancel(rte_eal_alarm_callback cb_fn, void *cb_arg)\n \t\t\t\t\tfree(ap);\n \t\t\t\t\tcount++;\n \t\t\t\t\tap = ap_prev;\n-\t\t\t\t} else if (pthread_equal(ap->executing_id,\n-\t\t\t\t\t\t\t pthread_self()) == 0) {\n+\t\t\t\t} else if (rte_thread_equal(ap->executing_id,\n+\t\t\t\t\t\trte_thread_self()) == 0) {\n \t\t\t\t\texecuting++;\n \t\t\t\t} else {\n \t\t\t\t\terr = EINPROGRESS;\ndiff --git a/lib/librte_eal/freebsd/eal_interrupts.c b/lib/librte_eal/freebsd/eal_interrupts.c\nindex 72eeacbc1..de5d2b733 100644\n--- a/lib/librte_eal/freebsd/eal_interrupts.c\n+++ b/lib/librte_eal/freebsd/eal_interrupts.c\n@@ -52,7 +52,7 @@ static rte_spinlock_t intr_lock = RTE_SPINLOCK_INITIALIZER;\n static struct rte_intr_source_list intr_sources;\n \n /* interrupt handling thread */\n-static pthread_t intr_thread;\n+static rte_thread_t intr_thread;\n \n static volatile int kq = -1;\n \n@@ -725,5 +725,5 @@ rte_intr_free_epoll_fd(struct rte_intr_handle *intr_handle)\n \n int rte_thread_is_intr(void)\n {\n-\treturn pthread_equal(intr_thread, pthread_self());\n+\treturn rte_thread_equal(intr_thread, rte_thread_self());\n }\ndiff --git a/lib/librte_eal/freebsd/eal_thread.c b/lib/librte_eal/freebsd/eal_thread.c\nindex 1dce9b04f..082a66917 100644\n--- a/lib/librte_eal/freebsd/eal_thread.c\n+++ b/lib/librte_eal/freebsd/eal_thread.c\n@@ -73,11 +73,11 @@ eal_thread_loop(__rte_unused void *arg)\n \tchar c;\n \tint n, ret;\n \tunsigned lcore_id;\n-\tpthread_t thread_id;\n+\trte_thread_t thread_id;\n \tint m2w, w2m;\n \tchar cpuset[RTE_CPU_AFFINITY_STR_LEN];\n \n-\tthread_id = pthread_self();\n+\tthread_id = rte_thread_self();\n \n \t/* retrieve our lcore_id from the configuration structure */\n \tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n@@ -143,14 +143,14 @@ int rte_sys_gettid(void)\n \treturn (int)lwpid;\n }\n \n-int rte_thread_setname(pthread_t id, const char *name)\n+int rte_thread_setname(rte_thread_t id, const char *name)\n {\n \t/* this BSD function returns no error */\n \tpthread_set_name_np(id, name);\n \treturn 0;\n }\n \n-int rte_thread_getname(pthread_t id, char *name, size_t len)\n+int rte_thread_getname(rte_thread_t id, char *name, size_t len)\n {\n \tRTE_SET_USED(id);\n \tRTE_SET_USED(name);\ndiff --git a/lib/librte_eal/include/meson.build b/lib/librte_eal/include/meson.build\nindex 3969cf4ac..0b6feb377 100644\n--- a/lib/librte_eal/include/meson.build\n+++ b/lib/librte_eal/include/meson.build\n@@ -40,6 +40,7 @@ headers += files(\n \t'rte_string_fns.h',\n \t'rte_tailq.h',\n \t'rte_thread.h',\n+\t'rte_thread_types.h',\n \t'rte_time.h',\n \t'rte_trace.h',\n \t'rte_trace_point.h',\ndiff --git a/lib/librte_eal/include/rte_lcore.h b/lib/librte_eal/include/rte_lcore.h\nindex 1550b75da..d5e004105 100644\n--- a/lib/librte_eal/include/rte_lcore.h\n+++ b/lib/librte_eal/include/rte_lcore.h\n@@ -374,7 +374,7 @@ rte_lcore_dump(FILE *f);\n  * @return\n  *   On success, return 0; otherwise return a negative value.\n  */\n-int rte_thread_setname(pthread_t id, const char *name);\n+int rte_thread_setname(rte_thread_t id, const char *name);\n \n /**\n  * Get thread name.\n@@ -391,7 +391,7 @@ int rte_thread_setname(pthread_t id, const char *name);\n  *   On success, return 0; otherwise return a negative value.\n  */\n __rte_experimental\n-int rte_thread_getname(pthread_t id, char *name, size_t len);\n+int rte_thread_getname(rte_thread_t id, char *name, size_t len);\n \n /**\n  * Register current non-EAL thread as a lcore.\n@@ -440,8 +440,8 @@ rte_thread_unregister(void);\n  *   corresponding to the error number.\n  */\n int\n-rte_ctrl_thread_create(pthread_t *thread, const char *name,\n-\t\tconst pthread_attr_t *attr,\n+rte_ctrl_thread_create(rte_thread_t *thread, const char *name,\n+\t\tconst rte_thread_attr_t *attr,\n \t\tvoid *(*start_routine)(void *), void *arg);\n \n #ifdef __cplusplus\ndiff --git a/lib/librte_eal/include/rte_per_lcore.h b/lib/librte_eal/include/rte_per_lcore.h\nindex eaedf0cb3..025d97f96 100644\n--- a/lib/librte_eal/include/rte_per_lcore.h\n+++ b/lib/librte_eal/include/rte_per_lcore.h\n@@ -22,8 +22,6 @@\n extern \"C\" {\n #endif\n \n-#include <pthread.h>\n-\n /**\n  * Macro to define a per lcore variable \"var\" of type \"type\", don't\n  * use keywords like \"static\" or \"volatile\" in type, just prefix the\ndiff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c\nindex abbb53774..76f2daa26 100644\n--- a/lib/librte_eal/linux/eal.c\n+++ b/lib/librte_eal/linux/eal.c\n@@ -958,7 +958,7 @@ int\n rte_eal_init(int argc, char **argv)\n {\n \tint i, fctret, ret;\n-\tpthread_t thread_id;\n+\trte_thread_t thread_id;\n \tstatic uint32_t run_once;\n \tuint32_t has_run = 0;\n \tconst char *p;\n@@ -986,7 +986,7 @@ rte_eal_init(int argc, char **argv)\n \n \tp = strrchr(argv[0], '/');\n \tstrlcpy(logid, p ? p + 1 : argv[0], sizeof(logid));\n-\tthread_id = pthread_self();\n+\tthread_id = rte_thread_self();\n \n \teal_reset_internal_config(internal_conf);\n \n@@ -1214,7 +1214,15 @@ rte_eal_init(int argc, char **argv)\n \n \teal_check_mem_on_local_socket();\n \n-\tif (pthread_setaffinity_np(pthread_self(), sizeof(rte_cpuset_t),\n+\tret = rte_thread_set_priority(rte_thread_self(),\n+\t\t\t\t      internal_conf->thread_priority);\n+\tif (ret != 0) {\n+\t\trte_eal_init_alert(\"Cannot set thread priority\");\n+\t\trte_errno = ret;\n+\t\treturn -1;\n+\t}\n+\tif (rte_thread_set_affinity_by_id(rte_thread_self(),\n+\t\t\tsizeof(rte_cpuset_t),\n \t\t\t&lcore_config[config->main_lcore].cpuset) != 0) {\n \t\trte_eal_init_alert(\"Cannot set affinity\");\n \t\trte_errno = EINVAL;\n@@ -1228,6 +1236,23 @@ rte_eal_init(int argc, char **argv)\n \t\tconfig->main_lcore, (uintptr_t)thread_id, cpuset,\n \t\tret == 0 ? \"\" : \"...\");\n \n+\trte_thread_attr_t thread_attr;\n+\tret = rte_thread_attr_init(&thread_attr);\n+\tif (ret != 0) {\n+\t\tRTE_LOG(DEBUG, EAL, \"Cannot initialize thread attributes,\"\n+\t\t\t\"ret = %d\\n\", ret);\n+\t\trte_errno = ret;\n+\t\treturn -1;\n+\t}\n+\tret = rte_thread_attr_set_priority(&thread_attr,\n+\t\t\t\t\t   internal_conf->thread_priority);\n+\tif (ret != 0) {\n+\t\tRTE_LOG(DEBUG, EAL, \"Cannot set thread priority attribute,\"\n+\t\t\t\"ret = %d\\n\", ret);\n+\t\trte_errno = ret;\n+\t\treturn -1;\n+\t}\n+\n \tRTE_LCORE_FOREACH_WORKER(i) {\n \n \t\t/*\n@@ -1241,9 +1266,11 @@ rte_eal_init(int argc, char **argv)\n \n \t\tlcore_config[i].state = WAIT;\n \n+\t\trte_thread_attr_set_affinity(&thread_attr,\n+\t\t\t\t\t     &lcore_config[i].cpuset);\n \t\t/* create a thread for each lcore */\n-\t\tret = pthread_create(&lcore_config[i].thread_id, NULL,\n-\t\t\t\t     eal_thread_loop, NULL);\n+\t\tret = rte_thread_create(&lcore_config[i].thread_id,\n+\t\t\t\t\t&thread_attr, eal_thread_loop, NULL);\n \t\tif (ret != 0)\n \t\t\trte_panic(\"Cannot create thread\\n\");\n \n@@ -1255,11 +1282,6 @@ rte_eal_init(int argc, char **argv)\n \t\tif (ret != 0)\n \t\t\tRTE_LOG(DEBUG, EAL,\n \t\t\t\t\"Cannot set name for lcore thread\\n\");\n-\n-\t\tret = pthread_setaffinity_np(lcore_config[i].thread_id,\n-\t\t\tsizeof(rte_cpuset_t), &lcore_config[i].cpuset);\n-\t\tif (ret != 0)\n-\t\t\trte_panic(\"Cannot set affinity\\n\");\n \t}\n \n \t/*\ndiff --git a/lib/librte_eal/linux/eal_alarm.c b/lib/librte_eal/linux/eal_alarm.c\nindex 3252c6fa5..fef22a347 100644\n--- a/lib/librte_eal/linux/eal_alarm.c\n+++ b/lib/librte_eal/linux/eal_alarm.c\n@@ -48,7 +48,7 @@ struct alarm_entry {\n \trte_eal_alarm_callback cb_fn;\n \tvoid *cb_arg;\n \tvolatile uint8_t executing;\n-\tvolatile pthread_t executing_id;\n+\tvolatile rte_thread_t executing_id;\n };\n \n static LIST_HEAD(alarm_list, alarm_entry) alarm_list = LIST_HEAD_INITIALIZER();\n@@ -86,7 +86,7 @@ eal_alarm_callback(void *arg __rte_unused)\n \t\t\t(ap->time.tv_sec < now.tv_sec || (ap->time.tv_sec == now.tv_sec &&\n \t\t\t\t\t\t(ap->time.tv_usec * NS_PER_US) <= now.tv_nsec))) {\n \t\tap->executing = 1;\n-\t\tap->executing_id = pthread_self();\n+\t\tap->executing_id = rte_thread_self();\n \t\trte_spinlock_unlock(&alarm_list_lk);\n \n \t\tap->cb_fn(ap->cb_arg);\n@@ -207,7 +207,8 @@ rte_eal_alarm_cancel(rte_eal_alarm_callback cb_fn, void *cb_arg)\n \t\t\t\t/* If calling from other context, mark that alarm is executing\n \t\t\t\t * so loop can spin till it finish. Otherwise we are trying to\n \t\t\t\t * cancel our self - mark it by EINPROGRESS */\n-\t\t\t\tif (pthread_equal(ap->executing_id, pthread_self()) == 0)\n+\t\t\t\tif (rte_thread_equal(ap->executing_id,\n+\t\t\t\t\t\trte_thread_self()) == 0)\n \t\t\t\t\texecuting++;\n \t\t\t\telse\n \t\t\t\t\terr = EINPROGRESS;\n@@ -228,7 +229,8 @@ rte_eal_alarm_cancel(rte_eal_alarm_callback cb_fn, void *cb_arg)\n \t\t\t\t\tfree(ap);\n \t\t\t\t\tcount++;\n \t\t\t\t\tap = ap_prev;\n-\t\t\t\t} else if (pthread_equal(ap->executing_id, pthread_self()) == 0)\n+\t\t\t\t} else if (rte_thread_equal(ap->executing_id,\n+\t\t\t\t\t\trte_thread_self()) == 0)\n \t\t\t\t\texecuting++;\n \t\t\t\telse\n \t\t\t\t\terr = EINPROGRESS;\ndiff --git a/lib/librte_eal/linux/eal_interrupts.c b/lib/librte_eal/linux/eal_interrupts.c\nindex 1dd994bd1..bc38055b8 100644\n--- a/lib/librte_eal/linux/eal_interrupts.c\n+++ b/lib/librte_eal/linux/eal_interrupts.c\n@@ -97,7 +97,7 @@ static union intr_pipefds intr_pipe;\n static struct rte_intr_source_list intr_sources;\n \n /* interrupt handling thread */\n-static pthread_t intr_thread;\n+static rte_thread_t intr_thread;\n \n /* VFIO interrupts */\n #ifdef VFIO_PRESENT\n@@ -1558,5 +1558,5 @@ rte_intr_cap_multiple(struct rte_intr_handle *intr_handle)\n \n int rte_thread_is_intr(void)\n {\n-\treturn pthread_equal(intr_thread, pthread_self());\n+\treturn rte_thread_equal(intr_thread, rte_thread_self());\n }\ndiff --git a/lib/librte_eal/linux/eal_thread.c b/lib/librte_eal/linux/eal_thread.c\nindex 83c2034b9..bd447d6a2 100644\n--- a/lib/librte_eal/linux/eal_thread.c\n+++ b/lib/librte_eal/linux/eal_thread.c\n@@ -73,11 +73,11 @@ eal_thread_loop(__rte_unused void *arg)\n \tchar c;\n \tint n, ret;\n \tunsigned lcore_id;\n-\tpthread_t thread_id;\n+\trte_thread_t thread_id;\n \tint m2w, w2m;\n \tchar cpuset[RTE_CPU_AFFINITY_STR_LEN];\n \n-\tthread_id = pthread_self();\n+\tthread_id = rte_thread_self();\n \n \t/* retrieve our lcore_id from the configuration structure */\n \tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n@@ -148,7 +148,7 @@ int rte_sys_gettid(void)\n \treturn (int)syscall(SYS_gettid);\n }\n \n-int rte_thread_setname(pthread_t id, const char *name)\n+int rte_thread_setname(rte_thread_t id, const char *name)\n {\n \tint ret = ENOSYS;\n #if defined(__GLIBC__) && defined(__GLIBC_PREREQ)\n@@ -164,7 +164,7 @@ int rte_thread_setname(pthread_t id, const char *name)\n \treturn -ret;\n }\n \n-int rte_thread_getname(pthread_t id, char *name, size_t len)\n+int rte_thread_getname(rte_thread_t id, char *name, size_t len)\n {\n \tint ret = ENOSYS;\n #if defined(__GLIBC__) && defined(__GLIBC_PREREQ)\ndiff --git a/lib/librte_eal/linux/eal_timer.c b/lib/librte_eal/linux/eal_timer.c\nindex 7cf15caba..b4099a0aa 100644\n--- a/lib/librte_eal/linux/eal_timer.c\n+++ b/lib/librte_eal/linux/eal_timer.c\n@@ -80,7 +80,7 @@ static uint64_t eal_hpet_resolution_hz = 0;\n /* Incremented 4 times during one 32bits hpet full count */\n static uint32_t eal_hpet_msb;\n \n-static pthread_t msb_inc_thread_id;\n+static rte_thread_t msb_inc_thread_id;\n \n /*\n  * This function runs on a specific thread to update a global variable\ndiff --git a/lib/librte_eal/rte_eal_exports.def b/lib/librte_eal/rte_eal_exports.def\nindex c32007754..00752701f 100644\n--- a/lib/librte_eal/rte_eal_exports.def\n+++ b/lib/librte_eal/rte_eal_exports.def\n@@ -330,6 +330,26 @@ EXPORTS\n \trte_thread_value_get\n \trte_thread_value_set\n \n+\trte_thread_mutex_lock\n+\trte_thread_mutex_unlock\n+\trte_thread_mutex_init\n+\trte_thread_mutex_destroy\n+\trte_thread_create\n+\trte_thread_set_affinity_by_id\n+\trte_thread_get_affinity_by_id\n+\trte_thread_set_priority\n+\trte_thread_attr_init\n+\trte_thread_attr_set_affinity\n+\trte_thread_attr_get_affinity\n+\trte_thread_attr_set_priority\n+\trte_thread_join\n+\trte_thread_self\n+\trte_thread_equal\n+\trte_thread_barrier_init\n+\trte_thread_barrier_wait\n+\trte_thread_barrier_destroy\n+\trte_thread_cancel\n+\n \trte_mem_lock\n \trte_mem_map\n \trte_mem_page_size\ndiff --git a/lib/librte_eal/unix/meson.build b/lib/librte_eal/unix/meson.build\nindex 71221b84a..d3af6b6fe 100644\n--- a/lib/librte_eal/unix/meson.build\n+++ b/lib/librte_eal/unix/meson.build\n@@ -5,5 +5,4 @@ sources += files(\n \t'eal_file.c',\n \t'eal_unix_memory.c',\n \t'eal_unix_timer.c',\n-\t'rte_thread.c',\n )\ndiff --git a/lib/librte_eal/unix/rte_thread.c b/lib/librte_eal/unix/rte_thread.c\ndeleted file mode 100644\nindex c72d619ec..000000000\n--- a/lib/librte_eal/unix/rte_thread.c\n+++ /dev/null\n@@ -1,92 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright 2021 Mellanox Technologies, Ltd\n- */\n-\n-#include <errno.h>\n-#include <pthread.h>\n-#include <stdlib.h>\n-#include <string.h>\n-\n-#include <rte_common.h>\n-#include <rte_errno.h>\n-#include <rte_log.h>\n-#include <rte_thread.h>\n-\n-struct eal_tls_key {\n-\tpthread_key_t thread_index;\n-};\n-\n-int\n-rte_thread_key_create(rte_thread_key *key, void (*destructor)(void *))\n-{\n-\tint err;\n-\n-\t*key = malloc(sizeof(**key));\n-\tif ((*key) == NULL) {\n-\t\tRTE_LOG(DEBUG, EAL, \"Cannot allocate TLS key.\\n\");\n-\t\trte_errno = ENOMEM;\n-\t\treturn -1;\n-\t}\n-\terr = pthread_key_create(&((*key)->thread_index), destructor);\n-\tif (err) {\n-\t\tRTE_LOG(DEBUG, EAL, \"pthread_key_create failed: %s\\n\",\n-\t\t\t strerror(err));\n-\t\tfree(*key);\n-\t\trte_errno = ENOEXEC;\n-\t\treturn -1;\n-\t}\n-\treturn 0;\n-}\n-\n-int\n-rte_thread_key_delete(rte_thread_key key)\n-{\n-\tint err;\n-\n-\tif (!key) {\n-\t\tRTE_LOG(DEBUG, EAL, \"Invalid TLS key.\\n\");\n-\t\trte_errno = EINVAL;\n-\t\treturn -1;\n-\t}\n-\terr = pthread_key_delete(key->thread_index);\n-\tif (err) {\n-\t\tRTE_LOG(DEBUG, EAL, \"pthread_key_delete failed: %s\\n\",\n-\t\t\t strerror(err));\n-\t\tfree(key);\n-\t\trte_errno = ENOEXEC;\n-\t\treturn -1;\n-\t}\n-\tfree(key);\n-\treturn 0;\n-}\n-\n-int\n-rte_thread_value_set(rte_thread_key key, const void *value)\n-{\n-\tint err;\n-\n-\tif (!key) {\n-\t\tRTE_LOG(DEBUG, EAL, \"Invalid TLS key.\\n\");\n-\t\trte_errno = EINVAL;\n-\t\treturn -1;\n-\t}\n-\terr = pthread_setspecific(key->thread_index, value);\n-\tif (err) {\n-\t\tRTE_LOG(DEBUG, EAL, \"pthread_setspecific failed: %s\\n\",\n-\t\t\tstrerror(err));\n-\t\trte_errno = ENOEXEC;\n-\t\treturn -1;\n-\t}\n-\treturn 0;\n-}\n-\n-void *\n-rte_thread_value_get(rte_thread_key key)\n-{\n-\tif (!key) {\n-\t\tRTE_LOG(DEBUG, EAL, \"Invalid TLS key.\\n\");\n-\t\trte_errno = EINVAL;\n-\t\treturn NULL;\n-\t}\n-\treturn pthread_getspecific(key->thread_index);\n-}\ndiff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map\nindex e23745ae6..b562ee98d 100644\n--- a/lib/librte_eal/version.map\n+++ b/lib/librte_eal/version.map\n@@ -421,6 +421,27 @@ EXPERIMENTAL {\n \trte_version_release;\n \trte_version_suffix;\n \trte_version_year;\n+\n+\trte_thread_mutex_lock;\n+\trte_thread_mutex_unlock;\n+\trte_thread_mutex_init;\n+\trte_thread_mutex_destroy;\n+\trte_thread_create;\n+\trte_thread_set_affinity_by_id;\n+\trte_thread_get_affinity_by_id;\n+\trte_thread_set_priority;\n+\trte_thread_attr_init;\n+\trte_thread_attr_set_affinity;\n+\trte_thread_attr_get_affinity;\n+\trte_thread_join;\n+\trte_thread_self;\n+\trte_thread_equal;\n+\trte_thread_barrier_init;\n+\trte_thread_barrier_wait;\n+\trte_thread_barrier_destroy;\n+\trte_thread_cancel;\n+\trte_thread_attr_set_priority;\n+\n };\n \n INTERNAL {\ndiff --git a/lib/librte_eal/windows/eal.c b/lib/librte_eal/windows/eal.c\nindex 2fc3d6141..faaf00972 100644\n--- a/lib/librte_eal/windows/eal.c\n+++ b/lib/librte_eal/windows/eal.c\n@@ -368,6 +368,28 @@ rte_eal_init(int argc, char **argv)\n \t\treturn -1;\n \t}\n \n+\tret = rte_thread_set_priority(rte_thread_self(),\n+\t\t\t\t      internal_conf->thread_priority);\n+\tif (ret != 0) {\n+\t\trte_eal_init_alert(\"Cannot set thread priority\");\n+\t\trte_errno = ret;\n+\t\treturn -1;\n+\t}\n+\trte_thread_attr_t thread_attr;\n+\tret = rte_thread_attr_init(&thread_attr);\n+\tif (ret != 0) {\n+\t\trte_eal_init_alert(\"Cannot initialize thread attributes\");\n+\t\trte_errno = ret;\n+\t\treturn -1;\n+\t}\n+\tret = rte_thread_attr_set_priority(&thread_attr,\n+\t\t\t\t\t   internal_conf->thread_priority);\n+\tif (ret != 0) {\n+\t\trte_eal_init_alert(\"Cannot set thread priority attribute\");\n+\t\trte_errno = ret;\n+\t\treturn -1;\n+\t}\n+\n \tRTE_LCORE_FOREACH_WORKER(i) {\n \n \t\t/*\n@@ -384,7 +406,9 @@ rte_eal_init(int argc, char **argv)\n \t\tlcore_config[i].state = WAIT;\n \n \t\t/* create a thread for each lcore */\n-\t\tif (eal_thread_create(&lcore_config[i].thread_id) != 0)\n+\t\tret = rte_thread_create(&lcore_config[i].thread_id,\n+\t\t\t\t\t&thread_attr, eal_thread_loop, NULL);\n+\t\tif (ret != 0)\n \t\t\trte_panic(\"Cannot create thread\\n\");\n \t}\n \ndiff --git a/lib/librte_eal/windows/eal_interrupts.c b/lib/librte_eal/windows/eal_interrupts.c\nindex 3b8266d38..9839a1fed 100644\n--- a/lib/librte_eal/windows/eal_interrupts.c\n+++ b/lib/librte_eal/windows/eal_interrupts.c\n@@ -7,7 +7,7 @@\n #include \"eal_private.h\"\n #include \"eal_windows.h\"\n \n-static pthread_t intr_thread;\n+static rte_thread_t intr_thread;\n \n static HANDLE intr_iocp;\n \n@@ -76,7 +76,7 @@ rte_eal_intr_init(void)\n int\n rte_thread_is_intr(void)\n {\n-\treturn pthread_equal(intr_thread, pthread_self());\n+\treturn rte_thread_equal(intr_thread, rte_thread_self());\n }\n \n int\n@@ -94,7 +94,7 @@ eal_intr_thread_schedule(void (*func)(void *arg), void *arg)\n \n \thandle = OpenThread(THREAD_ALL_ACCESS, FALSE, intr_thread);\n \tif (handle == NULL) {\n-\t\tRTE_LOG_WIN32_ERR(\"OpenThread(%llu)\", intr_thread);\n+\t\tRTE_LOG_WIN32_ERR(\"OpenThread(%lu)\", intr_thread);\n \t\treturn -ENOENT;\n \t}\n \ndiff --git a/lib/librte_eal/windows/eal_thread.c b/lib/librte_eal/windows/eal_thread.c\nindex 9c3f6d69f..5ed495562 100644\n--- a/lib/librte_eal/windows/eal_thread.c\n+++ b/lib/librte_eal/windows/eal_thread.c\n@@ -60,11 +60,11 @@ eal_thread_loop(void *arg __rte_unused)\n \tchar c;\n \tint n, ret;\n \tunsigned int lcore_id;\n-\tpthread_t thread_id;\n+\trte_thread_t thread_id;\n \tint m2w, w2m;\n \tchar cpuset[RTE_CPU_AFFINITY_STR_LEN];\n \n-\tthread_id = pthread_self();\n+\tthread_id = rte_thread_self();\n \n \t/* retrieve our lcore_id from the configuration structure */\n \tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n@@ -122,24 +122,6 @@ eal_thread_loop(void *arg __rte_unused)\n \t}\n }\n \n-/* function to create threads */\n-int\n-eal_thread_create(pthread_t *thread)\n-{\n-\tHANDLE th;\n-\n-\tth = CreateThread(NULL, 0,\n-\t\t(LPTHREAD_START_ROUTINE)(ULONG_PTR)eal_thread_loop,\n-\t\t\t\t\t\tNULL, 0, (LPDWORD)thread);\n-\tif (!th)\n-\t\treturn -1;\n-\n-\tSetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);\n-\tSetThreadPriority(th, THREAD_PRIORITY_NORMAL);\n-\n-\treturn 0;\n-}\n-\n /* get current thread ID */\n int\n rte_sys_gettid(void)\n@@ -148,7 +130,7 @@ rte_sys_gettid(void)\n }\n \n int\n-rte_thread_setname(__rte_unused pthread_t id, __rte_unused const char *name)\n+rte_thread_setname(__rte_unused rte_thread_t id, __rte_unused const char *name)\n {\n \t/* TODO */\n \t/* This is a stub, not the expected result */\ndiff --git a/lib/librte_eal/windows/eal_windows.h b/lib/librte_eal/windows/eal_windows.h\nindex dc5dc8240..4b92b198c 100644\n--- a/lib/librte_eal/windows/eal_windows.h\n+++ b/lib/librte_eal/windows/eal_windows.h\n@@ -35,16 +35,6 @@\n  */\n int eal_create_cpu_map(void);\n \n-/**\n- * Create a thread.\n- *\n- * @param thread\n- *   The location to store the thread id if successful.\n- * @return\n- *   0 for success, -1 if the thread is not created.\n- */\n-int eal_thread_create(pthread_t *thread);\n-\n /**\n  * Get system NUMA node number for a socket ID.\n  *\ndiff --git a/lib/librte_eal/windows/include/meson.build b/lib/librte_eal/windows/include/meson.build\nindex b3534b025..7d9b3393e 100644\n--- a/lib/librte_eal/windows/include/meson.build\n+++ b/lib/librte_eal/windows/include/meson.build\n@@ -7,4 +7,5 @@ headers += files(\n         'rte_os.h',\n         'rte_virt2phys.h',\n         'rte_windows.h',\n+        'rte_windows_thread_types.h',\n )\ndiff --git a/lib/librte_eal/windows/include/pthread.h b/lib/librte_eal/windows/include/pthread.h\ndeleted file mode 100644\nindex 9aeab1fa7..000000000\n--- a/lib/librte_eal/windows/include/pthread.h\n+++ /dev/null\n@@ -1,186 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2019 Intel Corporation\n- */\n-\n-#ifndef _PTHREAD_H_\n-#define _PTHREAD_H_\n-\n-#include <stdint.h>\n-#include <sched.h>\n-\n-/**\n- * This file is required to support the common code in eal_common_proc.c,\n- * eal_common_thread.c and common\\include\\rte_per_lcore.h as Microsoft libc\n- * does not contain pthread.h. This may be removed in future releases.\n- */\n-#ifdef __cplusplus\n-extern \"C\" {\n-#endif\n-\n-#include <rte_common.h>\n-#include <rte_windows.h>\n-\n-#define PTHREAD_BARRIER_SERIAL_THREAD TRUE\n-\n-/* defining pthread_t type on Windows since there is no in Microsoft libc*/\n-typedef uintptr_t pthread_t;\n-\n-/* defining pthread_attr_t type on Windows since there is no in Microsoft libc*/\n-typedef void *pthread_attr_t;\n-\n-typedef void *pthread_mutexattr_t;\n-\n-typedef CRITICAL_SECTION pthread_mutex_t;\n-\n-typedef SYNCHRONIZATION_BARRIER pthread_barrier_t;\n-\n-#define pthread_barrier_init(barrier, attr, count) \\\n-\tInitializeSynchronizationBarrier(barrier, count, -1)\n-#define pthread_barrier_wait(barrier) EnterSynchronizationBarrier(barrier, \\\n-\tSYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY)\n-#define pthread_barrier_destroy(barrier) \\\n-\tDeleteSynchronizationBarrier(barrier)\n-#define pthread_cancel(thread) TerminateThread((HANDLE) thread, 0)\n-\n-/* pthread function overrides */\n-#define pthread_self() \\\n-\t((pthread_t)GetCurrentThreadId())\n-\n-\n-static inline int\n-pthread_equal(pthread_t t1, pthread_t t2)\n-{\n-\treturn t1 == t2;\n-}\n-\n-static inline int\n-pthread_setaffinity_np(pthread_t threadid, size_t cpuset_size,\n-\t\t\trte_cpuset_t *cpuset)\n-{\n-\tDWORD_PTR ret = 0;\n-\tHANDLE thread_handle;\n-\n-\tif (cpuset == NULL || cpuset_size == 0)\n-\t\treturn -1;\n-\n-\tthread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, threadid);\n-\tif (thread_handle == NULL) {\n-\t\tRTE_LOG_WIN32_ERR(\"OpenThread()\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = SetThreadAffinityMask(thread_handle, *cpuset->_bits);\n-\tif (ret == 0) {\n-\t\tRTE_LOG_WIN32_ERR(\"SetThreadAffinityMask()\");\n-\t\tgoto close_handle;\n-\t}\n-\n-close_handle:\n-\tif (CloseHandle(thread_handle) == 0) {\n-\t\tRTE_LOG_WIN32_ERR(\"CloseHandle()\");\n-\t\treturn -1;\n-\t}\n-\treturn (ret == 0) ? -1 : 0;\n-}\n-\n-static inline int\n-pthread_getaffinity_np(pthread_t threadid, size_t cpuset_size,\n-\t\t\trte_cpuset_t *cpuset)\n-{\n-\t/* Workaround for the lack of a GetThreadAffinityMask()\n-\t *API in Windows\n-\t */\n-\tDWORD_PTR prev_affinity_mask;\n-\tHANDLE thread_handle;\n-\tDWORD_PTR ret = 0;\n-\n-\tif (cpuset == NULL || cpuset_size == 0)\n-\t\treturn -1;\n-\n-\tthread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, threadid);\n-\tif (thread_handle == NULL) {\n-\t\tRTE_LOG_WIN32_ERR(\"OpenThread()\");\n-\t\treturn -1;\n-\t}\n-\n-\t/* obtain previous mask by setting dummy mask */\n-\tprev_affinity_mask = SetThreadAffinityMask(thread_handle, 0x1);\n-\tif (prev_affinity_mask == 0) {\n-\t\tRTE_LOG_WIN32_ERR(\"SetThreadAffinityMask()\");\n-\t\tgoto close_handle;\n-\t}\n-\n-\t/* set it back! */\n-\tret = SetThreadAffinityMask(thread_handle, prev_affinity_mask);\n-\tif (ret == 0) {\n-\t\tRTE_LOG_WIN32_ERR(\"SetThreadAffinityMask()\");\n-\t\tgoto close_handle;\n-\t}\n-\n-\tmemset(cpuset, 0, cpuset_size);\n-\t*cpuset->_bits = prev_affinity_mask;\n-\n-close_handle:\n-\tif (CloseHandle(thread_handle) == 0) {\n-\t\tRTE_LOG_WIN32_ERR(\"SetThreadAffinityMask()\");\n-\t\treturn -1;\n-\t}\n-\treturn (ret == 0) ? -1 : 0;\n-}\n-\n-static inline int\n-pthread_create(void *threadid, const void *threadattr, void *threadfunc,\n-\t\tvoid *args)\n-{\n-\tRTE_SET_USED(threadattr);\n-\tHANDLE hThread;\n-\thThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadfunc,\n-\t\targs, 0, (LPDWORD)threadid);\n-\tif (hThread) {\n-\t\tSetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);\n-\t\tSetThreadPriority(hThread, THREAD_PRIORITY_NORMAL);\n-\t}\n-\treturn ((hThread != NULL) ? 0 : E_FAIL);\n-}\n-\n-static inline int\n-pthread_join(__rte_unused pthread_t thread,\n-\t__rte_unused void **value_ptr)\n-{\n-\treturn 0;\n-}\n-\n-static inline int\n-pthread_mutex_init(pthread_mutex_t *mutex,\n-\t\t   __rte_unused pthread_mutexattr_t *attr)\n-{\n-\tInitializeCriticalSection(mutex);\n-\treturn 0;\n-}\n-\n-static inline int\n-pthread_mutex_lock(pthread_mutex_t *mutex)\n-{\n-\tEnterCriticalSection(mutex);\n-\treturn 0;\n-}\n-\n-static inline int\n-pthread_mutex_unlock(pthread_mutex_t *mutex)\n-{\n-\tLeaveCriticalSection(mutex);\n-\treturn 0;\n-}\n-\n-static inline int\n-pthread_mutex_destroy(pthread_mutex_t *mutex)\n-{\n-\tDeleteCriticalSection(mutex);\n-\treturn 0;\n-}\n-\n-#ifdef __cplusplus\n-}\n-#endif\n-\n-#endif /* _PTHREAD_H_ */\ndiff --git a/lib/librte_eal/windows/include/sched.h b/lib/librte_eal/windows/include/sched.h\nindex ff572b5dc..8f0b3cb71 100644\n--- a/lib/librte_eal/windows/include/sched.h\n+++ b/lib/librte_eal/windows/include/sched.h\n@@ -44,7 +44,7 @@ typedef struct _rte_cpuset_s {\n \t(1LL << _WHICH_BIT(b))) != 0LL)\n \n static inline int\n-count_cpu(rte_cpuset_t *s)\n+count_cpu(const rte_cpuset_t *s)\n {\n \tunsigned int _i;\n \tint count = 0;\ndiff --git a/lib/librte_eal/windows/meson.build b/lib/librte_eal/windows/meson.build\nindex 42ff5c2d5..ffcddcd0c 100644\n--- a/lib/librte_eal/windows/meson.build\n+++ b/lib/librte_eal/windows/meson.build\n@@ -19,7 +19,12 @@ sources += files(\n \t'eal_timer.c',\n \t'fnmatch.c',\n \t'getopt.c',\n-\t'rte_thread.c',\n )\n \n+if get_option('use_external_thread_lib')\n+\tsources += 'librte_eal/common/rte_thread.c'\n+else\n+\tsources += 'librte_eal/windows/rte_thread.c'\n+endif\n+\n dpdk_conf.set10('RTE_EAL_NUMA_AWARE_HUGEPAGES', true)\ndiff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c\nindex 3059aa55b..72db655f6 100644\n--- a/lib/librte_ethdev/rte_ethdev.c\n+++ b/lib/librte_ethdev/rte_ethdev.c\n@@ -506,7 +506,7 @@ rte_eth_dev_allocate(const char *name)\n \tstrlcpy(eth_dev->data->name, name, sizeof(eth_dev->data->name));\n \teth_dev->data->port_id = port_id;\n \teth_dev->data->mtu = RTE_ETHER_MTU;\n-\tpthread_mutex_init(&eth_dev->data->flow_ops_mutex, NULL);\n+\trte_thread_mutex_init(&eth_dev->data->flow_ops_mutex);\n \n unlock:\n \trte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);\n@@ -580,7 +580,7 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)\n \t\trte_free(eth_dev->data->mac_addrs);\n \t\trte_free(eth_dev->data->hash_mac_addrs);\n \t\trte_free(eth_dev->data->dev_private);\n-\t\tpthread_mutex_destroy(&eth_dev->data->flow_ops_mutex);\n+\t\trte_thread_mutex_destroy(&eth_dev->data->flow_ops_mutex);\n \t\tmemset(eth_dev->data, 0, sizeof(struct rte_eth_dev_data));\n \t}\n \ndiff --git a/lib/librte_ethdev/rte_ethdev_core.h b/lib/librte_ethdev/rte_ethdev_core.h\nindex 918a34ed1..580108b95 100644\n--- a/lib/librte_ethdev/rte_ethdev_core.h\n+++ b/lib/librte_ethdev/rte_ethdev_core.h\n@@ -5,7 +5,6 @@\n #ifndef _RTE_ETHDEV_CORE_H_\n #define _RTE_ETHDEV_CORE_H_\n \n-#include <pthread.h>\n #include <sys/types.h>\n \n /**\n@@ -183,7 +182,7 @@ struct rte_eth_dev_data {\n \t\t\t *   Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags.\n \t\t\t */\n \n-\tpthread_mutex_t flow_ops_mutex; /**< rte_flow ops mutex. */\n+\trte_thread_mutex_t flow_ops_mutex; /**< rte_flow ops mutex. */\n \tuint64_t reserved_64s[4]; /**< Reserved for future fields */\n \tvoid *reserved_ptrs[4];   /**< Reserved for future fields */\n } __rte_cache_aligned;\ndiff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c\nindex 241af6c4c..d096c3d57 100644\n--- a/lib/librte_ethdev/rte_flow.c\n+++ b/lib/librte_ethdev/rte_flow.c\n@@ -223,14 +223,14 @@ static inline void\n fts_enter(struct rte_eth_dev *dev)\n {\n \tif (!(dev->data->dev_flags & RTE_ETH_DEV_FLOW_OPS_THREAD_SAFE))\n-\t\tpthread_mutex_lock(&dev->data->flow_ops_mutex);\n+\t\trte_thread_mutex_lock(&dev->data->flow_ops_mutex);\n }\n \n static inline void\n fts_exit(struct rte_eth_dev *dev)\n {\n \tif (!(dev->data->dev_flags & RTE_ETH_DEV_FLOW_OPS_THREAD_SAFE))\n-\t\tpthread_mutex_unlock(&dev->data->flow_ops_mutex);\n+\t\trte_thread_mutex_unlock(&dev->data->flow_ops_mutex);\n }\n \n static int\ndiff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.c b/lib/librte_eventdev/rte_event_eth_rx_adapter.c\nindex d8c635e99..33d8c7b54 100644\n--- a/lib/librte_eventdev/rte_event_eth_rx_adapter.c\n+++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.c\n@@ -121,7 +121,7 @@ struct rte_event_eth_rx_adapter {\n \t/* Count of interrupt vectors in use */\n \tuint32_t num_intr_vec;\n \t/* Thread blocked on Rx interrupts */\n-\tpthread_t rx_intr_thread;\n+\trte_thread_t rx_intr_thread;\n \t/* Configuration callback for rte_service configuration */\n \trte_event_eth_rx_adapter_conf_cb conf_cb;\n \t/* Configuration callback argument */\n@@ -1302,12 +1302,12 @@ rxa_destroy_intr_thread(struct rte_event_eth_rx_adapter *rx_adapter)\n {\n \tint err;\n \n-\terr = pthread_cancel(rx_adapter->rx_intr_thread);\n+\terr = rte_thread_cancel(rx_adapter->rx_intr_thread);\n \tif (err)\n \t\tRTE_EDEV_LOG_ERR(\"Can't cancel interrupt thread err = %d\\n\",\n \t\t\t\terr);\n \n-\terr = pthread_join(rx_adapter->rx_intr_thread, NULL);\n+\terr = rte_thread_join(rx_adapter->rx_intr_thread, NULL);\n \tif (err)\n \t\tRTE_EDEV_LOG_ERR(\"Can't join interrupt thread err = %d\\n\", err);\n \ndiff --git a/lib/librte_vhost/fd_man.c b/lib/librte_vhost/fd_man.c\nindex 55d4856f9..b97774ccd 100644\n--- a/lib/librte_vhost/fd_man.c\n+++ b/lib/librte_vhost/fd_man.c\n@@ -61,9 +61,9 @@ fdset_shrink_nolock(struct fdset *pfdset)\n static void\n fdset_shrink(struct fdset *pfdset)\n {\n-\tpthread_mutex_lock(&pfdset->fd_mutex);\n+\trte_thread_mutex_lock(&pfdset->fd_mutex);\n \tfdset_shrink_nolock(pfdset);\n-\tpthread_mutex_unlock(&pfdset->fd_mutex);\n+\trte_thread_mutex_unlock(&pfdset->fd_mutex);\n }\n \n /**\n@@ -126,21 +126,21 @@ fdset_add(struct fdset *pfdset, int fd, fd_cb rcb, fd_cb wcb, void *dat)\n \tif (pfdset == NULL || fd == -1)\n \t\treturn -1;\n \n-\tpthread_mutex_lock(&pfdset->fd_mutex);\n+\trte_thread_mutex_lock(&pfdset->fd_mutex);\n \ti = pfdset->num < MAX_FDS ? pfdset->num++ : -1;\n \tif (i == -1) {\n-\t\tpthread_mutex_lock(&pfdset->fd_pooling_mutex);\n+\t\trte_thread_mutex_lock(&pfdset->fd_pooling_mutex);\n \t\tfdset_shrink_nolock(pfdset);\n-\t\tpthread_mutex_unlock(&pfdset->fd_pooling_mutex);\n+\t\trte_thread_mutex_unlock(&pfdset->fd_pooling_mutex);\n \t\ti = pfdset->num < MAX_FDS ? pfdset->num++ : -1;\n \t\tif (i == -1) {\n-\t\t\tpthread_mutex_unlock(&pfdset->fd_mutex);\n+\t\t\trte_thread_mutex_unlock(&pfdset->fd_mutex);\n \t\t\treturn -2;\n \t\t}\n \t}\n \n \tfdset_add_fd(pfdset, i, fd, rcb, wcb, dat);\n-\tpthread_mutex_unlock(&pfdset->fd_mutex);\n+\trte_thread_mutex_unlock(&pfdset->fd_mutex);\n \n \treturn 0;\n }\n@@ -159,7 +159,7 @@ fdset_del(struct fdset *pfdset, int fd)\n \t\treturn NULL;\n \n \tdo {\n-\t\tpthread_mutex_lock(&pfdset->fd_mutex);\n+\t\trte_thread_mutex_lock(&pfdset->fd_mutex);\n \n \t\ti = fdset_find_fd(pfdset, fd);\n \t\tif (i != -1 && pfdset->fd[i].busy == 0) {\n@@ -170,7 +170,7 @@ fdset_del(struct fdset *pfdset, int fd)\n \t\t\tpfdset->fd[i].dat = NULL;\n \t\t\ti = -1;\n \t\t}\n-\t\tpthread_mutex_unlock(&pfdset->fd_mutex);\n+\t\trte_thread_mutex_unlock(&pfdset->fd_mutex);\n \t} while (i != -1);\n \n \treturn dat;\n@@ -192,10 +192,10 @@ fdset_try_del(struct fdset *pfdset, int fd)\n \tif (pfdset == NULL || fd == -1)\n \t\treturn -2;\n \n-\tpthread_mutex_lock(&pfdset->fd_mutex);\n+\trte_thread_mutex_lock(&pfdset->fd_mutex);\n \ti = fdset_find_fd(pfdset, fd);\n \tif (i != -1 && pfdset->fd[i].busy) {\n-\t\tpthread_mutex_unlock(&pfdset->fd_mutex);\n+\t\trte_thread_mutex_unlock(&pfdset->fd_mutex);\n \t\treturn -1;\n \t}\n \n@@ -205,7 +205,7 @@ fdset_try_del(struct fdset *pfdset, int fd)\n \t\tpfdset->fd[i].dat = NULL;\n \t}\n \n-\tpthread_mutex_unlock(&pfdset->fd_mutex);\n+\trte_thread_mutex_unlock(&pfdset->fd_mutex);\n \treturn 0;\n }\n \n@@ -244,19 +244,19 @@ fdset_event_dispatch(void *arg)\n \t\t * might have been updated. It is ok if there is unwanted call\n \t\t * for new listenfds.\n \t\t */\n-\t\tpthread_mutex_lock(&pfdset->fd_mutex);\n+\t\trte_thread_mutex_lock(&pfdset->fd_mutex);\n \t\tnumfds = pfdset->num;\n-\t\tpthread_mutex_unlock(&pfdset->fd_mutex);\n+\t\trte_thread_mutex_unlock(&pfdset->fd_mutex);\n \n-\t\tpthread_mutex_lock(&pfdset->fd_pooling_mutex);\n+\t\trte_thread_mutex_lock(&pfdset->fd_pooling_mutex);\n \t\tval = poll(pfdset->rwfds, numfds, 1000 /* millisecs */);\n-\t\tpthread_mutex_unlock(&pfdset->fd_pooling_mutex);\n+\t\trte_thread_mutex_unlock(&pfdset->fd_pooling_mutex);\n \t\tif (val < 0)\n \t\t\tcontinue;\n \n \t\tneed_shrink = 0;\n \t\tfor (i = 0; i < numfds; i++) {\n-\t\t\tpthread_mutex_lock(&pfdset->fd_mutex);\n+\t\t\trte_thread_mutex_lock(&pfdset->fd_mutex);\n \n \t\t\tpfdentry = &pfdset->fd[i];\n \t\t\tfd = pfdentry->fd;\n@@ -264,12 +264,12 @@ fdset_event_dispatch(void *arg)\n \n \t\t\tif (fd < 0) {\n \t\t\t\tneed_shrink = 1;\n-\t\t\t\tpthread_mutex_unlock(&pfdset->fd_mutex);\n+\t\t\t\trte_thread_mutex_unlock(&pfdset->fd_mutex);\n \t\t\t\tcontinue;\n \t\t\t}\n \n \t\t\tif (!pfd->revents) {\n-\t\t\t\tpthread_mutex_unlock(&pfdset->fd_mutex);\n+\t\t\t\trte_thread_mutex_unlock(&pfdset->fd_mutex);\n \t\t\t\tcontinue;\n \t\t\t}\n \n@@ -280,7 +280,7 @@ fdset_event_dispatch(void *arg)\n \t\t\tdat = pfdentry->dat;\n \t\t\tpfdentry->busy = 1;\n \n-\t\t\tpthread_mutex_unlock(&pfdset->fd_mutex);\n+\t\t\trte_thread_mutex_unlock(&pfdset->fd_mutex);\n \n \t\t\tif (rcb && pfd->revents & (POLLIN | FDPOLLERR))\n \t\t\t\trcb(fd, dat, &remove1);\ndiff --git a/lib/librte_vhost/fd_man.h b/lib/librte_vhost/fd_man.h\nindex 3ab5cfdd6..ba58d849e 100644\n--- a/lib/librte_vhost/fd_man.h\n+++ b/lib/librte_vhost/fd_man.h\n@@ -5,7 +5,7 @@\n #ifndef _FD_MAN_H_\n #define _FD_MAN_H_\n #include <stdint.h>\n-#include <pthread.h>\n+#include <rte_thread.h>\n #include <poll.h>\n \n #define MAX_FDS 1024\n@@ -23,8 +23,8 @@ struct fdentry {\n struct fdset {\n \tstruct pollfd rwfds[MAX_FDS];\n \tstruct fdentry fd[MAX_FDS];\n-\tpthread_mutex_t fd_mutex;\n-\tpthread_mutex_t fd_pooling_mutex;\n+\trte_thread_mutex_t fd_mutex;\n+\trte_thread_mutex_t fd_pooling_mutex;\n \tint num;\t/* current fd number of this fdset */\n \n \tunion pipefds {\ndiff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c\nindex 0169d3648..5f41d40ba 100644\n--- a/lib/librte_vhost/socket.c\n+++ b/lib/librte_vhost/socket.c\n@@ -31,7 +31,7 @@ TAILQ_HEAD(vhost_user_connection_list, vhost_user_connection);\n  */\n struct vhost_user_socket {\n \tstruct vhost_user_connection_list conn_list;\n-\tpthread_mutex_t conn_mutex;\n+\trte_thread_mutex_t conn_mutex;\n \tchar *path;\n \tint socket_fd;\n \tstruct sockaddr_un un;\n@@ -73,7 +73,7 @@ struct vhost_user {\n \tstruct vhost_user_socket *vsockets[MAX_VHOST_SOCKET];\n \tstruct fdset fdset;\n \tint vsocket_cnt;\n-\tpthread_mutex_t mutex;\n+\trte_thread_mutex_t mutex;\n };\n \n #define MAX_VIRTIO_BACKLOG 128\n@@ -86,12 +86,12 @@ static int vhost_user_start_client(struct vhost_user_socket *vsocket);\n static struct vhost_user vhost_user = {\n \t.fdset = {\n \t\t.fd = { [0 ... MAX_FDS - 1] = {-1, NULL, NULL, NULL, 0} },\n-\t\t.fd_mutex = PTHREAD_MUTEX_INITIALIZER,\n-\t\t.fd_pooling_mutex = PTHREAD_MUTEX_INITIALIZER,\n+\t\t.fd_mutex = RTE_THREAD_MUTEX_INITIALIZER,\n+\t\t.fd_pooling_mutex = RTE_THREAD_MUTEX_INITIALIZER,\n \t\t.num = 0\n \t},\n \t.vsocket_cnt = 0,\n-\t.mutex = PTHREAD_MUTEX_INITIALIZER,\n+\t.mutex = RTE_THREAD_MUTEX_INITIALIZER,\n };\n \n /*\n@@ -269,9 +269,9 @@ vhost_user_add_connection(int fd, struct vhost_user_socket *vsocket)\n \t\tgoto err_cleanup;\n \t}\n \n-\tpthread_mutex_lock(&vsocket->conn_mutex);\n+\trte_thread_mutex_lock(&vsocket->conn_mutex);\n \tTAILQ_INSERT_TAIL(&vsocket->conn_list, conn, next);\n-\tpthread_mutex_unlock(&vsocket->conn_mutex);\n+\trte_thread_mutex_unlock(&vsocket->conn_mutex);\n \n \tfdset_pipe_notify(&vhost_user.fdset);\n \treturn;\n@@ -324,9 +324,9 @@ vhost_user_read_cb(int connfd, void *dat, int *remove)\n \t\t\tvhost_user_start_client(vsocket);\n \t\t}\n \n-\t\tpthread_mutex_lock(&vsocket->conn_mutex);\n+\t\trte_thread_mutex_lock(&vsocket->conn_mutex);\n \t\tTAILQ_REMOVE(&vsocket->conn_list, conn, next);\n-\t\tpthread_mutex_unlock(&vsocket->conn_mutex);\n+\t\trte_thread_mutex_unlock(&vsocket->conn_mutex);\n \n \t\tfree(conn);\n \t}\n@@ -418,11 +418,11 @@ struct vhost_user_reconnect {\n TAILQ_HEAD(vhost_user_reconnect_tailq_list, vhost_user_reconnect);\n struct vhost_user_reconnect_list {\n \tstruct vhost_user_reconnect_tailq_list head;\n-\tpthread_mutex_t mutex;\n+\trte_thread_mutex_t mutex;\n };\n \n static struct vhost_user_reconnect_list reconn_list;\n-static pthread_t reconn_tid;\n+static rte_thread_t reconn_tid;\n \n static int\n vhost_user_connect_nonblock(int fd, struct sockaddr *un, size_t sz)\n@@ -454,7 +454,7 @@ vhost_user_client_reconnect(void *arg __rte_unused)\n \tstruct vhost_user_reconnect *reconn, *next;\n \n \twhile (1) {\n-\t\tpthread_mutex_lock(&reconn_list.mutex);\n+\t\trte_thread_mutex_lock(&reconn_list.mutex);\n \n \t\t/*\n \t\t * An equal implementation of TAILQ_FOREACH_SAFE,\n@@ -485,7 +485,7 @@ vhost_user_client_reconnect(void *arg __rte_unused)\n \t\t\tfree(reconn);\n \t\t}\n \n-\t\tpthread_mutex_unlock(&reconn_list.mutex);\n+\t\trte_thread_mutex_unlock(&reconn_list.mutex);\n \t\tsleep(1);\n \t}\n \n@@ -497,7 +497,7 @@ vhost_user_reconnect_init(void)\n {\n \tint ret;\n \n-\tret = pthread_mutex_init(&reconn_list.mutex, NULL);\n+\tret = rte_thread_mutex_init(&reconn_list.mutex);\n \tif (ret < 0) {\n \t\tVHOST_LOG_CONFIG(ERR, \"failed to initialize mutex\");\n \t\treturn ret;\n@@ -508,7 +508,7 @@ vhost_user_reconnect_init(void)\n \t\t\t     vhost_user_client_reconnect, NULL);\n \tif (ret != 0) {\n \t\tVHOST_LOG_CONFIG(ERR, \"failed to create reconnect thread\");\n-\t\tif (pthread_mutex_destroy(&reconn_list.mutex)) {\n+\t\tif (rte_thread_mutex_destroy(&reconn_list.mutex)) {\n \t\t\tVHOST_LOG_CONFIG(ERR,\n \t\t\t\t\"failed to destroy reconnect mutex\");\n \t\t}\n@@ -552,9 +552,9 @@ vhost_user_start_client(struct vhost_user_socket *vsocket)\n \treconn->un = vsocket->un;\n \treconn->fd = fd;\n \treconn->vsocket = vsocket;\n-\tpthread_mutex_lock(&reconn_list.mutex);\n+\trte_thread_mutex_lock(&reconn_list.mutex);\n \tTAILQ_INSERT_TAIL(&reconn_list.head, reconn, next);\n-\tpthread_mutex_unlock(&reconn_list.mutex);\n+\trte_thread_mutex_unlock(&reconn_list.mutex);\n \n \treturn 0;\n }\n@@ -586,11 +586,11 @@ rte_vhost_driver_attach_vdpa_device(const char *path,\n \tif (dev == NULL || path == NULL)\n \t\treturn -1;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n \tif (vsocket)\n \t\tvsocket->vdpa_dev = dev;\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \treturn vsocket ? 0 : -1;\n }\n@@ -600,11 +600,11 @@ rte_vhost_driver_detach_vdpa_device(const char *path)\n {\n \tstruct vhost_user_socket *vsocket;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n \tif (vsocket)\n \t\tvsocket->vdpa_dev = NULL;\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \treturn vsocket ? 0 : -1;\n }\n@@ -615,11 +615,11 @@ rte_vhost_driver_get_vdpa_device(const char *path)\n \tstruct vhost_user_socket *vsocket;\n \tstruct rte_vdpa_device *dev = NULL;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n \tif (vsocket)\n \t\tdev = vsocket->vdpa_dev;\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \treturn dev;\n }\n@@ -629,7 +629,7 @@ rte_vhost_driver_disable_features(const char *path, uint64_t features)\n {\n \tstruct vhost_user_socket *vsocket;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n \n \t/* Note that use_builtin_virtio_net is not affected by this function\n@@ -639,7 +639,7 @@ rte_vhost_driver_disable_features(const char *path, uint64_t features)\n \n \tif (vsocket)\n \t\tvsocket->features &= ~features;\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \treturn vsocket ? 0 : -1;\n }\n@@ -649,7 +649,7 @@ rte_vhost_driver_enable_features(const char *path, uint64_t features)\n {\n \tstruct vhost_user_socket *vsocket;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n \tif (vsocket) {\n \t\tif ((vsocket->supported_features & features) != features) {\n@@ -657,12 +657,12 @@ rte_vhost_driver_enable_features(const char *path, uint64_t features)\n \t\t\t * trying to enable features the driver doesn't\n \t\t\t * support.\n \t\t\t */\n-\t\t\tpthread_mutex_unlock(&vhost_user.mutex);\n+\t\t\trte_thread_mutex_unlock(&vhost_user.mutex);\n \t\t\treturn -1;\n \t\t}\n \t\tvsocket->features |= features;\n \t}\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \treturn vsocket ? 0 : -1;\n }\n@@ -672,7 +672,7 @@ rte_vhost_driver_set_features(const char *path, uint64_t features)\n {\n \tstruct vhost_user_socket *vsocket;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n \tif (vsocket) {\n \t\tvsocket->supported_features = features;\n@@ -683,7 +683,7 @@ rte_vhost_driver_set_features(const char *path, uint64_t features)\n \t\t */\n \t\tvsocket->use_builtin_virtio_net = false;\n \t}\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \treturn vsocket ? 0 : -1;\n }\n@@ -696,7 +696,7 @@ rte_vhost_driver_get_features(const char *path, uint64_t *features)\n \tstruct rte_vdpa_device *vdpa_dev;\n \tint ret = 0;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n \tif (!vsocket) {\n \t\tVHOST_LOG_CONFIG(ERR,\n@@ -722,7 +722,7 @@ rte_vhost_driver_get_features(const char *path, uint64_t *features)\n \t*features = vsocket->features & vdpa_features;\n \n unlock_exit:\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \treturn ret;\n }\n \n@@ -732,11 +732,11 @@ rte_vhost_driver_set_protocol_features(const char *path,\n {\n \tstruct vhost_user_socket *vsocket;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n \tif (vsocket)\n \t\tvsocket->protocol_features = protocol_features;\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \treturn vsocket ? 0 : -1;\n }\n \n@@ -749,7 +749,7 @@ rte_vhost_driver_get_protocol_features(const char *path,\n \tstruct rte_vdpa_device *vdpa_dev;\n \tint ret = 0;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n \tif (!vsocket) {\n \t\tVHOST_LOG_CONFIG(ERR,\n@@ -777,7 +777,7 @@ rte_vhost_driver_get_protocol_features(const char *path,\n \t\t& vdpa_protocol_features;\n \n unlock_exit:\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \treturn ret;\n }\n \n@@ -789,7 +789,7 @@ rte_vhost_driver_get_queue_num(const char *path, uint32_t *queue_num)\n \tstruct rte_vdpa_device *vdpa_dev;\n \tint ret = 0;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n \tif (!vsocket) {\n \t\tVHOST_LOG_CONFIG(ERR,\n@@ -815,7 +815,7 @@ rte_vhost_driver_get_queue_num(const char *path, uint32_t *queue_num)\n \t*queue_num = RTE_MIN((uint32_t)VHOST_MAX_QUEUE_PAIRS, vdpa_queue_num);\n \n unlock_exit:\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \treturn ret;\n }\n \n@@ -847,7 +847,7 @@ rte_vhost_driver_register(const char *path, uint64_t flags)\n \tif (!path)\n \t\treturn -1;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \n \tif (vhost_user.vsocket_cnt == MAX_VHOST_SOCKET) {\n \t\tVHOST_LOG_CONFIG(ERR,\n@@ -867,7 +867,7 @@ rte_vhost_driver_register(const char *path, uint64_t flags)\n \t\tgoto out;\n \t}\n \tTAILQ_INIT(&vsocket->conn_list);\n-\tret = pthread_mutex_init(&vsocket->conn_mutex, NULL);\n+\tret = rte_thread_mutex_init(&vsocket->conn_mutex);\n \tif (ret) {\n \t\tVHOST_LOG_CONFIG(ERR,\n \t\t\t\"error: failed to init connection mutex\\n\");\n@@ -962,18 +962,18 @@ rte_vhost_driver_register(const char *path, uint64_t flags)\n \n \tvhost_user.vsockets[vhost_user.vsocket_cnt++] = vsocket;\n \n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \treturn ret;\n \n out_mutex:\n-\tif (pthread_mutex_destroy(&vsocket->conn_mutex)) {\n+\tif (rte_thread_mutex_destroy(&vsocket->conn_mutex)) {\n \t\tVHOST_LOG_CONFIG(ERR,\n \t\t\t\"error: failed to destroy connection mutex\\n\");\n \t}\n out_free:\n \tvhost_user_socket_mem_free(vsocket);\n out:\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \treturn ret;\n }\n@@ -984,7 +984,7 @@ vhost_user_remove_reconnect(struct vhost_user_socket *vsocket)\n \tint found = false;\n \tstruct vhost_user_reconnect *reconn, *next;\n \n-\tpthread_mutex_lock(&reconn_list.mutex);\n+\trte_thread_mutex_lock(&reconn_list.mutex);\n \n \tfor (reconn = TAILQ_FIRST(&reconn_list.head);\n \t     reconn != NULL; reconn = next) {\n@@ -998,7 +998,7 @@ vhost_user_remove_reconnect(struct vhost_user_socket *vsocket)\n \t\t\tbreak;\n \t\t}\n \t}\n-\tpthread_mutex_unlock(&reconn_list.mutex);\n+\trte_thread_mutex_unlock(&reconn_list.mutex);\n \treturn found;\n }\n \n@@ -1016,13 +1016,13 @@ rte_vhost_driver_unregister(const char *path)\n \t\treturn -1;\n \n again:\n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \n \tfor (i = 0; i < vhost_user.vsocket_cnt; i++) {\n \t\tstruct vhost_user_socket *vsocket = vhost_user.vsockets[i];\n \n \t\tif (!strcmp(vsocket->path, path)) {\n-\t\t\tpthread_mutex_lock(&vsocket->conn_mutex);\n+\t\t\trte_thread_mutex_lock(&vsocket->conn_mutex);\n \t\t\tfor (conn = TAILQ_FIRST(&vsocket->conn_list);\n \t\t\t     conn != NULL;\n \t\t\t     conn = next) {\n@@ -1036,9 +1036,10 @@ rte_vhost_driver_unregister(const char *path)\n \t\t\t\t */\n \t\t\t\tif (fdset_try_del(&vhost_user.fdset,\n \t\t\t\t\t\t  conn->connfd) == -1) {\n-\t\t\t\t\tpthread_mutex_unlock(\n+\t\t\t\t\trte_thread_mutex_unlock(\n \t\t\t\t\t\t\t&vsocket->conn_mutex);\n-\t\t\t\t\tpthread_mutex_unlock(&vhost_user.mutex);\n+\t\t\t\t\trte_thread_mutex_unlock(\n+\t\t\t\t\t\t\t&vhost_user.mutex);\n \t\t\t\t\tgoto again;\n \t\t\t\t}\n \n@@ -1050,7 +1051,7 @@ rte_vhost_driver_unregister(const char *path)\n \t\t\t\tTAILQ_REMOVE(&vsocket->conn_list, conn, next);\n \t\t\t\tfree(conn);\n \t\t\t}\n-\t\t\tpthread_mutex_unlock(&vsocket->conn_mutex);\n+\t\t\trte_thread_mutex_unlock(&vsocket->conn_mutex);\n \n \t\t\tif (vsocket->is_server) {\n \t\t\t\t/*\n@@ -1060,7 +1061,8 @@ rte_vhost_driver_unregister(const char *path)\n \t\t\t\t */\n \t\t\t\tif (fdset_try_del(&vhost_user.fdset,\n \t\t\t\t\t\tvsocket->socket_fd) == -1) {\n-\t\t\t\t\tpthread_mutex_unlock(&vhost_user.mutex);\n+\t\t\t\t\trte_thread_mutex_unlock(\n+\t\t\t\t\t\t\t&vhost_user.mutex);\n \t\t\t\t\tgoto again;\n \t\t\t\t}\n \n@@ -1070,18 +1072,18 @@ rte_vhost_driver_unregister(const char *path)\n \t\t\t\tvhost_user_remove_reconnect(vsocket);\n \t\t\t}\n \n-\t\t\tpthread_mutex_destroy(&vsocket->conn_mutex);\n+\t\t\trte_thread_mutex_destroy(&vsocket->conn_mutex);\n \t\t\tvhost_user_socket_mem_free(vsocket);\n \n \t\t\tcount = --vhost_user.vsocket_cnt;\n \t\t\tvhost_user.vsockets[i] = vhost_user.vsockets[count];\n \t\t\tvhost_user.vsockets[count] = NULL;\n-\t\t\tpthread_mutex_unlock(&vhost_user.mutex);\n+\t\t\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \t\t\treturn 0;\n \t\t}\n \t}\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \treturn -1;\n }\n@@ -1095,11 +1097,11 @@ rte_vhost_driver_callback_register(const char *path,\n {\n \tstruct vhost_user_socket *vsocket;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n \tif (vsocket)\n \t\tvsocket->notify_ops = ops;\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \treturn vsocket ? 0 : -1;\n }\n@@ -1109,9 +1111,9 @@ vhost_driver_callback_get(const char *path)\n {\n \tstruct vhost_user_socket *vsocket;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \treturn vsocket ? vsocket->notify_ops : NULL;\n }\n@@ -1120,11 +1122,11 @@ int\n rte_vhost_driver_start(const char *path)\n {\n \tstruct vhost_user_socket *vsocket;\n-\tstatic pthread_t fdset_tid;\n+\tstatic rte_thread_t fdset_tid;\n \n-\tpthread_mutex_lock(&vhost_user.mutex);\n+\trte_thread_mutex_lock(&vhost_user.mutex);\n \tvsocket = find_vhost_user_socket(path);\n-\tpthread_mutex_unlock(&vhost_user.mutex);\n+\trte_thread_mutex_unlock(&vhost_user.mutex);\n \n \tif (!vsocket)\n \t\treturn -1;\ndiff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c\nindex 52ab93d1e..54db845da 100644\n--- a/lib/librte_vhost/vhost.c\n+++ b/lib/librte_vhost/vhost.c\n@@ -26,7 +26,7 @@\n #include \"vhost_user.h\"\n \n struct virtio_net *vhost_devices[MAX_VHOST_DEVICE];\n-pthread_mutex_t vhost_dev_lock = PTHREAD_MUTEX_INITIALIZER;\n+rte_thread_mutex_t vhost_dev_lock = RTE_THREAD_MUTEX_INITIALIZER;\n \n /* Called with iotlb_lock read-locked */\n uint64_t\n@@ -646,7 +646,7 @@ vhost_new_device(void)\n \tstruct virtio_net *dev;\n \tint i;\n \n-\tpthread_mutex_lock(&vhost_dev_lock);\n+\trte_thread_mutex_lock(&vhost_dev_lock);\n \tfor (i = 0; i < MAX_VHOST_DEVICE; i++) {\n \t\tif (vhost_devices[i] == NULL)\n \t\t\tbreak;\n@@ -655,7 +655,7 @@ vhost_new_device(void)\n \tif (i == MAX_VHOST_DEVICE) {\n \t\tVHOST_LOG_CONFIG(ERR,\n \t\t\t\"Failed to find a free slot for new device.\\n\");\n-\t\tpthread_mutex_unlock(&vhost_dev_lock);\n+\t\trte_thread_mutex_unlock(&vhost_dev_lock);\n \t\treturn -1;\n \t}\n \n@@ -663,12 +663,12 @@ vhost_new_device(void)\n \tif (dev == NULL) {\n \t\tVHOST_LOG_CONFIG(ERR,\n \t\t\t\"Failed to allocate memory for new dev.\\n\");\n-\t\tpthread_mutex_unlock(&vhost_dev_lock);\n+\t\trte_thread_mutex_unlock(&vhost_dev_lock);\n \t\treturn -1;\n \t}\n \n \tvhost_devices[i] = dev;\n-\tpthread_mutex_unlock(&vhost_dev_lock);\n+\trte_thread_mutex_unlock(&vhost_dev_lock);\n \n \tdev->vid = i;\n \tdev->flags = VIRTIO_DEV_BUILTIN_VIRTIO_NET;\ndiff --git a/meson_options.txt b/meson_options.txt\nindex 3b8c5d316..29f8df218 100644\n--- a/meson_options.txt\n+++ b/meson_options.txt\n@@ -32,5 +32,7 @@ option('enable_trace_fp', type: 'boolean', value: false,\n \tdescription: 'enable fast path trace points.')\n option('tests', type: 'boolean', value: true,\n \tdescription: 'build unit tests')\n+option('use_external_thread_lib', type: 'boolean', value: false,\n+\tdescription: 'use an external thread library')\n option('use_hpet', type: 'boolean', value: false,\n \tdescription: 'use HPET timer in EAL')\n",
    "prefixes": [
        "v4",
        "10/10"
    ]
}