Changeset 0313ff0 in mainline


Ignore:
Timestamp:
2006-12-14T12:35:57Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
def5207
Parents:
cd896e2
Message:

accumulate task accounting, run tests as separate kernel task

Location:
kernel/generic
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/proc/task.h

    rcd896e2 r0313ff0  
    8383        mutex_t futexes_lock;
    8484        btree_t futexes;        /**< B+tree of futexes referenced by this task. */
     85       
     86        uint64_t cycles;        /**< Accumulated accounting. */
    8587};
    8688
     
    9496extern task_t *task_find_by_id(task_id_t id);
    9597extern int task_kill(task_id_t id);
     98extern uint64_t task_get_accounting(task_t *t);
    9699
    97100
  • kernel/generic/src/console/cmd.c

    rcd896e2 r0313ff0  
    5757#include <mm/tlb.h>
    5858#include <arch/mm/tlb.h>
     59#include <mm/as.h>
    5960#include <mm/frame.h>
    6061#include <main/version.h>
     
    859860}
    860861
    861 static bool run_test(const test_t * test)
    862 {
    863         printf("%s\t\t%s\n", test->name, test->desc);
     862static void test_wrapper(void *arg)
     863{
     864        test_t *test = (test_t *) arg;
    864865       
    865866        /* Update and read thread accounting
    866867           for benchmarking */
    867868        ipl_t ipl = interrupts_disable();
    868         spinlock_lock(&THREAD->lock);
    869         thread_update_accounting();
    870         uint64_t t0 = THREAD->cycles;
    871         spinlock_unlock(&THREAD->lock);
     869        spinlock_lock(&TASK->lock);
     870        uint64_t t0 = task_get_accounting(TASK);
     871        spinlock_unlock(&TASK->lock);
    872872        interrupts_restore(ipl);
    873873       
     
    877877        /* Update and read thread accounting */
    878878        ipl = interrupts_disable();
    879         spinlock_lock(&THREAD->lock);
    880         thread_update_accounting();
    881         uint64_t dt = THREAD->cycles - t0;
    882         spinlock_unlock(&THREAD->lock);
     879        spinlock_lock(&TASK->lock);
     880        uint64_t dt = task_get_accounting(TASK) - t0;
     881        spinlock_unlock(&TASK->lock);
    883882        interrupts_restore(ipl);
    884883       
     
    887886        if (ret == NULL) {
    888887                printf("Test passed\n");
    889                 return true;
     888//              return true;
     889                return;
    890890        }
    891891
    892892        printf("%s\n", ret);
    893         return false;
     893//      return false;
     894}
     895
     896static bool run_test(const test_t *test)
     897{
     898        printf("%s\t\t%s\n", test->name, test->desc);
     899       
     900        /* Create separate task and thread
     901           for the test */
     902        task_t *ta = task_create(AS_KERNEL, "test");
     903        if (ta == NULL) {
     904                printf("Unable to create test task\n");
     905                return false;
     906        }
     907       
     908        thread_t *t = thread_create(test_wrapper, (void *) test, ta, 0, "test_main");
     909        if (t == NULL) {
     910                printf("Unable to create test main thread\n");
     911                task_destroy(ta);
     912                return false;
     913        }
     914       
     915        /* Run the test */
     916        thread_ready(t);
     917        thread_join(t);
     918        thread_detach(t);
     919       
     920        return true;
    894921}
    895922
  • kernel/generic/src/main/kinit.c

    rcd896e2 r0313ff0  
    162162                }
    163163
    164                 task_t *utask = task_run_program((void *) init.tasks[i].addr, "USPACE");
     164                task_t *utask = task_run_program((void *) init.tasks[i].addr, "uspace");
    165165                if (utask) {
    166166                        /*
  • kernel/generic/src/main/main.c

    rcd896e2 r0313ff0  
    260260         * Create kernel task.
    261261         */
    262         k = task_create(AS_KERNEL, "KERNEL");
     262        k = task_create(AS_KERNEL, "kernel");
    263263        if (!k)
    264264                panic("can't create kernel task\n");
  • kernel/generic/src/proc/task.c

    rcd896e2 r0313ff0  
    120120        ta->capabilities = 0;
    121121        ta->accept_new_threads = true;
     122        ta->cycles = 0;
    122123       
    123124        ipc_answerbox_init(&ta->answerbox);
     
    267268}
    268269
     270/** Get accounting data of given task.
     271 *
     272 * Note that task_lock on @t must be already held and
     273 * interrupts must be already disabled.
     274 *
     275 * @param t Pointer to thread.
     276 *
     277 */
     278uint64_t task_get_accounting(task_t *t)
     279{
     280        /* Accumulated value of task */
     281        uint64_t ret = t->cycles;
     282       
     283        /* Current values of threads */
     284        link_t *cur;
     285        for (cur = t->th_head.next; cur != &t->th_head; cur = cur->next) {
     286                thread_t *thr = list_get_instance(cur, thread_t, th_link);
     287               
     288                spinlock_lock(&thr->lock);
     289               
     290                if (thr == THREAD) /* Update accounting of current thread */
     291                        thread_update_accounting();
     292                ret += thr->cycles;
     293               
     294                spinlock_unlock(&thr->lock);
     295        }
     296       
     297        return ret;
     298}
     299
    269300/** Kill task.
    270301 *
     
    345376        spinlock_lock(&tasks_lock);
    346377       
    347         printf("taskid name       ctx address    as         active calls callee\n");
    348         printf("------ ---------- --- ---------- ---------- ------------ ------>\n");
     378        printf("taskid name       ctx address    as         cycles     threads calls callee\n");
     379        printf("------ ---------- --- ---------- ---------- ---------- ------- ------ ------>\n");
    349380
    350381        for (cur = tasks_btree.leaf_head.next; cur != &tasks_btree.leaf_head; cur = cur->next) {
     
    360391               
    361392                        spinlock_lock(&t->lock);
    362                         printf("%-6lld %-10s %-3ld %#10zx %#10zx %12zd", t->taskid, t->name, t->context, t, t->as, atomic_get(&t->active_calls));
     393                       
     394                        uint64_t cycles = task_get_accounting(t);
     395                        char suffix;
     396                       
     397                        if (cycles > 1000000000000000000LL) {
     398                                cycles = cycles / 1000000000000000000LL;
     399                                suffix = 'E';
     400                        } else if (cycles > 1000000000000LL) {
     401                                cycles = cycles / 1000000000000LL;
     402                                suffix = 'T';
     403                        } else if (cycles > 1000000LL) {
     404                                cycles = cycles / 1000000LL;
     405                                suffix = 'M';
     406                        } else
     407                                suffix = ' ';
     408                       
     409                        printf("%-6lld %-10s %-3ld %#10zx %#10zx %9llu%c %7zd %6zd", t->taskid, t->name, t->context, t, t->as, cycles, suffix, t->refcount, atomic_get(&t->active_calls));
    363410                        for (j = 0; j < IPC_MAX_PHONES; j++) {
    364411                                if (t->phones[j].callee)
     
    366413                        }
    367414                        printf("\n");
     415                       
    368416                        spinlock_unlock(&t->lock);
    369417                }
  • kernel/generic/src/proc/thread.c

    rcd896e2 r0313ff0  
    114114        THREAD->last_cycle = get_cycle();
    115115
    116         /* this is where each thread wakes up after its creation */
     116        /* This is where each thread wakes up after its creation */
    117117        spinlock_unlock(&THREAD->lock);
    118118        interrupts_enable();
    119119
    120120        f(arg);
     121       
     122        /* Accumulate accounting to the task */
     123        ipl_t ipl = interrupts_disable();
     124       
     125        spinlock_lock(&THREAD->lock);
     126        thread_update_accounting();
     127        uint64_t cycles = THREAD->cycles;
     128        THREAD->cycles = 0;
     129        spinlock_unlock(&THREAD->lock);
     130       
     131        spinlock_lock(&TASK->lock);
     132        TASK->cycles += cycles;
     133        spinlock_unlock(&TASK->lock);
     134       
     135        interrupts_restore(ipl);
     136       
    121137        thread_exit();
    122138        /* not reached */
     
    534550        spinlock_lock(&threads_lock);
    535551       
    536         printf("tid    name       address    state    task       ctx code       stack      cycles     cpu  kst        wq\n");
     552        printf("tid    name       address    state    task       ctx code       stack      cycles     cpu  kstack     waitqueue\n");
    537553        printf("------ ---------- ---------- -------- ---------- --- ---------- ---------- ---------- ---- ---------- ----------\n");
    538554
     
    604620 * interrupts must be already disabled.
    605621 *
    606  * @param t Pointer to thread.
    607  *
    608622 */
    609623void thread_update_accounting(void)
Note: See TracChangeset for help on using the changeset viewer.