diff mbox

platform: linux-generic: reading cpu affinity from cpuset

Message ID 1480340155-19372-1-git-send-email-balakrishna.garapati@linaro.org
State Superseded
Headers show

Commit Message

Balakrishna Garapati Nov. 28, 2016, 1:35 p.m. UTC
Fixes bug: https://bugs.linaro.org/show_bug.cgi?id=2472

Signed-off-by: Balakrishna Garapati <balakrishna.garapati@linaro.org>

---

 With this new proposal cpu affinity is read correctly especialy
 when using cgroups otherwise wrong cpu mask is set.

 platform/linux-generic/odp_cpumask.c | 69 +++++++++---------------------------
 1 file changed, 16 insertions(+), 53 deletions(-)

--
1.9.1

Comments

Maxim Uvarov Nov. 28, 2016, 1:45 p.m. UTC | #1
On 11/28/16 16:35, Balakrishna Garapati wrote:


Krishna, you need to put here full description from comment
2016-11-21 14:00:53 UTC.

Thanks,
Maxim.

> Fixes bug: https://bugs.linaro.org/show_bug.cgi?id=2472

>

> Signed-off-by: Balakrishna Garapati <balakrishna.garapati@linaro.org>

> ---

>

>   With this new proposal cpu affinity is read correctly especialy

>   when using cgroups otherwise wrong cpu mask is set.

>

>   platform/linux-generic/odp_cpumask.c | 69 +++++++++---------------------------

>   1 file changed, 16 insertions(+), 53 deletions(-)

>

> diff --git a/platform/linux-generic/odp_cpumask.c b/platform/linux-generic/odp_cpumask.c

> index 6bf2632..7b0d80a 100644

> --- a/platform/linux-generic/odp_cpumask.c

> +++ b/platform/linux-generic/odp_cpumask.c

> @@ -227,71 +227,34 @@ int odp_cpumask_next(const odp_cpumask_t *mask, int cpu)

>    */

>   static int get_installed_cpus(void)

>   {

> -	char *numptr;

> -	char *endptr;

> -	long int cpu_idnum;

> -	DIR  *d;

> -	struct dirent *dir;

> +	int cpu_idnum;

> +	cpu_set_t cpuset;

> +	int ret;

>

>   	/* Clear the global cpumasks for control and worker CPUs */

>   	odp_cpumask_zero(&odp_global_data.control_cpus);

>   	odp_cpumask_zero(&odp_global_data.worker_cpus);

>

> -	/*

> -	 * Scan the /sysfs pseudo-filesystem for CPU info directories.

> -	 * There should be one subdirectory for each installed logical CPU

> -	 */

> -	d = opendir("/sys/devices/system/cpu");

> -	if (d) {

> -		while ((dir = readdir(d)) != NULL) {

> -			cpu_idnum = CPU_SETSIZE;

> -

> -			/*

> -			 * If the current directory entry doesn't represent

> -			 * a CPU info subdirectory then skip to the next entry.

> -			 */

> -			if (dir->d_type == DT_DIR) {

> -				if (!strncmp(dir->d_name, "cpu", 3)) {

> -					/*

> -					 * Directory name starts with "cpu"...

> -					 * Try to extract a CPU ID number

> -					 * from the remainder of the dirname.

> -					 */

> -					errno = 0;

> -					numptr = dir->d_name;

> -					numptr += 3;

> -					cpu_idnum = strtol(numptr, &endptr,

> -							   10);

> -					if (errno || (endptr == numptr))

> -						continue;

> -				} else {

> -					continue;

> -				}

> -			} else {

> -				continue;

> -			}

> -			/*

> -			 * If we get here the current directory entry specifies

> -			 * a CPU info subdir for the CPU indexed by cpu_idnum.

> -			 */

> +	CPU_ZERO(&cpuset);

> +	ret = sched_getaffinity(0, sizeof(cpuset), &cpuset);

>

> -			/* Track number of logical CPUs discovered */

> -			if (odp_global_data.num_cpus_installed <

> -			    (int)(cpu_idnum + 1))

> -				odp_global_data.num_cpus_installed =

> -						(int)(cpu_idnum + 1);

> +	if (ret < 0) {

> +		ODP_ERR("Failed to get cpu affinity");

> +			return -1;

> +	}

>

> +	for (cpu_idnum = 0; cpu_idnum < CPU_SETSIZE - 1; cpu_idnum++) {

> +		if (CPU_ISSET(cpu_idnum, &cpuset)) {

> +			odp_global_data.num_cpus_installed++;

>   			/* Add the CPU to our default cpumasks */

>   			odp_cpumask_set(&odp_global_data.control_cpus,

> -					(int)cpu_idnum);

> +						(int)cpu_idnum);

>   			odp_cpumask_set(&odp_global_data.worker_cpus,

> -					(int)cpu_idnum);

> +						(int)cpu_idnum);

>   		}

> -		closedir(d);

> -		return 0;

> -	} else {

> -		return -1;

>   	}

> +

> +	return 0;

>   }

