2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2012, Peter Dinda <pdinda@northwestern.edu>
11 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Peter Dinda <pdinda@northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
20 #ifndef __VM_PERFTUNE_H__
21 #define __VM_PERFTUNE_H__
25 #include <palacios/vmm_types.h>
27 #include <palacios/vmm_time.h>
29 struct v3_yield_strategy {
31 V3_YIELD_STRATEGY_GREEDY=0, // always untimed yields
32 V3_YIELD_STRATEGY_FRIENDLY, // always timed yields with the following
33 V3_YIELD_STRATEGY_ADAPTIVE, // switch from untimed to timed after the threshold
36 uint64_t threshold_usec; // the point at which we transiton from untimed to timed yield
37 uint64_t time_usec; // the amount of time for a timed yield call
39 #define V3_DEFAULT_YIELD_STRATEGY V3_YIELD_STRATEGY_FRIENDLY
40 #define V3_DEFAULT_YIELD_THRESHOLD_USEC 100
41 #define V3_DEFAULT_YIELD_TIME_USEC 10000
47 // The idea is that the performance tuning knobs in the system are in the following
48 // structure, which is configured when the VM is created, right after extensions,
49 // using the <perftune/> subtree
51 struct v3_perf_options {
52 struct v3_yield_strategy yield_strategy;
56 int v3_setup_performance_tuning(struct v3_vm_info *vm, v3_cfg_tree_t *cfg);
58 void v3_strategy_driven_yield(struct guest_info *core, uint64_t time_since_last_did_work_usec);
60 uint64_t v3_cycle_diff_in_usec(struct guest_info *core, uint64_t earlier_cycles, uint64_t later_cycles);
62 // The following three macros are intended to make it easy to
63 // use strategy-driven yield. Call the first one when you are out of work
64 // then call the second when each time that you want to yield because you are
65 // out of work, and then call the third one when you have work to do again
67 // This assumes the thread is locked to a core and may behave strangely if
68 // this is not the case.
70 #define V3_NO_WORK(core) { \
71 uint64_t _v3_strat_local_first=0, _v3_strat_local_cur=0; \
72 _v3_strat_local_first=v3_get_host_time(core ? &(core->time_state) : 0);
75 #define V3_STILL_NO_WORK(core) \
76 _v3_strat_local_cur=v3_get_host_time(core ? &(core->time_state) : 0); \
77 v3_strategy_driven_yield(core,v3_cycle_diff_in_usec(core,_v3_strat_local_first,_v3_strat_local_cur));
79 #define V3_HAVE_WORK_AGAIN(core) }