public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Rusty Russell <rusty@rustcorp.com.au>
To: torvalds@transmeta.com
Cc: linux-kernel@vger.kernel.org, mingo@redhat.com
Subject: [PATCH] cpu_mask_t
Date: Tue, 16 Jul 2002 18:15:34 +1000	[thread overview]
Message-ID: <20020716091406.B7D9B42CC@lists.samba.org> (raw)

And this is part II.  Each arch implements cpu_mask_t, cpu_online_mask(&res,
mask), CPU_MASK_ALL, CPU_MASK_NONE, and we're done.

Boots, runs.

Name: CPU mask patch
Author: Rusty Russell
Status: Trivial
Depends: Hotcpu/migrate-to-cpu.patch.gz

D: This patch adds a cpu_mask_t for easy future expansion of cpu masks.
D: It also changes any_online_cpu to return NR_CPUS on failure, like
D: find_first_bit.

diff -urpN -I $.*$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.25.30219/include/asm-i386/smp.h linux-2.5.25.30219.updated/include/asm-i386/smp.h
--- linux-2.5.25.30219/include/asm-i386/smp.h	Thu Jun 20 01:28:51 2002
+++ linux-2.5.25.30219.updated/include/asm-i386/smp.h	Tue Jul 16 17:18:55 2002
@@ -99,14 +99,6 @@ extern inline unsigned int num_online_cp
 	return hweight32(cpu_online_map);
 }
 
-extern inline int any_online_cpu(unsigned int mask)
-{
-	if (mask & cpu_online_map)
-		return __ffs(mask & cpu_online_map);
-
-	return -1;
-}
-
 static __inline int hard_smp_processor_id(void)
 {
 	/* we don't want to mark this access volatile - bad code generation */
@@ -117,6 +109,23 @@ static __inline int logical_smp_processo
 {
 	/* we don't want to mark this access volatile - bad code generation */
 	return GET_APIC_LOGICAL_ID(*(unsigned long *)(APIC_BASE+APIC_LDR));
+}
+
+/* This has to be bitop capable, so for most archs, an unsigned long */
+typedef unsigned long cpu_mask_t;
+#define CPU_MASK_ALL (~0UL)
+#define CPU_MASK_NONE (0UL)
+
+static inline void cpu_online_mask(cpu_mask_t *res, cpu_mask_t mask)
+{
+	*res = (mask & cpu_online_map);
+}
+
+static inline unsigned int any_online_cpu(cpu_mask_t mask)
+{
+	if (mask & cpu_online_map)
+		return __ffs(mask & cpu_online_map);
+	return NR_CPUS;
 }
 
 #endif /* !__ASSEMBLY__ */
diff -urpN -I $.*$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.25.30219/include/asm-ia64/smp.h linux-2.5.25.30219.updated/include/asm-ia64/smp.h
--- linux-2.5.25.30219/include/asm-ia64/smp.h	Thu Jun 20 01:28:51 2002
+++ linux-2.5.25.30219.updated/include/asm-ia64/smp.h	Tue Jul 16 17:18:55 2002
@@ -51,12 +51,22 @@ extern inline unsigned int num_online_cp
 	return hweight64(cpu_online_map);
 }
 