>

>   /*

> --

> 1.9.1

>
diff mbox

Patch

diff --git a/platform/linux-generic/odp_cpumask.c b/platform/linux-generic/odp_cpumask.c
index 6bf2632..7b0d80a 100644
--- a/platform/linux-generic/odp_cpumask.c
+++ b/platform/linux-generic/odp_cpumask.c
@@ -227,71 +227,34 @@  int odp_cpumask_next(const odp_cpumask_t *mask, int cpu)
  */
 static int get_installed_cpus(void)
 {
-	char *numptr;
-	char *endptr;
-	long int cpu_idnum;
-	DIR  *d;
-	struct dirent *dir;
+	int cpu_idnum;
+	cpu_set_t cpuset;
+	int ret;

 	/* Clear the global cpumasks for control and worker CPUs */
 	odp_cpumask_zero(&odp_global_data.control_cpus);
 	odp_cpumask_zero(&odp_global_data.worker_cpus);

-	/*
-	 * Scan the /sysfs pseudo-filesystem for CPU info directories.
-	 * There should be one subdirectory for each installed logical CPU
-	 */
-	d = opendir("/sys/devices/system/cpu");
-	if (d) {
-		while ((dir = readdir(d)) != NULL) {
-			cpu_idnum = CPU_SETSIZE;
-
-			/*
-			 * If the current directory entry doesn't represent
-			 * a CPU info subdirectory then skip to the next entry.
-			 */
-			if (dir->d_type == DT_DIR) {
-				if (!strncmp(dir->d_name, "cpu", 3)) {
-					/*
-					 * Directory name starts with "cpu"...
-					 * Try to extract a CPU ID number
-					 * from the remainder of the dirname.
-					 */
-					errno = 0;
-					numptr = dir->d_name;
-					numptr += 3;
-					cpu_idnum = strtol(numptr, &endptr,
-							   10);
-					if (errno || (endptr == numptr))
-						continue;
-				} else {
-					continue;
-				}
-			} else {
-				continue;
-			}
-			/*
-			 * If we get here the current directory entry specifies
-			 * a CPU info subdir for the CPU indexed by cpu_idnum.
-			 */
+	CPU_ZERO(&cpuset);
+	ret = sched_getaffinity(0, sizeof(cpuset), &cpuset);

-			/* Track number of logical CPUs discovered */
-			if (odp_global_data.num_cpus_installed <
-			    (int)(cpu_idnum + 1))
-				odp_global_data.num_cpus_installed =
-						(int)(cpu_idnum + 1);
+	if (ret < 0) {
+		ODP_ERR("Failed to get cpu affinity");
+			return -1;
+	}

+	for (cpu_idnum = 0; cpu_idnum < CPU_SETSIZE - 1; cpu_idnum++) {
+		if (CPU_ISSET(cpu_idnum, &cpuset)) {
+			odp_global_data.num_cpus_installed++;
 			/* Add the CPU to our default cpumasks */
 			odp_cpumask_set(&odp_global_data.control_cpus,
-					(int)cpu_idnum);
+						(int)cpu_idnum);
 			odp_cpumask_set(&odp_global_data.worker_cpus,
-					(int)cpu_idnum);
+						(int)cpu_idnum);
 		}
-		closedir(d);
-		return 0;
-	} else {
-		return -1;
 	}
+
+	return 0;
 }

 /*