From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <nhorman@tuxdriver.com>
Received: from smtp.tuxdriver.com (charlotte.tuxdriver.com [70.61.120.58])
 by dpdk.org (Postfix) with ESMTP id E4087B4AD
 for <dev@dpdk.org>; Fri, 13 Feb 2015 14:58:16 +0100 (CET)
Received: from [67.210.173.2] (helo=localhost)
 by smtp.tuxdriver.com with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.63)
 (envelope-from <nhorman@tuxdriver.com>)
 id 1YMGl3-0002NG-Fm; Fri, 13 Feb 2015 08:58:16 -0500
Date: Fri, 13 Feb 2015 08:58:07 -0500
From: Neil Horman <nhorman@tuxdriver.com>
To: Cunming Liang <cunming.liang@intel.com>
Message-ID: <20150213135807.GC13495@neilslaptop.think-freely.org>
References: <1423728996-3004-1-git-send-email-cunming.liang@intel.com>
 <1423791501-1555-1-git-send-email-cunming.liang@intel.com>
 <1423791501-1555-7-git-send-email-cunming.liang@intel.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1423791501-1555-7-git-send-email-cunming.liang@intel.com>
User-Agent: Mutt/1.5.23 (2014-03-12)
X-Spam-Score: -2.9 (--)
X-Spam-Status: No
Cc: dev@dpdk.org
Subject: Re: [dpdk-dev] [PATCH v6 06/19] eal: new TLS definition and API
 declaration
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: patches and discussions about DPDK <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <http://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Fri, 13 Feb 2015 13:58:17 -0000