-extern inline int any_online_cpu(unsigned int mask)
+/* This has to be bitop capable, so for most archs, an unsigned long */
+typedef unsigned long cpu_mask_t;
+#define CPU_MASK_ALL (~0UL)
+#define CPU_MASK_NONE (0UL)
+
+static inline void cpu_online_mask(cpu_mask_t *res, cpu_mask_t mask)
+{
+	*res = (mask & cpu_online_map);
+}
+
+static inline unsigned int any_online_cpu(cpu_mask_t mask)
 {
 	if (mask & cpu_online_map)
 		return __ffs(mask & cpu_online_map);
 
-	return -1;
+	return NR_CPUS;
 }
 
 /*
diff -urpN -I $.*$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.25.30219/include/asm-ppc/smp.h linux-2.5.25.30219.updated/include/asm-ppc/smp.h
--- linux-2.5.25.30219/include/asm-ppc/smp.h	Thu Jun 20 01:28:51 2002
+++ linux-2.5.25.30219.updated/include/asm-ppc/smp.h	Tue Jul 16 17:18:55 2002
@@ -54,12 +54,21 @@ extern inline unsigned int num_online_cp
 	return hweight32(cpu_online_map);
 }
 
-extern inline int any_online_cpu(unsigned int mask)
+typedef unsigned long cpu_mask_t;
+#define CPU_MASK_ALL (~0UL)
+#define CPU_MASK_NONE (0UL)
+
+static inline void cpu_online_mask(cpu_mask_t *res, cpu_mask_t mask)
+{
+	*res = (mask & cpu_online_map);
+}
+
+static inline unsigned int any_online_cpu(cpu_mask_t mask)
 {
 	if (mask & cpu_online_map)
 		return __ffs(mask & cpu_online_map);
 
-	return -1;
+	return NR_CPUS;
 }
 
 extern int smp_hw_index[];
diff -urpN -I $.*$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.25.30219/include/linux/init_task.h linux-2.5.25.30219.updated/include/linux/init_task.h
--- linux-2.5.25.30219/include/linux/init_task.h	Sun May 19 12:07:34 2002
+++ linux-2.5.25.30219.updated/include/linux/init_task.h	Tue Jul 16 17:18:55 2002
@@ -48,7 +48,7 @@
     prio:		MAX_PRIO-20,					
     static_prio:	MAX_PRIO-20,					
     policy:		SCHED_OTHER,					
-    cpus_allowed:	-1,						
+    cpus_allowed:	CPU_MASK_ALL,					
     mm:			NULL,						
     active_mm:		&init_mm,					
     run_list:		LIST_HEAD_INIT(tsk.run_list),			
diff -urpN -I $.*$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.25.30219/include/linux/sched.h linux-2.5.25.30219.updated/include/linux/sched.h
--- linux-2.5.25.30219/include/linux/sched.h	Tue Jul 16 17:18:52 2002
+++ linux-2.5.25.30219.updated/include/linux/sched.h	Tue Jul 16 17:18:55 2002
@@ -20,6 +20,7 @@ extern unsigned long event;
 #include <asm/page.h>
 #include <asm/ptrace.h>
 #include <asm/mmu.h>
+#include <asm/current.h>
 
 #include <linux/smp.h>
 #include <linux/sem.h>
@@ -263,7 +264,7 @@ struct task_struct {
 	unsigned long sleep_timestamp;
 
 	unsigned long policy;
-	unsigned long cpus_allowed;
+	cpu_mask_t cpus_allowed;
 	unsigned int time_slice;
 
 	struct list_head tasks;
@@ -407,12 +408,12 @@ do { if (atomic_dec_and_test(&(tsk)->usa
 #define _STK_LIM	(8*1024*1024)
 
 #if CONFIG_SMP
-extern void set_cpus_allowed(task_t *p, unsigned long new_mask);
+extern void set_cpus_allowed(task_t *p, cpu_mask_t new_mask);
 static inline void migrate_to_cpu(unsigned int cpu)
 {
-	unsigned long mask = 0;
+	cpu_mask_t mask = CPU_MASK_NONE;
 	BUG_ON(!cpu_online(cpu));
-	__set_bit(cpu, &mask);
+	__set_bit(cpu, (unsigned long *)&mask);
 	set_cpus_allowed(current, mask);
 }
 #else
@@ -483,8 +484,6 @@ static inline struct task_struct *find_t
 /* per-UID process charging. */
 extern struct user_struct * alloc_uid(uid_t);
 extern void free_uid(struct user_struct *);
-
-#include <asm/current.h>
 
 extern unsigned long itimer_ticks;
 extern unsigned long itimer_next;
diff -urpN -I $.*$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.25.30219/include/linux/smp.h linux-2.5.25.30219.updated/include/linux/smp.h
--- linux-2.5.25.30219/include/linux/smp.h	Fri Jun 21 09:41:55 2002
+++ linux-2.5.25.30219.updated/include/linux/smp.h	Tue Jul 16 17:18:55 2002
@@ -86,13 +86,16 @@ extern volatile int smp_msg_id;
 #define smp_call_function(func,info,retry,wait)	({ 0; })
 static inline void smp_send_reschedule(int cpu) { }
 static inline void smp_send_reschedule_all(void) { }
-#define cpu_online_map				1
 #define cpu_online(cpu)				1
 #define num_online_cpus()			1
 #define __per_cpu_data
 #define per_cpu(var, cpu)			var
 #define this_cpu(var)				var
-
+typedef unsigned long cpu_mask_t;
+#define CPU_MASK_ALL 1
+#define CPU_MASK_NONE 0
+#define cpu_online_mask(res,mask) do { *(res) = ((mask) & 1); } while(0)
+#define any_online_cpu(mask) (((mask) & 1) ? 0 : 1)
 #endif /* !SMP */
 
 #define get_cpu()	({ preempt_disable(); smp_processor_id(); })
