[PATCH] taskset: support more than 64 cores

Matthieu Ternisien d'Ouville matthieu.tdo at 6wind.com
Mon Aug 11 12:58:44 UTC 2014


This patch adds support of more than 64 cores for taskset.

Signed-off-by: Matthieu Ternisien d'Ouville <matthieu.tdo at 6wind.com>
---
 miscutils/taskset.c |   39 +++++++++++++++++++++++++++++++--------
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/miscutils/taskset.c b/miscutils/taskset.c
index 4a9e323..2695e20 100644
--- a/miscutils/taskset.c
+++ b/miscutils/taskset.c
@@ -129,16 +129,39 @@ int taskset_main(int argc UNUSED_PARAM, char **argv)
 	}
 
 	{ /* Affinity was specified, translate it into cpu_set_t */
-		unsigned i;
-		/* Do not allow zero mask: */
-		unsigned long long m = xstrtoull_range(aff, 0, 1, ULLONG_MAX);
-		enum { CNT_BIT = CPU_SETSIZE < sizeof(m)*8 ? CPU_SETSIZE : sizeof(m)*8 };
+		long cpu;
+		int len = strlen(aff);
+		const char *ptr = aff + len - 1;
+		const char *prefix = "";
+
+		if (len > 1 && !memcmp(aff, "0x", 2)) {
+			aff += 2;
+			prefix = "0x";
+		}
 
 		CPU_ZERO(&mask);
-		for (i = 0; i < CNT_BIT; i++) {
-			unsigned long long bit = (1ULL << i);
-			if (bit & m)
-				CPU_SET(i, &mask);
+		cpu = 0;
+
+		for (; ptr >= aff; ptr--) {
+			int val;
+
+			if (*ptr <= '9' && *ptr >= '0')
+				val = *ptr - '0';
+			else if (*ptr <= 'f' && *ptr >= 'a')
+				val = *ptr + (10 - 'a');
+			else
+				bb_perror_msg_and_die("invalid mask %s%s", prefix, aff);
+
+			if (val & 1)
+				CPU_SET(cpu, &mask);
+			if (val & 2)
+				CPU_SET(cpu+1, &mask);
+			if (val & 4)
+				CPU_SET(cpu+2, &mask);
+			if (val & 8)
+				CPU_SET(cpu+3, &mask);
+
+			cpu += 4;
 		}
 	}
 
-- 
1.7.10.4



More information about the busybox mailing list