Skip to content

Commit 27afa12

Browse files
author
Jon Ludlam
authored
Merge pull request #207 from robhoes/sidewinder
Introduce PVinPVH mode
2 parents ed14734 + f0ac28a commit 27afa12

File tree

2 files changed

+216
-1
lines changed

2 files changed

+216
-1
lines changed

memory/memory.ml

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
(*
2+
* Copyright (C) 2006-2009 Citrix Systems Inc.
3+
*
4+
* This program is free software; you can redistribute it and/or modify
5+
* it under the terms of the GNU Lesser General Public License as published
6+
* by the Free Software Foundation; version 2.1 only. with the special
7+
* exception on linking described in file LICENSE.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU Lesser General Public License for more details.
13+
*)
14+
(** Functions relating to memory requirements of Xen domains *)
15+
16+
let ( +++ ) = Int64.add
17+
let ( --- ) = Int64.sub
18+
let ( *** ) = Int64.mul
19+
let ( /// ) = Int64.div
20+
21+
(* === Memory conversion factors ============================================ *)
22+
23+
let bytes_per_kib = 1024L
24+
let bytes_per_mib = 1048576L
25+
let bytes_per_page = 4096L
26+
let kib_per_page = bytes_per_page /// bytes_per_kib
27+
let kib_per_mib = 1024L
28+
let pages_per_mib = bytes_per_mib /// bytes_per_page
29+
30+
(* === Arithmetic functions ================================================= *)
31+
32+
(** Returns true if (and only if) the specified argument is a power of 2. *)
33+
let is_power_of_2 n =
34+
(n > 0) && (n land (0 - n) = n)
35+
36+
let round_down_to_multiple_of x y =
37+
(x /// y) *** y
38+
39+
let round_up_to_multiple_of x y =
40+
((x +++ y --- 1L) /// y) *** y
41+
42+
(* === Memory rounding functions ============================================ *)
43+
44+
let round_up = round_up_to_multiple_of
45+
let round_down = round_down_to_multiple_of
46+
47+
let round_bytes_down_to_nearest_page_boundary v = round_down v bytes_per_page
48+
let round_bytes_down_to_nearest_mib v = round_down v bytes_per_mib
49+
let round_kib_down_to_nearest_page_boundary v = round_down v kib_per_page
50+
let round_kib_up_to_nearest_page_boundary v = round_up v kib_per_page
51+
let round_kib_up_to_nearest_mib v = round_up v kib_per_mib
52+
let round_pages_up_to_nearest_mib v = round_up v pages_per_mib
53+
54+
(* === Division functions =================================================== *)
55+
56+
let divide_rounding_down numerator denominator =
57+
numerator /// denominator
58+
59+
let divide_rounding_up numerator denominator =
60+
(numerator +++ denominator --- 1L) /// denominator
61+
62+
(* === Memory unit conversion functions ===================================== *)
63+
64+
let bytes_of_kib value = value *** bytes_per_kib
65+
let bytes_of_pages value = value *** bytes_per_page
66+
let bytes_of_mib value = value *** bytes_per_mib
67+
let kib_of_mib value = value *** kib_per_mib
68+
let kib_of_pages value = value *** kib_per_page
69+
let pages_of_mib value = value *** pages_per_mib
70+
71+
let kib_of_bytes_free value = divide_rounding_down value bytes_per_kib
72+
let pages_of_bytes_free value = divide_rounding_down value bytes_per_page
73+
let pages_of_kib_free value = divide_rounding_down value kib_per_page
74+
let mib_of_bytes_free value = divide_rounding_down value bytes_per_mib
75+
let mib_of_kib_free value = divide_rounding_down value kib_per_mib
76+
let mib_of_pages_free value = divide_rounding_down value pages_per_mib
77+
78+
let kib_of_bytes_used value = divide_rounding_up value bytes_per_kib
79+
let pages_of_bytes_used value = divide_rounding_up value bytes_per_page
80+
let pages_of_kib_used value = divide_rounding_up value kib_per_page
81+
let mib_of_bytes_used value = divide_rounding_up value bytes_per_mib
82+
let mib_of_kib_used value = divide_rounding_up value kib_per_mib
83+
let mib_of_pages_used value = divide_rounding_up value pages_per_mib
84+
85+
(* === Domain memory breakdown ======================================================= *)
86+
87+
(* ╤ ╔══════════╗ ╤ *)
88+
(* │ ║ shadow ║ │ *)
89+
(* │ ╠══════════╣ │ *)
90+
(* overhead │ ║ extra ║ │ *)
91+
(* │ ║ external ║ │ *)
92+
(* │ ╠══════════╣ ╤ │ *)
93+
(* │ ║ extra ║ │ │ *)
94+
(* │ ║ internal ║ │ │ *)
95+
(* │ ╠══════════╣ ╤ ╤ ╤ │ │ footprint *)
96+
(* │ ║ shim ║ │ │ │ │ │ *)
97+
(* ╪ ╠══════════╣ ╧ ╧ ╤ │ │ xen │ *)
98+
(* │ ║ video ║ │ │ actual │ maximum │ *)
99+
(* │ ╠══════════╣ ╤ ╤ │ │ / │ │ *)
100+
(* │ ║ ║ │ │ build │ target │ total │ │ *)
101+
(* │ ║ guest ║ │ │ start │ │ │ │ *)
102+
(* static │ ║ ║ │ │ │ │ │ │ *)
103+
(* maximum │ ╟──────────╢ │ ╧ ╧ ╧ ╧ ╧ *)
104+
(* │ ║ ║ │ *)
105+
(* │ ║ ║ │ *)
106+
(* │ ║ balloon ║ │ build *)
107+
(* │ ║ ║ │ maximum *)
108+
(* │ ║ ║ │ *)
109+
(* ╧ ╚══════════╝ ╧ *)
110+
111+
(* === Domain memory breakdown: HVM guests =========================================== *)
112+
113+
module type MEMORY_MODEL_DATA = sig
114+
val extra_internal_mib : int64
115+
val extra_external_mib : int64
116+
val shim_mib : int64 -> int64
117+
val can_start_ballooned_down : bool
118+
end
119+
120+
module HVM_memory_model_data : MEMORY_MODEL_DATA = struct
121+
let extra_internal_mib = 1L
122+
let extra_external_mib = 1L
123+
let shim_mib _ = 0L
124+
let can_start_ballooned_down = true
125+
end
126+
127+
module Linux_memory_model_data : MEMORY_MODEL_DATA = struct
128+
let extra_internal_mib = 0L
129+
let extra_external_mib = 1L
130+
let shim_mib _ = 0L
131+
let can_start_ballooned_down = true
132+
end
133+
134+
module PVinPVH_memory_model_data : MEMORY_MODEL_DATA = struct
135+
let extra_internal_mib = 1L
136+
let extra_external_mib = 1L
137+
let shim_mib static_max_mib = 20L +++ (static_max_mib /// 110L)
138+
let can_start_ballooned_down = false
139+
end
140+
141+
type memory_config = {
142+
build_max_mib : int64;
143+
build_start_mib : int64;
144+
xen_max_mib : int64;
145+
shadow_mib : int64;
146+
required_host_free_mib : int64;
147+
overhead_mib : int64;
148+
}
149+
150+
module Memory_model (D : MEMORY_MODEL_DATA) = struct
151+
152+
let build_max_mib static_max_mib video_mib =
153+
static_max_mib ---
154+
(Int64.of_int video_mib) +++
155+
(D.shim_mib static_max_mib)
156+
157+
let build_start_mib static_max_mib target_mib video_mib =
158+
if D.can_start_ballooned_down then
159+
target_mib ---
160+
(Int64.of_int video_mib) +++
161+
(D.shim_mib target_mib)
162+
else
163+
build_max_mib static_max_mib video_mib
164+
165+
let xen_max_offset_mib = D.extra_internal_mib
166+
167+
let xen_max_mib static_max_mib =
168+
static_max_mib +++
169+
xen_max_offset_mib +++
170+
(D.shim_mib static_max_mib)
171+
172+
let shadow_mib static_max_mib vcpu_count multiplier =
173+
let vcpu_pages = 256L *** (Int64.of_int vcpu_count) in
174+
let p2m_map_pages = static_max_mib in
175+
let shadow_resident_pages = static_max_mib in
176+
let total_mib = mib_of_pages_used
177+
(vcpu_pages +++ p2m_map_pages +++ shadow_resident_pages) in
178+
let total_mib_multiplied =
179+
Int64.of_float ((Int64.to_float total_mib) *. multiplier) in
180+
max 1L total_mib_multiplied
181+
182+
let overhead_mib static_max_mib vcpu_count multiplier =
183+
D.extra_internal_mib +++
184+
D.extra_external_mib +++
185+
(shadow_mib static_max_mib vcpu_count multiplier) +++
186+
(D.shim_mib static_max_mib)
187+
188+
let footprint_mib target_mib static_max_mib vcpu_count multiplier =
189+
target_mib +++ (overhead_mib static_max_mib vcpu_count multiplier)
190+
191+
let shadow_multiplier_default = 1.0
192+
193+
let full_config static_max_mib video_mib target_mib vcpus shadow_multiplier =
194+
{
195+
build_max_mib = build_max_mib static_max_mib video_mib;
196+
build_start_mib = build_start_mib static_max_mib target_mib video_mib;
197+
xen_max_mib = xen_max_mib static_max_mib;
198+
shadow_mib = shadow_mib static_max_mib vcpus shadow_multiplier;
199+
required_host_free_mib = footprint_mib target_mib static_max_mib vcpus shadow_multiplier;
200+
overhead_mib = overhead_mib static_max_mib vcpus shadow_multiplier;
201+
}
202+
end
203+
204+
module HVM = Memory_model (HVM_memory_model_data)
205+
module Linux = Memory_model (Linux_memory_model_data)
206+
module PVinPVH = Memory_model (PVinPVH_memory_model_data)

xen/xenops_types.ml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ module Vm = struct
153153
type builder_info =
154154
| HVM of hvm_info
155155
| PV of pv_info
156+
| PVinPVH of pv_info
156157
[@@deriving rpc, sexp]
157158

158159
let default_builder_info = HVM default_hvm_info
@@ -240,6 +241,13 @@ module Vm = struct
240241
path: string;
241242
} [@@deriving rpc, sexp]
242243

244+
type domain_type =
245+
| Domain_HVM
246+
| Domain_PV
247+
| Domain_PVinPVH
248+
| Domain_undefined
249+
[@@deriving rpc, sexp]
250+
243251
type state = {
244252
power_state: TopLevel.power_state;
245253
domids: int list;
@@ -257,7 +265,8 @@ module Vm = struct
257265
last_start_time: float;
258266
hvm: bool;
259267
nomigrate: bool; (* true: VM must not migrate *)
260-
nested_virt: bool (* true: VM uses nested virtualisation *)
268+
nested_virt: bool; (* true: VM uses nested virtualisation *)
269+
domain_type: domain_type;
261270
} [@@deriving rpc, sexp]
262271

263272
end

0 commit comments

Comments
 (0)