* [PATCH] updated O(1) scheduler for 2.4 @ 2002-05-21 0:06 Robert Love 2002-05-24 16:02 ` J.A. Magallon 0 siblings, 1 reply; 7+ messages in thread From: Robert Love @ 2002-05-21 0:06 UTC (permalink / raw) To: linux-kernel Updated versions of the O(1) scheduler for 2.4 are available at: http://www.kernel.org/pub/linux/kernel/people/rml/sched/ingo-O1/sched-O1-rml-2.4.18-4.patch http://www.kernel.org/pub/linux/kernel/people/rml/sched/ingo-O1/sched-O1-rml-2.4.19-pre8-1.patch for 2.4.18 and 2.4.19-pre8. Please use a mirror. These patches include all included and pending bits from 2.4-ac and 2.5 as well as my user-configurable maximum RT priority patch. This is more up-to-date than any other tree, in fact. ;-) In general, I recommend using 2.4-ac or waiting for 2.6 if you want the O(1) scheduler - this is not suggested for inclusion in 2.4 - but for those who care, here it is. Enjoy, Robert Love ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] updated O(1) scheduler for 2.4 2002-05-21 0:06 [PATCH] updated O(1) scheduler for 2.4 Robert Love @ 2002-05-24 16:02 ` J.A. Magallon 2002-05-29 2:57 ` Robert Love 0 siblings, 1 reply; 7+ messages in thread From: J.A. Magallon @ 2002-05-24 16:02 UTC (permalink / raw) To: Robert Love; +Cc: linux-kernel On 2002.05.21 Robert Love wrote: >Updated versions of the O(1) scheduler for 2.4 are available at: > >http://www.kernel.org/pub/linux/kernel/people/rml/sched/ingo-O1/sched-O1-rml-2.4.18-4.patch >http://www.kernel.org/pub/linux/kernel/people/rml/sched/ingo-O1/sched-O1-rml-2.4.19-pre8-1.patch > >for 2.4.18 and 2.4.19-pre8. Please use a mirror. > >These patches include all included and pending bits from 2.4-ac and 2.5 >as well as my user-configurable maximum RT priority patch. This is more >up-to-date than any other tree, in fact. ;-) > I had to make this to get it built: diff -urN linux-2.4.19-pre7/init/do_mounts.c linux/init/do_mounts.c --- linux-2.4.19-pre7/init/do_mounts.c Sat Apr 20 20:50:36 2002 +++ linux/init/do_mounts.c Mon Apr 22 14:18:20 2002 @@ -774,10 +774,8 @@ pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD); if (pid > 0) { - while (pid != wait(&i)) { - current->policy |= SCHED_YIELD; - schedule(); - } + while (pid != wait(&i)) + yield(); } sys_mount("..", ".", NULL, MS_MOVE, NULL); diff -urN linux-2.4.19-pre7/arch/m68k/mm/fault.c linux/arch/m68k/mm/fault.c --- linux-2.4.19-pre7/arch/m68k/mm/fault.c Sat Apr 20 20:50:47 2002 +++ linux/arch/m68k/mm/fault.c Mon Apr 22 14:19:29 2002 @@ -181,8 +181,7 @@ out_of_memory: up_read(&mm->mmap_sem); if (current->pid == 1) { - current->policy |= SCHED_YIELD; - schedule(); + yield(); down_read(&mm->mmap_sem); goto survive; } diff -urN linux-2.4.19-pre7/arch/mips/mm/fault.c linux/arch/mips/mm/fault.c --- linux-2.4.19-pre7/arch/mips/mm/fault.c Sat Apr 20 20:50:46 2002 +++ linux/arch/mips/mm/fault.c Mon Apr 22 14:19:15 2002 @@ -211,8 +211,7 @@ out_of_memory: up_read(&mm->mmap_sem); if (tsk->pid == 1) { - tsk->policy |= SCHED_YIELD; - schedule(); + yield(); down_read(&mm->mmap_sem); goto survive; } diff -urN linux-2.4.19-pre7/arch/mips64/mm/fault.c linux/arch/mips64/mm/fault.c --- linux-2.4.19-pre7/arch/mips64/mm/fault.c Sat Apr 20 20:50:47 2002 +++ linux/arch/mips64/mm/fault.c Mon Apr 22 14:19:55 2002 @@ -240,8 +240,7 @@ out_of_memory: up_read(&mm->mmap_sem); if (tsk->pid == 1) { - tsk->policy |= SCHED_YIELD; - schedule(); + yield(); down_read(&mm->mmap_sem); goto survive; } and this to shut up gcc-3.1 about trying to EXPORT_ or use something undeclared: --- linux-2.4.19-pre8-jam4/include/linux/sched.h.orig 2002-05-24 16:56:16.000000000 +0200 +++ linux-2.4.19-pre8-jam4/include/linux/sched.h 2002-05-24 17:02:12.000000000 +0200 @@ -644,6 +644,8 @@ extern void FASTCALL(interruptible_sleep_on(wait_queue_head_t *q)); extern long FASTCALL(interruptible_sleep_on_timeout(wait_queue_head_t *q, signed long timeout)); +extern int FASTCALL(wake_up_process(task_t * p)); +extern void FASTCALL(wake_up_forked_process(task_t * p)); #define wake_up(x) __wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1) #define wake_up_nr(x, nr) __wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr) -- J.A. Magallon # Let the source be with you... mailto:jamagallon@able.es Mandrake Linux release 8.3 (Cooker) for i586 Linux werewolf 2.4.19-pre8-jam4 #4 SMP vie may 24 17:02:32 CEST 2002 i686 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] updated O(1) scheduler for 2.4 2002-05-24 16:02 ` J.A. Magallon @ 2002-05-29 2:57 ` Robert Love 2002-05-29 15:15 ` Andrea Arcangeli 0 siblings, 1 reply; 7+ messages in thread From: Robert Love @ 2002-05-29 2:57 UTC (permalink / raw) To: J.A. Magallon; +Cc: linux-kernel On Fri, 2002-05-24 at 09:02, J.A. Magallon wrote: > I had to make this to get it built: > <snip> Thanks, I have put these changes into the 2.4.19-pre9 version of the patch which is available at: http://www.kernel.org/pub/linux/kernel/people/rml/sched/ingo-O1/sched-O1-rml-2.4.19-pre9-1.patch Hopefully Alan will put out a 2.4.19-pre9-ac1 with the last of the bits I pushed him. Robert Love ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] updated O(1) scheduler for 2.4 2002-05-29 2:57 ` Robert Love @ 2002-05-29 15:15 ` Andrea Arcangeli 2002-05-29 18:03 ` Robert Love 0 siblings, 1 reply; 7+ messages in thread From: Andrea Arcangeli @ 2002-05-29 15:15 UTC (permalink / raw) To: Robert Love; +Cc: J.A. Magallon, linux-kernel On Tue, May 28, 2002 at 07:57:00PM -0700, Robert Love wrote: > On Fri, 2002-05-24 at 09:02, J.A. Magallon wrote: > > > I had to make this to get it built: > > <snip> > > Thanks, I have put these changes into the 2.4.19-pre9 version of the > patch which is available at: > > http://www.kernel.org/pub/linux/kernel/people/rml/sched/ingo-O1/sched-O1-rml-2.4.19-pre9-1.patch I merged it and I've almost finished moving everything on top of it but I've a few issues. can you elaborate why you __save_flags in do_fork? do_fork is even a blocking operation. fork_by_hand runs as well with irq enabled. I don't like to safe flags in a fast path if it's not required. Then there are longstanding bugs that aren't yet fixed and I ported the fixed on top of it (see the parent-timeslice patch in -aa). the child-run first approch in o1 is suspect, it seems the parent will keep running just after a wasteful reschedule, a sched yield instead should be invoked like in -aa in the share-timeslice patch in order to roll the current->run_list before the schedule is invoked while returning to userspace after fork. another suspect thing I noticed is the wmb() in resched_task. Can you elaborate on what is it trying to serialize (I hope not the read of p->need_resched with the stuff below)? Also if something it should be a smp_wmb(), same smp_ prefix goes for the other mb() in schedule. thanks, Andrea ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] updated O(1) scheduler for 2.4 2002-05-29 15:15 ` Andrea Arcangeli @ 2002-05-29 18:03 ` Robert Love 2002-05-29 19:13 ` Andrea Arcangeli 0 siblings, 1 reply; 7+ messages in thread From: Robert Love @ 2002-05-29 18:03 UTC (permalink / raw) To: Andrea Arcangeli; +Cc: J.A. Magallon, linux-kernel On Wed, 2002-05-29 at 08:15, Andrea Arcangeli wrote: > I merged it and I've almost finished moving everything on top of it but > I've a few issues. > > can you elaborate why you __save_flags in do_fork? do_fork is even a > blocking operation. fork_by_hand runs as well with irq enabled. > I don't like to safe flags in a fast path if it's not required. s/you/Ingo/ ;) We save flags for two reasons: First, we touch task->time_slice which is touched from an interrupt handler (timer/idle/scheduler_tick) and second because we may call scheduler_tick which must be called with interrupts off. Note we restore them just a few lines later... Or, hm, are you asking why not just cli/sti? I don't know the answer to that... I would think we always enter do_fork with interrupts enabled, but maybe Ingo thought otherwise. > Then there are longstanding bugs that aren't yet fixed and I ported the > fixed on top of it (see the parent-timeslice patch in -aa). > > the child-run first approch in o1 is suspect, it seems the parent will > keep running just after a wasteful reschedule, a sched yield instead > should be invoked like in -aa in the share-timeslice patch in order to > roll the current->run_list before the schedule is invoked while > returning to userspace after fork. I do not see this... > another suspect thing I noticed is the wmb() in resched_task. Can you > elaborate on what is it trying to serialize (I hope not the read of > p->need_resched with the stuff below)? Also if something it should be a > smp_wmb(), same smp_ prefix goes for the other mb() in schedule. I suspect you may be right here. I believe the wmb() is to serialize the reading of need_resched vs the writing of need_resched below it vs whatever may happen to need_resched elsewhere. But resched_task is the only bit from 2.5 I have not fully back ported...take a look at resched_task in 2.5: I need to bring that to 2.4. I suspect idle polling is broken in 2.4, too. > thanks, You are welcome ;) Robert Love ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] updated O(1) scheduler for 2.4 2002-05-29 18:03 ` Robert Love @ 2002-05-29 19:13 ` Andrea Arcangeli 2002-05-29 19:58 ` Robert Love 0 siblings, 1 reply; 7+ messages in thread From: Andrea Arcangeli @ 2002-05-29 19:13 UTC (permalink / raw) To: Robert Love; +Cc: J.A. Magallon, linux-kernel On Wed, May 29, 2002 at 11:03:14AM -0700, Robert Love wrote: > On Wed, 2002-05-29 at 08:15, Andrea Arcangeli wrote: > > > I merged it and I've almost finished moving everything on top of it but > > I've a few issues. > > > > can you elaborate why you __save_flags in do_fork? do_fork is even a > > blocking operation. fork_by_hand runs as well with irq enabled. > > I don't like to safe flags in a fast path if it's not required. > > s/you/Ingo/ ;) > > We save flags for two reasons: First, we touch task->time_slice which is > touched from an interrupt handler (timer/idle/scheduler_tick) and second > because we may call scheduler_tick which must be called with interrupts > off. Note we restore them just a few lines later... > > Or, hm, are you asking why not just cli/sti? I don't know the answer to of course, I'm asking why not cli/sti, see my current status of incrmental fixes on top of the o1 scheduler, some old in -aa, some from -ac (I dropped an optimization from you, I assume it's ok but quite frankly I don't care about the performance of setting the cpu affinity and I preferred to stay safe in sync with -ac and 2.5), some new noticed while mering (and still uncertain about the questions). also the force_cpu_reschedule from the 2.5 rcu-poll was buggy and that's fixed too now in my tree. beware I cannot test anything yet, the tree still doesn't compile, it seems the last thing to make uml link is to update the init_task, then I will also need to do the same for x86-64 at least, and possibly other archs if Robert didn't took care of them. after x86-64 and uml works I will check sparc64 alpha and finally x86 smp + up. diff -urNp o1-sched-ref/include/linux/wait.h o1-sched/include/linux/wait.h --- o1-sched-ref/include/linux/wait.h Wed May 29 19:58:06 2002 +++ o1-sched/include/linux/wait.h Wed May 29 20:17:12 2002 @@ -59,6 +59,7 @@ typedef struct __wait_queue wait_queue_t # define wq_write_lock_irq write_lock_irq # define wq_write_lock_irqsave write_lock_irqsave # define wq_write_unlock_irqrestore write_unlock_irqrestore +# define wq_write_unlock_irq write_unlock_irq # define wq_write_unlock write_unlock #else # define wq_lock_t spinlock_t @@ -71,6 +72,7 @@ typedef struct __wait_queue wait_queue_t # define wq_write_lock_irq spin_lock_irq # define wq_write_lock_irqsave spin_lock_irqsave # define wq_write_unlock_irqrestore spin_unlock_irqrestore +# define wq_write_unlock_irq spin_unlock_irq # define wq_write_unlock spin_unlock #endif diff -urNp o1-sched-ref/kernel/sched.c o1-sched/kernel/sched.c --- o1-sched-ref/kernel/sched.c Wed May 29 20:16:59 2002 +++ o1-sched/kernel/sched.c Wed May 29 20:17:07 2002 @@ -850,15 +850,15 @@ void complete(struct completion *x) { unsigned long flags; - spin_lock_irqsave(&x->wait.lock, flags); + wq_write_lock_irqsave(&x->wait.lock, flags); x->done++; __wake_up_common(&x->wait, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1); - spin_unlock_irqrestore(&x->wait.lock, flags); + wq_write_unlock_irqrestore(&x->wait.lock, flags); } void wait_for_completion(struct completion *x) { - spin_lock_irq(&x->wait.lock); + wq_write_lock_irq(&x->wait.lock); if (!x->done) { DECLARE_WAITQUEUE(wait, current); @@ -866,14 +866,14 @@ void wait_for_completion(struct completi __add_wait_queue_tail(&x->wait, &wait); do { __set_current_state(TASK_UNINTERRUPTIBLE); - spin_unlock_irq(&x->wait.lock); + wq_write_unlock_irq(&x->wait.lock); schedule(); - spin_lock_irq(&x->wait.lock); + wq_write_lock_irq(&x->wait.lock); } while (!x->done); __remove_wait_queue(&x->wait, &wait); } x->done--; - spin_unlock_irq(&x->wait.lock); + wq_write_unlock_irq(&x->wait.lock); } #define SLEEP_ON_VAR \ @@ -1499,8 +1499,8 @@ typedef struct { * is removed from the allowed bitmask. * * NOTE: the caller must have a valid reference to the task, the - * task must not exit() & deallocate itself prematurely. The - * call is not atomic; no spinlocks may be held. + * task must not exit() & deallocate itself prematurely. No + * spinlocks can be held. */ void set_cpus_allowed(task_t *p, unsigned long new_mask) { @@ -1523,16 +1523,6 @@ void set_cpus_allowed(task_t *p, unsigne return; } - /* - * If the task is not on a runqueue, then it is safe to - * simply update the task's cpu field. - */ - if (!p->array) { - p->cpu = __ffs(p->cpus_allowed); - task_rq_unlock(rq, &flags); - return; - } - init_MUTEX_LOCKED(&req.sem); req.task = p; list_add(&req.list, &rq->migration_queue); --- ./kernel/sched.c.~1~ Wed May 29 04:50:30 2002 +++ ./kernel/sched.c Wed May 29 05:22:04 2002 @@ -569,7 +569,7 @@ skip_queue: #define CAN_MIGRATE_TASK(p,rq,this_cpu) \ ((jiffies - (p)->sleep_timestamp > cache_decay_ticks) && \ ((p) != (rq)->curr) && \ - ((p)->cpus_allowed & (1 << (this_cpu)))) + ((p)->cpus_allowed & (1UL << (this_cpu)))) if (!CAN_MIGRATE_TASK(tmp, busiest, this_cpu)) { curr = curr->next; --- sched2/kernel/sched.c.~1~ Wed May 29 17:24:52 2002 +++ sched2/kernel/sched.c Wed May 29 17:34:22 2002 @@ -248,7 +248,6 @@ static inline void resched_task(task_t * int need_resched; need_resched = p->need_resched; - wmb(); set_tsk_need_resched(p); if (!need_resched && (p->cpu != smp_processor_id())) smp_send_reschedule(p->cpu); @@ -794,7 +793,7 @@ switch_tasks: * if the new task was last running on a different * CPU - thus re-load it. */ - mb(); + smp_mb(); rq = this_rq(); spin_unlock_irq(&rq->frozen); } else { --- sched2/kernel/fork.c.~1~ Wed May 29 17:24:52 2002 +++ sched2/kernel/fork.c Wed May 29 17:34:39 2002 @@ -712,7 +712,6 @@ int do_fork(unsigned long clone_flags, u * total amount of pending timeslices in the system doesnt change, * resulting in more scheduling fairness. */ - __save_flags(flags); __cli(); if (!current->time_slice) BUG(); @@ -728,7 +727,7 @@ int do_fork(unsigned long clone_flags, u scheduler_tick(0,0); } p->sleep_timestamp = jiffies; - __restore_flags(flags); + __sti(); /* * Ok, add it to the run-queues and make it diff -urNp o1-sched-ref/include/linux/sched.h o1-sched/include/linux/sched.h --- o1-sched-ref/include/linux/sched.h Wed May 29 17:36:11 2002 +++ o1-sched/include/linux/sched.h Wed May 29 17:36:32 2002 @@ -371,6 +371,7 @@ struct task_struct { unsigned long policy; unsigned long cpus_allowed; unsigned int time_slice; + int get_child_timeslice; task_t *next_task, *prev_task; diff -urNp o1-sched-ref/kernel/exit.c o1-sched/kernel/exit.c --- o1-sched-ref/kernel/exit.c Wed May 29 17:36:10 2002 +++ o1-sched/kernel/exit.c Wed May 29 17:36:32 2002 @@ -231,6 +231,7 @@ static inline void forget_original_paren else p->p_opptr = reaper; + p->get_child_timeslice = 0; if (p->pdeath_signal) send_sig(p->pdeath_signal, p, 0); } } diff -urNp o1-sched-ref/kernel/fork.c o1-sched/kernel/fork.c --- o1-sched-ref/kernel/fork.c Wed May 29 17:36:21 2002 +++ o1-sched/kernel/fork.c Wed May 29 17:36:49 2002 @@ -729,6 +729,8 @@ int do_fork(unsigned long clone_flags, u } p->sleep_timestamp = jiffies; __sti(); + /* Tell the parent if it can get back its timeslice when child exits */ + p->get_child_timeslice = 1; /* * Ok, add it to the run-queues and make it diff -urNp o1-sched-ref/kernel/sched.c o1-sched/kernel/sched.c --- o1-sched-ref/kernel/sched.c Wed May 29 17:36:21 2002 +++ o1-sched/kernel/sched.c Wed May 29 17:36:32 2002 @@ -360,9 +360,11 @@ void wake_up_forked_process(task_t * p) void sched_exit(task_t * p) { __cli(); - current->time_slice += p->time_slice; - if (unlikely(current->time_slice > MAX_TIMESLICE)) - current->time_slice = MAX_TIMESLICE; + if (p->get_child_timeslice) { + current->time_slice += p->time_slice; + if (unlikely(current->time_slice > MAX_TIMESLICE)) + current->time_slice = MAX_TIMESLICE; + } __sti(); /* * If the child was a (relative-) CPU hog then decrease @@ -673,6 +675,7 @@ void scheduler_tick(int user_tick, int s */ if ((p->policy == SCHED_RR) && !--p->time_slice) { p->time_slice = TASK_TIMESLICE(p); + p->get_child_timeslice = 0; set_tsk_need_resched(p); /* put it at the end of the queue: */ @@ -696,6 +699,7 @@ void scheduler_tick(int user_tick, int s set_tsk_need_resched(p); p->prio = effective_prio(p); p->time_slice = TASK_TIMESLICE(p); + p->get_child_timeslice = 0; if (!TASK_INTERACTIVE(p) || EXPIRED_STARVING(rq)) { if (!rq->expired_timestamp) diff -urNp o1-sched/include/linux/sched.h o1-sched-child-first/include/linux/sched.h --- o1-sched/include/linux/sched.h Wed May 29 17:36:32 2002 +++ o1-sched-child-first/include/linux/sched.h Wed May 29 17:40:12 2002 @@ -509,6 +509,7 @@ extern void set_user_nice(task_t *p, lon extern int task_prio(task_t *p); extern int task_nice(task_t *p); +extern void __sched_yield(void); asmlinkage long sys_sched_yield(void); #define yield() sys_sched_yield() diff -urNp o1-sched/kernel/fork.c o1-sched-child-first/kernel/fork.c --- o1-sched/kernel/fork.c Wed May 29 17:42:11 2002 +++ o1-sched-child-first/kernel/fork.c Wed May 29 17:40:47 2002 @@ -770,12 +770,14 @@ int do_fork(unsigned long clone_flags, u ++total_forks; if (clone_flags & CLONE_VFORK) wait_for_completion(&vfork); - else + else { /* * Let the child process run first, to avoid most of the * COW overhead when the child exec()s afterwards. */ + __sched_yield(); current->need_resched = 1; + } fork_out: return retval; diff -urNp o1-sched/kernel/sched.c o1-sched-child-first/kernel/sched.c --- o1-sched/kernel/sched.c Wed May 29 17:36:32 2002 +++ o1-sched-child-first/kernel/sched.c Wed May 29 17:39:57 2002 @@ -1182,7 +1182,7 @@ out_unlock: return retval; } -asmlinkage long sys_sched_yield(void) +void __sched_yield(void) { runqueue_t *rq; prio_array_t *array; @@ -1215,6 +1215,11 @@ asmlinkage long sys_sched_yield(void) __set_bit(current->prio, array->bitmap); } spin_unlock(&rq->lock); +} + +asmlinkage long sys_sched_yield(void) +{ + __sched_yield(); schedule(); > that... I would think we always enter do_fork with interrupts enabled, > but maybe Ingo thought otherwise. > > > Then there are longstanding bugs that aren't yet fixed and I ported the > > fixed on top of it (see the parent-timeslice patch in -aa). > > > > the child-run first approch in o1 is suspect, it seems the parent will > > keep running just after a wasteful reschedule, a sched yield instead > > should be invoked like in -aa in the share-timeslice patch in order to > > roll the current->run_list before the schedule is invoked while > > returning to userspace after fork. > > I do not see this... see the above serie of patches, again it may be broken, still untested yet. > > another suspect thing I noticed is the wmb() in resched_task. Can you > > elaborate on what is it trying to serialize (I hope not the read of > > p->need_resched with the stuff below)? Also if something it should be a > > smp_wmb(), same smp_ prefix goes for the other mb() in schedule. > > I suspect you may be right here. I believe the wmb() is to serialize > the reading of need_resched vs the writing of need_resched below it vs > whatever may happen to need_resched elsewhere. I actually removed it enterely, need_resched will be fore sure read before overwriting it because it's guaranteed by reading and writing to the same mem address. still I wonder if the other cpu will see the need_resched set when it goes to read it, I can imagine a needed wmb() on the writer cpu and an rmb() in the reader, hopefully it serializes via the spinlocks, I didn't touch this area, but if the wmb() was meant to be after need_resced = 1, that had to be one line below, so still it would be a bug, the wmb() in such place looks superflous so I dropped it until somebody comments. > > But resched_task is the only bit from 2.5 I have not fully back > ported...take a look at resched_task in 2.5: I need to bring that to > 2.4. I suspect idle polling is broken in 2.4, too. your version looks ok at first glance. Andrea ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] updated O(1) scheduler for 2.4 2002-05-29 19:13 ` Andrea Arcangeli @ 2002-05-29 19:58 ` Robert Love 0 siblings, 0 replies; 7+ messages in thread From: Robert Love @ 2002-05-29 19:58 UTC (permalink / raw) To: Andrea Arcangeli; +Cc: linux-kernel On Wed, 2002-05-29 at 12:13, Andrea Arcangeli wrote: > of course, I'm asking why not cli/sti, see my current status of > incrmental fixes on top of the o1 scheduler, some old in -aa, some from > -ac Right. I suspect Ingo knew something, otherwise he would not of used the save/restore variant... but it is good to remove it if we can. > (I dropped an optimization from you, I assume it's ok but quite > frankly I don't care about the performance of setting the cpu affinity > and I preferred to stay safe in sync with -ac and 2.5), Well, that optimize is not just for benefiting the affinity syscalls but any caller of set_cpus_allowed ... but OK. However, it is now in 2.5.19 and should be in 2.4.19-pre9-ac1 as I pushed it to Alan. > some new noticed > while mering (and still uncertain about the questions). also the > force_cpu_reschedule from the 2.5 rcu-poll was buggy and that's fixed > too now in my tree. > > beware I cannot test anything yet, the tree still doesn't compile, it seems > the last thing to make uml link is to update the init_task, then I will > also need to do the same for x86-64 at least, and possibly other archs > if Robert didn't took care of them. after x86-64 and uml works I will > check sparc64 alpha and finally x86 smp + up. There are missing bits from non-x86 architectures. I am going to get to that next but as I only have x86 it will be slow. I suspect it is very easy, however - just grabbing the bitop instructions from include/asm. I deliberately did not backport any changes that had significant arch-specific ramifications. > --- ./kernel/sched.c.~1~ Wed May 29 04:50:30 2002 > +++ ./kernel/sched.c Wed May 29 05:22:04 2002 > @@ -569,7 +569,7 @@ skip_queue: > #define CAN_MIGRATE_TASK(p,rq,this_cpu) \ > ((jiffies - (p)->sleep_timestamp > cache_decay_ticks) && \ > ((p) != (rq)->curr) && \ > - ((p)->cpus_allowed & (1 << (this_cpu)))) > + ((p)->cpus_allowed & (1UL << (this_cpu)))) > > if (!CAN_MIGRATE_TASK(tmp, busiest, this_cpu)) { > curr = curr->next; Ahh, good eye... > see the above serie of patches, again it may be broken, still untested yet. I need to look into your patches and the current behavior, as I do not see anything broken with the current implementation. > I actually removed it enterely, need_resched will be fore sure read > before overwriting it because it's guaranteed by reading and writing to > the same mem address. > > still I wonder if the other cpu will see the need_resched set when it > goes to read it, I can imagine a needed wmb() on the writer cpu and an rmb() in > the reader, hopefully it serializes via the spinlocks, I didn't touch > this area, but if the wmb() was meant to be after need_resced = 1, that > had to be one line below, so still it would be a bug, the wmb() in such > place looks superflous so I dropped it until somebody comments. Best to ask Ingo his intentions here. > > But resched_task is the only bit from 2.5 I have not fully back > > ported...take a look at resched_task in 2.5: I need to bring that to > > 2.4. I suspect idle polling is broken in 2.4, too. > > your version looks ok at first glance. Regards, Robert Love ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2002-05-29 19:58 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2002-05-21 0:06 [PATCH] updated O(1) scheduler for 2.4 Robert Love 2002-05-24 16:02 ` J.A. Magallon 2002-05-29 2:57 ` Robert Love 2002-05-29 15:15 ` Andrea Arcangeli 2002-05-29 18:03 ` Robert Love 2002-05-29 19:13 ` Andrea Arcangeli 2002-05-29 19:58 ` Robert Love
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox