Changeset f76fed4 in mainline


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
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/src/fpu_context.c

    rddcf365 rf76fed4  
    3535void fpu_context_save(fpu_context_t *fctx)
    3636{
    37         /* Align on 16-byte boundary */
    38         if (((__u64)fctx) & 0xf)
    39                 fctx = (fpu_context_t *)((((__u64)fctx) | 0xf) + 1);
    40 
    4137        __asm__ volatile (
    4238                "fxsave %0"
     
    4844void fpu_context_restore(fpu_context_t *fctx)
    4945{
    50         /* Align on 16-byte boundary */
    51         if (((__u64)fctx) & 0xf)
    52                 fctx = (fpu_context_t *)((((__u64)fctx) | 0xf) + 1);
    5346        __asm__ volatile (
    5447                "fxrstor %0"
     
    5750}
    5851
    59 void fpu_init(fpu_context_t *fctx)
     52void fpu_init()
    6053{
    6154        /* TODO: Zero all SSE, MMX etc. registers */
  • arch/ia32/include/fpu_context.h

    rddcf365 rf76fed4  
    3232#include <arch/types.h>
    3333
     34#define ARCH_HAS_FPU
     35#define FPU_CONTEXT_ALIGN 16
     36
    3437struct fpu_context {
    3538        /* TODO: We need malloc that aligns structures on 16-byte boundary */
    36         __u8 fpu[512+16];               /* FXSAVE & FXRSTOR storage area */
     39        __u8 fpu[512];          /* FXSAVE & FXRSTOR storage area */
    3740};
    3841
  • arch/ia32/src/fpu_context.c

    rddcf365 rf76fed4  
    4949}
    5050
    51 void fpu_init(fpu_context_t *fctx)
     51void fpu_init()
    5252{
    5353        __asm__ volatile (
  • arch/mips32/include/fpu_context.h

    rddcf365 rf76fed4  
    3232#include <arch/types.h>
    3333
     34#define ARCH_HAS_FPU
     35#define FPU_CONTEXT_ALIGN    sizeof(__native)
     36
    3437struct fpu_context {
    3538        __native dregs[32];
  • arch/mips32/src/fpu_context.c

    rddcf365 rf76fed4  
    5151}
    5252
    53 void fpu_init(fpu_context_t *fctx)
     53void fpu_init()
    5454{
    5555        /* TODO: Zero all registers */
  • generic/include/fpu_context.h

    rddcf365 rf76fed4  
    3434#include <typedefs.h>
    3535
     36#if defined(CONFIG_FPU_LAZY) && !defined(ARCH_HAS_FPU)
     37# error "CONFIG_FPU_LAZY defined, but no ARCH_HAS_FPU"
     38#endif
     39
    3640extern void fpu_context_save(fpu_context_t *);
    3741extern void fpu_context_restore(fpu_context_t *);
    38 extern void fpu_init(fpu_context_t *);
     42extern void fpu_init(void);
    3943extern void fpu_enable(void);
    4044extern void fpu_disable(void);
  • generic/include/proc/thread.h

    rddcf365 rf76fed4  
    4040#include <config.h>
    4141#include <adt/list.h>
     42#include <mm/slab.h>
    4243
    4344#define THREAD_STACK_SIZE       STACK_SIZE
     
    8384        volatile int timeout_pending;           /**< Flag signalling sleep timeout in progress. */
    8485
    85         fpu_context_t saved_fpu_context;
     86        fpu_context_t *saved_fpu_context;
    8687        int fpu_context_exists;
    8788
     
    136137extern void thread_destroy(thread_t *t);
    137138
     139
     140/* Fpu context slab cache */
     141extern slab_cache_t *fpu_context_slab;
     142
    138143#endif
  • 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.