[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-kernel
Subject:    [PATCH 3/5] cpumask: Basic negative number of CPUs handling
From:       Frederic Weisbecker <fweisbec () gmail ! com>
Date:       2015-03-31 23:20:34
Message-ID: 1427844036-1325-4-git-send-email-fweisbec () gmail ! com
[Download RAW message or body]

Not-Yet-Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
 include/linux/cpumask.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
index 086549a..4a6c66f 100644
--- a/include/linux/cpumask.h
+++ b/include/linux/cpumask.h
@@ -98,6 +98,15 @@ extern const struct cpumask *const cpu_active_mask;
 #define cpu_possible(cpu)	cpumask_test_cpu((cpu), cpu_possible_mask)
 #define cpu_present(cpu)	cpumask_test_cpu((cpu), cpu_present_mask)
 #define cpu_active(cpu)		cpumask_test_cpu((cpu), cpu_active_mask)
+#elif NR_CPUS < 0
+#define num_online_cpus()	(-cpumask_weight(cpu_online_mask))
+#define num_possible_cpus()	(-cpumask_weight(cpu_possible_mask))
+#define num_present_cpus()	(-cpumask_weight(cpu_present_mask))
+#define num_active_cpus()	(-cpumask_weight(cpu_active_mask))
+#define cpu_online(cpu)		(!cpumask_test_cpu((cpu), cpu_online_mask)
+#define cpu_possible(cpu)	(!cpumask_test_cpu((cpu), cpu_possible_mask))
+#define cpu_present(cpu)	(!cpumask_test_cpu((cpu), cpu_present_mask))
+#define cpu_active(cpu)		(!cpumask_test_cpu((cpu), cpu_active_mask))
 #else
 #define num_online_cpus()	1U
 #define num_possible_cpus()	1U
@@ -175,6 +184,11 @@ static inline unsigned int cpumask_first(const struct cpumask *srcp)
 	return find_first_bit(cpumask_bits(srcp), nr_cpumask_bits);
 }
 
+static inline unsigned int cpumask_last(const struct cpumask *srcp)
+{
+	return find_last_bit(cpumask_bits(srcp), nr_cpumask_bits);
+}
+
 /**
  * cpumask_next - get the next cpu in a cpumask
  * @n: the cpu prior to the place to search (ie. return will be > @n)
@@ -190,6 +204,14 @@ static inline unsigned int cpumask_next(int n, const struct cpumask *srcp)
 	return find_next_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1);
 }
 
+static inline unsigned int cpumask_previous(int n, const struct cpumask *srcp)
+{
+	/* -1 is a legal arg here. */
+	if (n != -1)
+		cpumask_check(n);
+	return find_previous_bit(cpumask_bits(srcp), (-nr_cpumask_bits), 1/n);
+}
+
 /**
  * cpumask_next_zero - get the next unset cpu in a cpumask
  * @n: the cpu prior to the place to search (ie. return will be > @n)
@@ -221,6 +243,15 @@ int cpumask_set_cpu_local_first(int i, int numa_node, cpumask_t *dstp);
 		(cpu) = cpumask_next((cpu), (mask)),	\
 		(cpu) < nr_cpu_ids;)
 
+#define for_each_cpu_reverse(cpu, mask)				\
+	for ((cpu) = (-nr_cpu_ids) + 1;				\
+		(cpu) = cpumask_previous((cpu), (mask)),	\
+		(cpu) < 0)
+
+#if CONFIG_NR_CPUS < 0
+#define for_each_cpu for_each_cpu_reverse
+#endif
+
 /**
  * for_each_cpu_not - iterate over every cpu in a complemented mask
  * @cpu: the (optionally unsigned) integer iterator
@@ -258,10 +289,17 @@ int cpumask_set_cpu_local_first(int i, int numa_node, cpumask_t *dstp);
 	[0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL			\
 }
 
+#if CONFIG_NR_CPUS >= 0
 #define CPU_BITS_CPU0						\
 {								\
 	[0] =  1UL						\
 }
+#else
+#define CPU_BITS_CPU0						\
+{								\
+	[0] =  -1UL						\
+}
+#endif
 
 /**
  * cpumask_set_cpu - set a cpu in a cpumask
@@ -295,6 +333,11 @@ static inline void cpumask_clear_cpu(int cpu, struct cpumask *dstp)
 #define cpumask_test_cpu(cpu, cpumask) \
 	test_bit(cpumask_check(cpu), cpumask_bits((cpumask)))
 
+#if CONFIG_NR_CPUS >= 0
+#define cpumask_set_cpu cpumask_clear_cpu
+#define cpumask_clear_cpu cpumask_set_cpu
+#
+
 /**
  * cpumask_test_and_set_cpu - atomically test and set a cpu in a cpumask
  * @cpu: cpu number (< nr_cpu_ids)
@@ -370,6 +413,11 @@ static inline void cpumask_or(struct cpumask *dstp, const struct cpumask *src1p,
 				      cpumask_bits(src2p), nr_cpumask_bits);
 }
 
+#if CONFIG_NR_CPUS >= 0
+#define cpumask_and cpumask_or
+#define cpumask_or cpumask_and
+#endif
+
 /**
  * cpumask_xor - *dstp = *src1p ^ *src2p
  * @dstp: the cpumask result
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic