diff --git a/Dockerfile b/Dockerfile index 43d1adb..c09868d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,14 +2,14 @@ # It will probably still work on newer images, though, unless Debian # changes some compiler optimisations (unlikely). #FROM ocurrent/opam:alpine-3.10-ocaml-4.10 -FROM ocurrent/opam@sha256:d30098ff92b5ee10cf7c11c17f2351705e5226a6b05aa8b9b7280b3d87af9cde +FROM ocurrent/opam@sha256:4546b41a99b54f163af435327c86f88d06346f2a059f0f42bea431b37329ea8d # Pin last known-good version for reproducible builds. # Remove this line (and the base image pin above) if you want to test with the # latest versions. -RUN cd ~/opam-repository && git fetch origin master && git reset --hard e81ab2996896b21cba74c43a903b305a5a6341ef && opam update +RUN cd ~/opam-repository && git fetch origin master && git reset --hard 6ef290f5681b7ece5d9c085bcf0c55268c118292 && opam update -RUN opam depext -i -y mirage.3.8.0 lwt.5.3.0 +RUN opam depext -i -y mirage RUN mkdir /home/opam/qubes-mirage-firewall ADD config.ml /home/opam/qubes-mirage-firewall/config.ml WORKDIR /home/opam/qubes-mirage-firewall diff --git a/build-with-docker.sh b/build-with-docker.sh index 9820d15..ed8e5e6 100755 --- a/build-with-docker.sh +++ b/build-with-docker.sh @@ -5,5 +5,5 @@ docker build -t qubes-mirage-firewall . echo Building Firewall... docker run --rm -i -v `pwd`:/home/opam/qubes-mirage-firewall qubes-mirage-firewall echo "SHA2 of build: $(sha256sum qubes_firewall.xen)" -echo "SHA2 last known: 0f6b41fa3995afccff1809cb893c45c0863477d4dfacc441c11e3382bec31d39" +echo "SHA2 last known: a635ead410ffb72abb8b44e8c5f8f2cfc8752c4787e737ed6cdc0089143ace00" echo "(hashes should match for released versions)" diff --git a/config.ml b/config.ml index 3075006..fb2cd2e 100644 --- a/config.ml +++ b/config.ml @@ -33,7 +33,7 @@ let main = package "mirage-qubes" ~min:"0.8.2"; package "mirage-nat" ~min:"2.2.1"; package "mirage-logs"; - package "mirage-xen" ~min:"5.0.0"; + package "mirage-xen" ~min:"6.0.0"; package ~min:"4.5.0" "dns-client"; package "pf-qubes"; ] diff --git a/memory_pressure.ml b/memory_pressure.ml index ed5b7e5..cecf4a9 100644 --- a/memory_pressure.ml +++ b/memory_pressure.ml @@ -6,44 +6,48 @@ open Lwt let src = Logs.Src.create "memory_pressure" ~doc:"Memory pressure monitor" module Log = (val Logs.src_log src : Logs.LOG) -let total_pages = OS.MM.Heap_pages.total () -let pagesize_kb = Io_page.page_size / 1024 +let wordsize_in_bytes = Sys.word_size / 8 -let meminfo ~used = - let mem_total = total_pages * pagesize_kb in - let mem_free = (total_pages - used) * pagesize_kb in - Log.info (fun f -> f "Writing meminfo: free %d / %d kB (%.2f %%)" - mem_free mem_total (float_of_int mem_free /. float_of_int mem_total *. 100.0)); +let fraction_free stats = + let { OS.Memory.free_words; heap_words; _ } = stats in + float free_words /. float heap_words + +let meminfo stats = + let { OS.Memory.free_words; heap_words; _ } = stats in + let mem_total = heap_words * wordsize_in_bytes in + let mem_free = free_words * wordsize_in_bytes in + Log.info (fun f -> f "Writing meminfo: free %a / %a (%.2f %%)" + Fmt.bi_byte_size mem_free + Fmt.bi_byte_size mem_total + (fraction_free stats *. 100.0)); Printf.sprintf "MemTotal: %d kB\n\ MemFree: %d kB\n\ Buffers: 0 kB\n\ Cached: 0 kB\n\ SwapTotal: 0 kB\n\ - SwapFree: 0 kB\n" mem_total mem_free + SwapFree: 0 kB\n" (mem_total / 1024) (mem_free / 1024) -let report_mem_usage used = +let report_mem_usage stats = Lwt.async (fun () -> let open OS in Xs.make () >>= fun xs -> Xs.immediate xs (fun h -> - Xs.write h "memory/meminfo" (meminfo ~used) + Xs.write h "memory/meminfo" (meminfo stats) ) ) let init () = Gc.full_major (); - let used = OS.MM.Heap_pages.used () in - report_mem_usage used + let stats = OS.Memory.quick_stat () in + report_mem_usage stats let status () = - let used = OS.MM.Heap_pages.used () |> float_of_int in - let frac = used /. float_of_int total_pages in - if frac < 0.9 then `Ok + let stats = OS.Memory.quick_stat () in + if fraction_free stats > 0.1 then `Ok else ( Gc.full_major (); - let used = OS.MM.Heap_pages.used () in - report_mem_usage used; - let frac = float_of_int used /. float_of_int total_pages in - if frac > 0.9 then `Memory_critical + let stats = OS.Memory.quick_stat () in + report_mem_usage stats; + if fraction_free stats < 0.1 then `Memory_critical else `Ok )