On Fri, Feb 13, 2015 at 09:38:08AM +0800, Cunming Liang wrote:
> 1. add two TLS *_socket_id* and *_cpuset*
> 2. add two external API rte_thread_set/get_affinity
> 3. add one internal API eal_thread_dump_affinity
> 
> Signed-off-by: Cunming Liang <cunming.liang@intel.com>
> ---
>  v5 changes:
>    add comments for RTE_CPU_AFFINITY_STR_LEN
>    update comments for eal_thread_dump_affinity()
>    return void for rte_thread_get_affinity()
>    move rte_socket_id() change to another patch
> 
>  lib/librte_eal/bsdapp/eal/eal_thread.c    |  2 ++
>  lib/librte_eal/common/eal_thread.h        | 36 +++++++++++++++++++++++++++++++
>  lib/librte_eal/common/include/rte_lcore.h | 26 +++++++++++++++++++++-
>  lib/librte_eal/linuxapp/eal/eal_thread.c  |  2 ++
>  4 files changed, 65 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/librte_eal/bsdapp/eal/eal_thread.c b/lib/librte_eal/bsdapp/eal/eal_thread.c
> index ab05368..10220c7 100644
> --- a/lib/librte_eal/bsdapp/eal/eal_thread.c
> +++ b/lib/librte_eal/bsdapp/eal/eal_thread.c
> @@ -56,6 +56,8 @@
>  #include "eal_thread.h"
>  
>  RTE_DEFINE_PER_LCORE(unsigned, _lcore_id);
> +RTE_DEFINE_PER_LCORE(unsigned, _socket_id);
> +RTE_DEFINE_PER_LCORE(rte_cpuset_t, _cpuset);
>  
>  /*
>   * Send a message to a slave lcore identified by slave_id to call a
> diff --git a/lib/librte_eal/common/eal_thread.h b/lib/librte_eal/common/eal_thread.h
> index f1ce0bd..e4e76b9 100644
> --- a/lib/librte_eal/common/eal_thread.h
> +++ b/lib/librte_eal/common/eal_thread.h
> @@ -34,6 +34,8 @@
>  #ifndef EAL_THREAD_H
>  #define EAL_THREAD_H
>  
> +#include <rte_lcore.h>
> +
>  /**
>   * basic loop of thread, called for each thread by eal_init().
>   *
> @@ -61,4 +63,38 @@ void eal_thread_init_master(unsigned lcore_id);
>   */
>  unsigned eal_cpu_socket_id(unsigned cpu_id);
>  
> +/**
> + * Get the NUMA socket id from cpuset.
> + * This function is private to EAL.
> + *
> + * @param cpusetp
> + *   The point to a valid cpu set.
> + * @return
> + *   socket_id or SOCKET_ID_ANY
> + */
> +int eal_cpuset_socket_id(rte_cpuset_t *cpusetp);
> +
> +/**
> + * Default buffer size to use with eal_thread_dump_affinity()
> + */
> +#define RTE_CPU_AFFINITY_STR_LEN            256
> +
> +/**
> + * Dump the current pthread cpuset.
> + * This function is private to EAL.
> + *
> + * Note:
> + *   If the dump size is greater than the size of given buffer,
> + *   the string will be truncated and with '\0' at the end.
> + *
> + * @param str
> + *   The string buffer the cpuset will dump to.
> + * @param size
> + *   The string buffer size.
> + * @return
> + *   0 for success, -1 if truncation happens.
> + */
> +int
> +eal_thread_dump_affinity(char *str, unsigned size);
> +
>  #endif /* EAL_THREAD_H */
> diff --git a/lib/librte_eal/common/include/rte_lcore.h b/lib/librte_eal/common/include/rte_lcore.h
> index 4c7d6bb..33f558e 100644
> --- a/lib/librte_eal/common/include/rte_lcore.h
> +++ b/lib/librte_eal/common/include/rte_lcore.h
> @@ -80,7 +80,9 @@ struct lcore_config {
>   */
>  extern struct lcore_config lcore_config[RTE_MAX_LCORE];
>  
> -RTE_DECLARE_PER_LCORE(unsigned, _lcore_id); /**< Per core "core id". */
> +RTE_DECLARE_PER_LCORE(unsigned, _lcore_id);  /**< Per thread "lcore id". */
> +RTE_DECLARE_PER_LCORE(unsigned, _socket_id); /**< Per thread "socket id". */
> +RTE_DECLARE_PER_LCORE(rte_cpuset_t, _cpuset); /**< Per thread "cpuset". */
>  
>  /**
>   * Return the ID of the execution unit we are running on.
> @@ -229,6 +231,28 @@ rte_get_next_lcore(unsigned i, int skip_master, int wrap)
>  	     i<RTE_MAX_LCORE;						\
>  	     i = rte_get_next_lcore(i, 1, 0))
>  
> +/**
> + * Set core affinity of the current thread.
> + * Support both EAL and none-EAL thread and update TLS.
> + *
> + * @param cpusetp
> + *   Point to cpu_set_t for setting current thread affinity.
> + * @return
> + *   On success, return 0; otherwise return -1;
> + */
> +int rte_thread_set_affinity(rte_cpuset_t *cpusetp);
> +
> +/**
> + * Get core affinity of the current thread.
> + *
> + * @param cpusetp
> + *   Point to cpu_set_t for getting current thread cpu affinity.
> + *   It presumes input is not NULL, otherwise it causes panic.
> + *
> + */
> +void rte_thread_get_affinity(rte_cpuset_t *cpusetp);
> +
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/lib/librte_eal/linuxapp/eal/eal_thread.c b/lib/librte_eal/linuxapp/eal/eal_thread.c
> index 80a985f..748a83a 100644
> --- a/lib/librte_eal/linuxapp/eal/eal_thread.c
> +++ b/lib/librte_eal/linuxapp/eal/eal_thread.c
> @@ -56,6 +56,8 @@
>  #include "eal_thread.h"
>  
>  RTE_DEFINE_PER_LCORE(unsigned, _lcore_id);
> +RTE_DEFINE_PER_LCORE(unsigned, _socket_id);
> +RTE_DEFINE_PER_LCORE(rte_cpuset_t, _cpuset);
>  
>  /*
>   * Send a message to a slave lcore identified by slave_id to call a
> -- 
> 1.8.1.4
> 
> 
All of these exported functions need to be exported in the version map.  Also, I
don't think its a good idea to simply expose the per lcore cpuset variables.  It
would be far better to create an api around them

Neil