All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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.