Changeset f76fed4 in mainline for generic/src/proc/scheduler.c


Ignore:
Timestamp:
2006-03-03T00:20:31Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
09c18f7
Parents:
ddcf365
Message:

Added lazy fpu context allocation.

  • threads that don't use fpu, don't get allocated fpu context
  • fpu context alignment on AMD64 nicely disappeared
File:
1 edited

Legend:

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

    rddcf365 rf76fed4  
    6464{
    6565        before_thread_runs_arch();
    66         #ifdef CONFIG_FPU_LAZY
     66#ifdef CONFIG_FPU_LAZY
    6767        if(THREAD==CPU->fpu_owner)
    6868                fpu_enable();
    6969        else
    7070                fpu_disable();
    71         #else
     71#else
    7272        fpu_enable();
    7373        if (THREAD->fpu_context_exists)
    74                 fpu_context_restore(&(THREAD->saved_fpu_context));
     74                fpu_context_restore(THREAD->saved_fpu_context);
    7575        else {
    76                 fpu_init(&(THREAD->saved_fpu_context));
     76                fpu_init();
    7777                THREAD->fpu_context_exists=1;
    7878        }
    79         #endif
     79#endif
    8080}
    8181
     
    103103        if (CPU->fpu_owner != NULL) { 
    104104                spinlock_lock(&CPU->fpu_owner->lock);
    105                 fpu_context_save(&CPU->fpu_owner->saved_fpu_context);
     105                fpu_context_save(CPU->fpu_owner->saved_fpu_context);
    106106                /* don't prevent migration */
    107107                CPU->fpu_owner->fpu_context_engaged=0;
     
    111111        spinlock_lock(&THREAD->lock);
    112112        if (THREAD->fpu_context_exists) {
    113                 fpu_context_restore(&THREAD->saved_fpu_context);
     113                fpu_context_restore(THREAD->saved_fpu_context);
    114114        } else {
    115                 fpu_init(&(THREAD->saved_fpu_context));
     115                /* Allocate FPU context */
     116                if (!THREAD->saved_fpu_context) {
     117                        /* Might sleep */
     118                        spinlock_unlock(&THREAD->lock);
     119                        THREAD->saved_fpu_context = slab_alloc(fpu_context_slab,
     120                                                               0);
     121                        spinlock_lock(&THREAD->lock);
     122                }
     123                fpu_init();
    116124                THREAD->fpu_context_exists=1;
    117125        }
     
    275283        if (THREAD) {
    276284                spinlock_lock(&THREAD->lock);
    277                 #ifndef CONFIG_FPU_LAZY
    278                 fpu_context_save(&(THREAD->saved_fpu_context));
    279                 #endif
     285#ifndef CONFIG_FPU_LAZY
     286                fpu_context_save(THREAD->saved_fpu_context);
     287#endif
    280288                if (!context_save(&THREAD->saved_context)) {
    281289                        /*
     
    422430                        as_switch(as1, as2);
    423431                }
    424                 TASK = THREAD->task;   
     432                TASK = THREAD->task;
    425433        }
    426434
    427435        THREAD->state = Running;
    428436
    429         #ifdef SCHEDULER_VERBOSE
     437#ifdef SCHEDULER_VERBOSE
    430438        printf("cpu%d: tid %d (priority=%d,ticks=%d,nrdy=%d)\n", CPU->id, THREAD->tid, THREAD->priority, THREAD->ticks, atomic_get(&CPU->nrdy));
    431         #endif 
     439#endif 
    432440
    433441        /*
     
    547555                                 */
    548556                                spinlock_lock(&t->lock);
    549                                 #ifdef KCPULB_VERBOSE
     557#ifdef KCPULB_VERBOSE
    550558                                printf("kcpulb%d: TID %d -> cpu%d, nrdy=%d, avg=%d\n", CPU->id, t->tid, CPU->id, atomic_get(&CPU->nrdy), atomic_get(&nrdy) / config.cpu_active);
    551                                 #endif
     559#endif
    552560                                t->flags |= X_STOLEN;
    553561                                spinlock_unlock(&t->lock);
Note: See TracChangeset for help on using the changeset viewer.