Changeset f76fed4 in mainline for generic/src


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:
09c18f78
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
Location:
generic/src/proc
Files:
2 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);
  • generic/src/proc/thread.c

    rddcf365 rf76fed4  
    6464
    6565static slab_cache_t *thread_slab;
     66#ifdef ARCH_HAS_FPU
     67slab_cache_t *fpu_context_slab;
     68#endif
    6669
    6770
     
    104107        link_initialize(&t->threads_link);
    105108       
     109#ifdef ARCH_HAS_FPU
     110#  ifdef CONFIG_FPU_LAZY
     111        t->saved_fpu_context = NULL;
     112#  else
     113        t->saved_fpu_context = slab_alloc(fpu_context_slab,kmflags);
     114        if (!t->saved_fpu_context)
     115                return -1;
     116#  endif
     117#endif 
     118
    106119        pfn = frame_alloc_rc(ONE_FRAME, FRAME_KA | kmflags,&status);
    107         if (status)
     120        if (status) {
     121#ifdef ARCH_HAS_FPU
     122                if (t->saved_fpu_context)
     123                        slab_free(fpu_context_slab,t->saved_fpu_context);
     124#endif
    108125                return -1;
     126        }
    109127        t->kstack = (__u8 *)PA2KA(PFN2ADDR(pfn));
    110128
     
    118136
    119137        frame_free(ADDR2PFN(KA2PA(t->kstack)));
     138#ifdef ARCH_HAS_FPU
     139        if (t->saved_fpu_context)
     140                slab_free(fpu_context_slab,t->saved_fpu_context);
     141#endif
    120142        return 1; /* One page freed */
    121143}
     
    133155                                        sizeof(thread_t),0,
    134156                                        thr_constructor, thr_destructor, 0);
     157#ifdef ARCH_HAS_FPU
     158        fpu_context_slab = slab_cache_create("fpu_slab",
     159                                             sizeof(fpu_context_t),
     160                                             FPU_CONTEXT_ALIGN,
     161                                             NULL, NULL, 0);
     162#endif
    135163}
    136164
Note: See TracChangeset for help on using the changeset viewer.