Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/proc/scheduler.c

    r55b77d9 rb4dc35a  
    237237                 * Take the first thread from the queue.
    238238                 */
    239                 thread_t *thread = list_get_instance(
    240                     list_first(&CPU->rq[i].rq), thread_t, rq_link);
     239                thread_t *thread =
     240                    list_get_instance(CPU->rq[i].rq_head.next, thread_t, rq_link);
    241241                list_remove(&thread->rq_link);
    242242               
     
    273273static void relink_rq(int start)
    274274{
    275         list_t list;
    276        
    277         list_initialize(&list);
     275        link_t head;
     276       
     277        list_initialize(&head);
    278278        irq_spinlock_lock(&CPU->lock, false);
    279279       
     
    284284                       
    285285                        irq_spinlock_lock(&CPU->rq[i + 1].lock, false);
    286                         list_concat(&list, &CPU->rq[i + 1].rq);
     286                        list_concat(&head, &CPU->rq[i + 1].rq_head);
    287287                        size_t n = CPU->rq[i + 1].n;
    288288                        CPU->rq[i + 1].n = 0;
     
    292292                       
    293293                        irq_spinlock_lock(&CPU->rq[i].lock, false);
    294                         list_concat(&CPU->rq[i].rq, &list);
     294                        list_concat(&CPU->rq[i].rq_head, &head);
    295295                        CPU->rq[i].n += n;
    296296                        irq_spinlock_unlock(&CPU->rq[i].lock, false);
     
    376376        context_save(&CPU->saved_context);
    377377        context_set(&CPU->saved_context, FADDR(scheduler_separated_stack),
    378             (uintptr_t) CPU->stack, STACK_SIZE);
     378            (uintptr_t) CPU->stack, CPU_STACK_SIZE);
    379379        context_restore(&CPU->saved_context);
    380380       
     
    586586         * Searching least priority queues on all CPU's first and most priority
    587587         * queues on all CPU's last.
     588         *
    588589         */
    589590        size_t acpu;
     
    616617                       
    617618                        /* Search rq from the back */
    618                         link_t *link = cpu->rq[rq].rq.head.prev;
    619                        
    620                         while (link != &(cpu->rq[rq].rq.head)) {
    621                                 thread = (thread_t *) list_get_instance(link,
    622                                     thread_t, rq_link);
     619                        link_t *link = cpu->rq[rq].rq_head.prev;
     620                       
     621                        while (link != &(cpu->rq[rq].rq_head)) {
     622                                thread = (thread_t *) list_get_instance(link, thread_t, rq_link);
    623623                               
    624624                                /*
    625                                  * Do not steal CPU-wired threads, threads
    626                                  * already stolen, threads for which migration
    627                                  * was temporarily disabled or threads whose
    628                                  * FPU context is still in the CPU.
     625                                 * We don't want to steal CPU-wired threads
     626                                 * neither threads already stolen. The latter
     627                                 * prevents threads from migrating between CPU's
     628                                 * without ever being run. We don't want to
     629                                 * steal threads whose FPU context is still in
     630                                 * CPU.
     631                                 *
    629632                                 */
    630633                                irq_spinlock_lock(&thread->lock, false);
    631634                               
    632                                 if (!(thread->flags & THREAD_FLAG_WIRED) &&
    633                                     !(thread->flags & THREAD_FLAG_STOLEN) &&
    634                                     !thread->nomigrate &&
    635                                     !thread->fpu_context_engaged) {
     635                                if ((!(thread->flags & (THREAD_FLAG_WIRED | THREAD_FLAG_STOLEN)))
     636                                    && (!(thread->fpu_context_engaged))) {
    636637                                        /*
    637638                                         * Remove thread from ready queue.
    638639                                         */
    639                                         irq_spinlock_unlock(&thread->lock,
    640                                             false);
     640                                        irq_spinlock_unlock(&thread->lock, false);
    641641                                       
    642642                                        atomic_dec(&cpu->nrdy);
     
    660660                                 */
    661661                               
    662                                 irq_spinlock_pass(&(cpu->rq[rq].lock),
    663                                     &thread->lock);
     662                                irq_spinlock_pass(&(cpu->rq[rq].lock), &thread->lock);
    664663                               
    665664#ifdef KCPULB_VERBOSE
     
    740739                       
    741740                        printf("\trq[%u]: ", i);
    742                         list_foreach(cpus[cpu].rq[i].rq, cur) {
    743                                 thread_t *thread = list_get_instance(cur,
    744                                     thread_t, rq_link);
     741                        link_t *cur;
     742                        for (cur = cpus[cpu].rq[i].rq_head.next;
     743                            cur != &(cpus[cpu].rq[i].rq_head);
     744                            cur = cur->next) {
     745                                thread_t *thread = list_get_instance(cur, thread_t, rq_link);
    745746                                printf("%" PRIu64 "(%s) ", thread->tid,
    746747                                    thread_states[thread->state]);
Note: See TracChangeset for help on using the changeset viewer.