2 * \brief Process Management test.
6 * Copyright (c) 2017, ETH Zurich.
9 * This file is distributed under the terms in the attached LICENSE file.
10 * If you do not find this file, copies can be found by writing to:
11 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
16 #include <barrelfish/barrelfish.h>
17 #include <barrelfish/deferred.h>
18 #include <barrelfish/proc_mgmt_client.h>
19 #include <bench/bench.h>
21 #define PROC_MGMT_BENCH 1
22 #define PROC_MGMT_BENCH_MIN_RUNS 120
27 static void test_spawn(coreid_t core_id, char *argv[],
28 struct capref *ret_domain_cap)
30 assert(ret_domain_cap != NULL);
32 errval_t err = proc_mgmt_spawn_program(core_id,
33 "/x86_64/sbin/proc_mgmt_test",
34 argv, NULL, 0, ret_domain_cap);
36 // printf("OK: my_id=%i, spawn(%u, proc_mgmt_test)\n", my_id, core_id);
38 // printf("FAIL: spawn(%u, proc_mgmt_test), err=%s\n", core_id,
39 // err_getstring(err));
43 // static void test_span(coreid_t core_id)
45 // errval_t err = proc_mgmt_span(core_id);
46 // if (err_is_ok(err)) {
47 // printf("OK: span(%u)\n", core_id);
49 // printf("FAIL: span(%u), err=%s\n", core_id, err_getstring(err));
53 // static void test_kill(struct capref domain_cap)
55 // errval_t err = proc_mgmt_kill(domain_cap);
56 // if (err_is_ok(err)) {
57 // printf("OK: kill\n");
59 // printf("FAIL: kill, err=%s\n", err_getstring(err));
63 // static void test_wait(struct capref domain_cap)
66 // errval_t err = proc_mgmt_wait(domain_cap, &code);
67 // if (err_is_ok(err)) {
68 // printf("OK: wait, code=%u\n", code);
70 // printf("FAIL: wait, err=%s\n", err_getstring(err));
74 static inline cycles_t calculate_time(cycles_t tsc_start, cycles_t tsc_end)
77 if (tsc_end < tsc_start) {
78 result = (LONG_MAX - tsc_start) + tsc_end - bench_tscoverhead();
80 result = (tsc_end - tsc_start - bench_tscoverhead());
85 int main(int argc, char **argv)
90 cycles_t tsc_start, tsc_end;
94 bench_ctl_t *ctl = calloc(1, sizeof(*ctl));
95 ctl->mode = BENCH_MODE_FIXEDRUNS;
96 ctl->result_dimensions = 1;
97 ctl->min_runs = PROC_MGMT_BENCH_MIN_RUNS;
98 ctl->data = calloc(ctl->min_runs * ctl->result_dimensions,
101 errval_t err = sys_debug_get_tsc_per_ms(&tscperus);
102 assert(err_is_ok(err));
105 coreid_t target_core = 0;//strcmp(argv[1], "1") == 0 ? 1 : 2;
106 char *spawn_argv[] = { "proc_mgmt_test", "noop", NULL };
107 my_id = atoi(argv[1]);
108 struct capref domain_cap;
109 // total_ids = atoi(argv[2]);
111 barrelfish_usleep((0 - 10 * my_id) * 1000 * 1000);
113 // ctl = bench_ctl_init(BENCH_MODE_FIXEDRUNS, 1, 100);
115 // debug_printf("BEFORE test_spawn\n");
116 tsc_start = bench_tsc();
118 test_spawn(target_core, spawn_argv, &domain_cap);
119 // test_wait(domain_cap);
121 tsc_end = bench_tsc();
122 result = calculate_time(tsc_start, tsc_end);
124 barrelfish_usleep(2 * 1000 * 1000);
125 }while (!bench_ctl_add_run(ctl, &result));
128 bench_ctl_dump_analysis(ctl, 0, "client", tscperus);
130 bench_ctl_destroy(ctl);
132 barrelfish_usleep(5 * 1000 * 1000);
135 printf("TEST DONE\n");
138 // errval_t err = event_dispatch(get_default_waitset());
139 // if(err_is_fail(err)) {
140 // USER_PANIC_ERR(err, "event_dispatch");
145 // printf("HELLO from proc_mgmt_test, argc=%u\n", argc);
148 // struct capref domain_cap_0;
149 // char *argv_0[] = { "proc_mgmt_test", "1", NULL };
150 // test_spawn(0, argv_0, &domain_cap_0);
151 // barrelfish_usleep(5*1000*1000);
153 // test_kill(domain_cap_0);
154 // test_wait(domain_cap_0);
155 // // barrelfish_usleep(0 * 1*1*1);
157 // struct capref domain_cap_1;
158 // char *argv_1[] = { "proc_mgmt_test", "1", "2", NULL };
159 // test_spawn(1, argv_1, &domain_cap_1);
160 // test_wait(domain_cap_1);
162 // printf("TEST DONE\n");
163 // // barrelfish_usleep(5*1000*1000);
165 // // err = proc_mgmt_kill(domain_cap);
166 // // if (err_is_fail(err)) {
167 // // USER_PANIC_ERR(err, "failed to kill proc_mgmt_test");
170 // // uint8_t status;
171 // // err = proc_mgmt_wait(domain_cap, &status);
172 // // printf("2nd proc_mgmt_test finished with status %u\n", status);
173 // } else if (argc == 2) {
174 // // test_span(disp_get_core_id() == 0 ? 1 : 0);
176 // // // struct capability ret;
177 // // // err = debug_cap_identify(cap_domainid, &ret);
178 // // // if (err_is_fail(err)) {
179 // // // USER_PANIC_ERR(err, "failed to identify cap_domainid");
181 // // // assert(ret.type == ObjType_Domain);
182 // // // printf("proc_mgmt_test: cap_domainid = { .coreid=%u, .core_local_id=%u "
183 // // // "}\n", ret.u.domain.coreid, ret.u.domain.core_local_id);
185 // // // coreid_t other_core = disp_get_core_id() == 0 ? 1 : 0;
186 // // // err = proc_mgmt_span(other_core);//domain_new_dispatcher(other_core, span_cb, NULL);
187 // // // if (err_is_fail(err)) {
188 // // // USER_PANIC_ERR(err, "failed to span proc_mgmt_test on core %u\n",
189 // // // other_core);
192 // // // barrelfish_usleep(5*1000*1000);
193 // // // printf("Main dispatcher exiting...\n");
196 // errval_t err = event_dispatch(get_default_waitset());
197 // if(err_is_fail(err)) {
198 // USER_PANIC_ERR(err, "event_dispatch");
202 // // barrelfish_usleep(5 * 1000 * 1000);
203 // // We'll just exit normally here, spawner should be waiting for us.