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, Universitaetstrasse 6, 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