1/** 2 * \file 3 * \brief This file queries the local monitor for its latency data to all other cores 4 */ 5 6/* 7 * Copyright (c) 2007, 2008, 2009, ETH Zurich. 8 * All rights reserved. 9 * 10 * This file is distributed under the terms in the attached LICENSE file. 11 * If you do not find this file, copies can be found by writing to: 12 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group. 13 */ 14 15#include <barrelfish/barrelfish.h> 16#include <barrelfish/monitor_client.h> 17#include <skb/skb.h> 18#include "datagatherer.h" 19 20 21struct measurement_data { 22 uint64_t avg; 23 uint64_t var; 24 uint64_t min; 25 uint64_t max; 26 uint64_t to_core; 27 uint64_t from_core; 28}; 29 30static struct measurement_data measurements[MAX_CPUS]; 31static int nr_valid_measurements = 0; 32static int nr_expected_measurements = 0; 33 34bool rtt_done; 35 36static void rtt_value(struct monitor_client_response *st, 37 uint64_t from_core, uint64_t to_core, uint64_t avg, 38 uint64_t var, uint64_t min, uint64_t max) 39{ 40/* 41 printf("message_rtt(%lu, %lu, %lu, %lu, %lu, %lu).\n", 42 from_core, to_core, avg, var, min, max); 43 skb_add_fact("message_rtt(%lu, %lu, %lu, %lu, %lu, %lu).", 44 from_core, to_core, avg, var, min, max); 45*/ 46 measurements[nr_valid_measurements].avg = avg; 47 measurements[nr_valid_measurements].var = var; 48 measurements[nr_valid_measurements].min = min; 49 measurements[nr_valid_measurements].max = max; 50 measurements[nr_valid_measurements].to_core = to_core; 51 measurements[nr_valid_measurements].from_core = from_core; 52 nr_valid_measurements++; 53 54 if (nr_valid_measurements == nr_expected_measurements) { 55 for (int i = 0; i < nr_valid_measurements; i++) { 56 skb_add_fact("message_rtt(%lu, %lu, %lu, %lu, %lu, %lu).", 57 measurements[i].from_core, 58 measurements[i].to_core, 59 measurements[i].avg, 60 measurements[i].var, 61 measurements[i].min, 62 measurements[i].max); 63 } 64 } 65 66 rtt_done = true; 67} 68 69static void nr_rtt_values(struct monitor_client_response *st, uint64_t nr) 70{ 71 nr_expected_measurements = nr; 72 errval_t err = st->call_vtbl->get_rtt_values(st); 73 if (err_is_fail(err)) { 74 DEBUG_ERR(err, "get_rtt_values\n"); 75 } 76} 77 78void gather_rtt_data(struct monitor_client_response *st) 79{ 80 /* Set handlers */ 81 get_monitor_closure()->f->rtt_value = rtt_value; 82 get_monitor_closure()->f->nr_rtt_values = nr_rtt_values; 83 84 errval_t err = st->call_vtbl->get_nr_rtt_values(st); 85 if (err_is_fail(err)) { 86 DEBUG_ERR(err, "get_nr_rtt_values\n"); 87 } 88} 89