diff -urpN -I $.*$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.25.30219/kernel/sched.c linux-2.5.25.30219.updated/kernel/sched.c
--- linux-2.5.25.30219/kernel/sched.c	Tue Jul 16 17:18:52 2002
+++ linux-2.5.25.30219.updated/kernel/sched.c	Tue Jul 16 17:20:35 2002
@@ -367,7 +367,8 @@ repeat_lock_task:
 		 */
 		if (unlikely(sync && (rq->curr != p) &&
 			(task_cpu(p) != smp_processor_id()) &&
-			(p->cpus_allowed & (1UL << smp_processor_id())))) {
+			test_bit(smp_processor_id(),
+				 (unsigned long *)&p->cpus_allowed))) {
 
 			set_task_cpu(p, smp_processor_id());
 			task_rq_unlock(rq, &flags);
@@ -647,7 +648,7 @@ skip_queue:
 #define CAN_MIGRATE_TASK(p,rq,this_cpu)					
 	((jiffies - (p)->sleep_timestamp > cache_decay_ticks) &&	
 		((p) != (rq)->curr) &&					
-			((p)->cpus_allowed & (1UL << (this_cpu))))
+			(test_bit((this_cpu), (unsigned long *)&(p)->cpus_allowed)))
 
 	if (!CAN_MIGRATE_TASK(tmp, busiest, this_cpu)) {
 		curr = curr->next;
@@ -1319,7 +1320,7 @@ out_unlock:
 asmlinkage int sys_sched_setaffinity(pid_t pid, unsigned int len,
 				      unsigned long *user_mask_ptr)
 {
-	unsigned long new_mask;
+	cpu_mask_t online_mask, new_mask;
 	int retval;
 	task_t *p;
 
@@ -1329,8 +1330,8 @@ asmlinkage int sys_sched_setaffinity(pid
 	if (copy_from_user(&new_mask, user_mask_ptr, sizeof(new_mask)))
 		return -EFAULT;
 
-	new_mask &= cpu_online_map;
-	if (!new_mask)
+	cpu_online_mask(&online_mask, new_mask);
+	if (find_first_bit((unsigned long *)online_mask, NR_CPUS) == NR_CPUS)
 		return -EINVAL;
 
 	read_lock(&tasklist_lock);
@@ -1355,7 +1356,7 @@ asmlinkage int sys_sched_setaffinity(pid
 		goto out_unlock;
 
 	retval = 0;
-	set_cpus_allowed(p, new_mask);
+	set_cpus_allowed(p, online_mask);
 
 out_unlock:
 	put_task_struct(p);
@@ -1372,7 +1373,7 @@ asmlinkage int sys_sched_getaffinity(pid
 				      unsigned long *user_mask_ptr)
 {
 	unsigned int real_len;
-	unsigned long mask;
+	cpu_mask_t mask;
 	int retval;
 	task_t *p;
 
@@ -1388,7 +1389,7 @@ asmlinkage int sys_sched_getaffinity(pid
 		goto out_unlock;
 
 	retval = 0;
-	mask = p->cpus_allowed & cpu_online_map;
+	cpu_online_mask(&mask, p->cpus_allowed);
 
 out_unlock:
 	read_unlock(&tasklist_lock);
@@ -1746,16 +1747,12 @@ typedef struct {
  * task must not exit() & deallocate itself prematurely.  The
  * call is not atomic; no spinlocks may be held.
  */
-void set_cpus_allowed(task_t *p, unsigned long new_mask)
+void set_cpus_allowed(task_t *p, cpu_mask_t new_mask)
 {
 	unsigned long flags;
 	migration_req_t req;
 	runqueue_t *rq;
 
-	new_mask &= cpu_online_map;
-	if (!new_mask)
-		BUG();
-
 	preempt_disable();
 	rq = task_rq_lock(p, &flags);
 	p->cpus_allowed = new_mask;
@@ -1763,7 +1760,7 @@ void set_cpus_allowed(task_t *p, unsigne
 	 * Can the task run on the task's current CPU? If not then
 	 * migrate the process off to a proper CPU.
 	 */
-	if (new_mask & (1UL << task_cpu(p))) {
+	if (test_bit(task_cpu(p), (unsigned long *)&new_mask)) {
 		task_rq_unlock(rq, &flags);
 		goto out;
 	}
@@ -1772,7 +1769,8 @@ void set_cpus_allowed(task_t *p, unsigne
 	 * it is sufficient to simply update the task's cpu field.
 	 */
 	if (!p->array && (p != rq->curr)) {
-		set_task_cpu(p, __ffs(p->cpus_allowed));
+		set_task_cpu(p, any_online_cpu(p->cpus_allowed));
+		BUG_ON(task_cpu(p) >= NR_CPUS);
 		task_rq_unlock(rq, &flags);
 		goto out;
 	}
@@ -1838,7 +1836,7 @@ static int migration_thread(void * bind_
 		spin_unlock_irqrestore(&rq->lock, flags);
 
 		p = req->task;
-		cpu_dest = __ffs(p->cpus_allowed);
+		cpu_dest = any_online_cpu(p->cpus_allowed);
 		rq_dest = cpu_rq(cpu_dest);
 repeat:
 		cpu_src = task_cpu(p);
@@ -1879,7 +1877,7 @@ void __init migration_init(void)
 				CLONE_FS | CLONE_FILES | CLONE_SIGNAL) < 0)
 			BUG();
 	}
-	current->cpus_allowed = -1L;
+	current->cpus_allowed = CPU_MASK_ALL;
 
 	for (cpu = 0; cpu < NR_CPUS; cpu++) {
 		if (!cpu_online(cpu))

--
  Anyone who quotes me in their sig is an idiot. -- Rusty Russell.

             reply	other threads:[~2002-07-16  9:10 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-07-16  8:15 Rusty Russell [this message]
  -- strict thread matches above, loose matches on Subject: below --
2002-07-10  8:34 [PATCH] cpu_mask_t Rusty Russell
2002-06-20 16:06 Rusty Russell

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=20020716091406.B7D9B42CC@lists.samba.org \
    --to=rusty@rustcorp.com.au \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=torvalds@transmeta.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox