1/** 2 * \file 3 * \brief Spawns an instance of self on every core, 4 * runs boot time performance tests, 5 * adds the results to skb. 6 */ 7 8/* 9 * Copyright (c) 2010, ETH Zurich and Mircosoft Corporation. 10 * All rights reserved. 11 * 12 * This file is distributed under the terms in the attached LICENSE file. 13 * If you do not find this file, copies can be found by writing to: 14 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group. 15 */ 16 17#include <stdio.h> 18#include "internal.h" 19 20int global_argc; 21char **global_argv; 22coreid_t my_core_id; 23 24void exit_msg(struct boot_perfmon_binding *b) 25{ 26 exit(0); 27} 28 29static void tests_cb(void) 30{ 31 errval_t err; 32 33 for (int i = 0; i < coreset_count(set); i++) { 34 if (i == my_core_id) { 35 continue; 36 } 37 38 // Have the other nodes exit 39 struct boot_perfmon_binding *b; 40 err = relations_get(rel, i, &b); 41 if (err_is_fail(err)) { 42 USER_PANIC_ERR(err, "relations_get failed"); 43 } 44 err = boot_perfmon_exit__tx(b, NOP_CONT); 45 if (err_is_fail(err)) { 46 USER_PANIC_ERR(err, "sending exit failed"); 47 } 48 49 // Print results 50 printf("With core %d, avg %"PRIuCYCLES", variance %"PRIuCYCLES"\n", i, 51 bench_avg(timestamp[i].time, MAX_COUNT), 52 bench_variance(timestamp[i].time, MAX_COUNT)); 53 } 54 55 exit(0); 56} 57 58static void connect_cb(void) 59{ 60 errval_t err; 61 62 /* Perform tests */ 63 if (check_leader()) { 64 err = tests(tests_cb); 65 if (err_is_fail(err)) { 66 USER_PANIC_ERR(err, "connect failed"); 67 } 68 } 69} 70 71static void spawn_cb(void) 72{ 73 errval_t err; 74 75 /* Establish connections */ 76 err = connect(connect_cb); 77 if (err_is_fail(err)) { 78 USER_PANIC_ERR(err, "connect failed"); 79 } 80} 81 82static void leader_cb(void) 83{ 84 errval_t err; 85 86 /* Spawn */ 87 err = spawn(spawn_cb); 88 if (err_is_fail(err)) { 89 USER_PANIC_ERR(err, "spawn failed"); 90 } 91} 92 93int main(int argc, char *argv[]) 94{ 95 errval_t err; 96 97 global_argc = argc; 98 global_argv = argv; 99 my_core_id = disp_get_core_id(); 100 bench_init(); 101 102 err = skb_client_connect(); 103 if (err_is_fail(err)) { 104 USER_PANIC_ERR(err, "skb_client_connect failed"); 105 } 106 107 /* Set leader */ 108 err = set_leader(leader_cb); 109 if (err_is_fail(err)) { 110 USER_PANIC_ERR(err, "set_leader failed"); 111 } 112 113 messages_handler_loop(); 114} 115