From: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
To: Tasnim Bashar <tbashar@mellanox.com>
Cc: dev@dpdk.org, harini.ramakrishnan@microsoft.com,
pallavi.kadam@intel.com, ranjit.menon@intel.com,
ocardona@microsoft.com, navasile@linux.microsoft.com,
talshn@mellanox.com, fady@mellanox.com, ophirmu@mellanox.com,
thomas@monjalon.net
Subject: Re: [dpdk-dev] [PATCH] eal/windows: fix invalid thread handle
Date: Fri, 22 May 2020 03:55:45 +0300 [thread overview]
Message-ID: <20200522035545.76321d0a@sovereign> (raw)
In-Reply-To: <20200522001112.48932-1-tbashar@mellanox.com>
On Thu, 21 May 2020 17:11:12 -0700
Tasnim Bashar <tbashar@mellanox.com> wrote:
> Casting thread ID to handle is not accurate way to get thread handle.
> Need to use OpenThread function to get thread handle from thread ID.
>
> pthread_setaffinity_np and pthread_getaffinity_np functions
> for Windows are affected because of it.
Good catch.
Side note:
The sooner we move to a mature third-party pthread implementation, the better.
>
> Signed-off-by: Tasnim Bashar <tbashar@mellanox.com>
> ---
> lib/librte_eal/windows/include/pthread.h | 40 +++++++++++++++++++++---
> 1 file changed, 35 insertions(+), 5 deletions(-)
>
> diff --git a/lib/librte_eal/windows/include/pthread.h b/lib/librte_eal/windows/include/pthread.h
> index 0bbed5c3b8..d2a986f8fd 100644
> --- a/lib/librte_eal/windows/include/pthread.h
> +++ b/lib/librte_eal/windows/include/pthread.h
> @@ -18,6 +18,7 @@ extern "C" {
>
> #include <windows.h>
> #include <rte_common.h>
> +#include <rte_windows.h>
Build fails, because <rte_windows.h> doesn't include <rte_log.h>, macros from
which it uses. I'd rather include it there, so that <rte_windows.h> could be
used independently, but you can also add an include here.
If you include <rte_windows.h>, you don't need <windows.h> anymore.
>
> #define PTHREAD_BARRIER_SERIAL_THREAD TRUE
>
> @@ -50,7 +51,19 @@ typedef SYNCHRONIZATION_BARRIER pthread_barrier_t;
> static inline int
> eal_set_thread_affinity_mask(pthread_t threadid, unsigned long *cpuset)
> {
> - SetThreadAffinityMask((HANDLE) threadid, *cpuset);
> + HANDLE thread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, threadid);
> + if (thread_handle == NULL) {
> + RTE_LOG_WIN32_ERR("OpenThread()");
> + return -1;
> + }
> +
> + DWORD ret = SetThreadAffinityMask(thread_handle, *cpuset);
GetThreadAffinityMask() and SetThreadAffinityMask() operate on DWORD_PTR (8
bytes), not DWORD (4 byte). This applies to all usages of these functions in
the file and also to the type of "cpuset" parameter: it should be either "long
long *" (as rte_cpuset_t is declared) or just "rte_cpuset_t *".
Also, DPDK coding style suggests declaring variables at the start of the block
(i.e. function here and below).
> + if (ret == 0) {
> + RTE_LOG_WIN32_ERR("SetThreadAffinityMask()");
> + CloseHandle(thread_handle);
> + return -1;
> + }
> + CloseHandle(thread_handle);
> return 0;
> }
>
> @@ -60,12 +73,29 @@ eal_get_thread_affinity_mask(pthread_t threadid, unsigned long *cpuset)
> /* Workaround for the lack of a GetThreadAffinityMask()
> *API in Windows
> */
> - /* obtain previous mask by setting dummy mask */
> - DWORD dwprevaffinitymask =
> - SetThreadAffinityMask((HANDLE) threadid, 0x1);
Loss of data for the reason described above: here a 64-bit mask is
stored in a 32-bit variable, so later the wrong value of affinity will be
restored for cores 32 and on.
> + HANDLE thread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, threadid);
> + if (thread_handle == NULL) {
> + RTE_LOG_WIN32_ERR("OpenThread()");
> + return -1;
> + }
> +
> + /* obtain previous mask by setting dummy mask */
> + DWORD dwprevaffinitymask = SetThreadAffinityMask(thread_handle, 0x1);
> + if (dwprevaffinitymask == 0) {
> + RTE_LOG_WIN32_ERR("SetThreadAffinityMask()");
> + CloseHandle(thread_handle);
> + return -1;
> + }
> +
> /* set it back! */
> - SetThreadAffinityMask((HANDLE) threadid, dwprevaffinitymask);
> + DWORD ret = SetThreadAffinityMask(thread_handle, dwprevaffinitymask);
> + if (ret == 0) {
> + RTE_LOG_WIN32_ERR("SetThreadAffinityMask()");
> + CloseHandle(thread_handle);
> + return -1;
> + }
> *cpuset = dwprevaffinitymask;
> + CloseHandle(thread_handle);
> return 0;
> }
>
--
Dmitry Kozlyuk
next prev parent reply other threads:[~2020-05-22 0:55 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-22 0:11 [dpdk-dev] [PATCH] eal/windows: fix invalid thread handle Tasnim Bashar
2020-05-22 0:55 ` Dmitry Kozlyuk [this message]
2020-06-02 2:00 ` [dpdk-dev] [PATCH v3] " Tasnim Bashar
2020-06-11 14:35 ` Thomas Monjalon
2020-06-12 16:22 ` Tasnim Bashar
2020-06-12 21:33 ` Thomas Monjalon
2020-06-15 8:16 ` Thomas Monjalon
2020-06-16 18:53 ` Tasnim Bashar
2020-06-16 19:17 ` Thomas Monjalon
2020-06-16 19:59 ` Tasnim Bashar
2020-06-15 9:42 ` Thomas Monjalon
2020-06-16 19:00 ` Tasnim Bashar
2020-06-24 23:10 ` [dpdk-dev] [PATCH v4] eal/windows: fix " Tasnim Bashar
2020-06-25 0:38 ` Ranjit Menon
2020-06-25 19:11 ` Tasnim Bashar
2020-06-25 19:25 ` [dpdk-dev] [PATCH v5] " Tasnim Bashar
2020-06-29 23:09 ` Thomas Monjalon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200522035545.76321d0a@sovereign \
--to=dmitry.kozliuk@gmail.com \
--cc=dev@dpdk.org \
--cc=fady@mellanox.com \
--cc=harini.ramakrishnan@microsoft.com \
--cc=navasile@linux.microsoft.com \
--cc=ocardona@microsoft.com \
--cc=ophirmu@mellanox.com \
--cc=pallavi.kadam@intel.com \
--cc=ranjit.menon@intel.com \
--cc=talshn@mellanox.com \
--cc=tbashar@mellanox.com \
--cc=thomas@monjalon.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.