1
1
#[ macro_use]
2
2
extern crate log;
3
3
4
+ use crossbeam_channel:: unbounded;
5
+ use kvm_bindings:: kvm_memory_attributes;
6
+ use libc:: fallocate;
7
+ use libc:: FALLOC_FL_KEEP_SIZE ;
8
+ use libc:: FALLOC_FL_PUNCH_HOLE ;
4
9
use std:: collections:: hash_map:: Entry ;
5
10
use std:: collections:: HashMap ;
6
11
use std:: convert:: TryInto ;
@@ -15,6 +20,8 @@ use std::path::PathBuf;
15
20
use std:: slice;
16
21
use std:: sync:: atomic:: { AtomicI32 , Ordering } ;
17
22
use std:: sync:: Mutex ;
23
+ use vm_memory:: GuestMemoryRegion ;
24
+ use vm_memory:: { Address , GuestMemory } ;
18
25
19
26
#[ cfg( target_os = "macos" ) ]
20
27
use crossbeam_channel:: unbounded;
@@ -1077,9 +1084,12 @@ pub extern "C" fn krun_start_enter(ctx_id: u32) -> i32 {
1077
1084
#[ cfg( target_os = "macos" ) ]
1078
1085
let ( sender, receiver) = unbounded ( ) ;
1079
1086
1087
+ let ( io_sender, receiver) = unbounded ( ) ;
1088
+
1080
1089
let _vmm = match vmm:: builder:: build_microvm (
1081
1090
& ctx_cfg. vmr ,
1082
1091
& mut event_manager,
1092
+ io_sender,
1083
1093
ctx_cfg. shutdown_efd ,
1084
1094
#[ cfg( target_os = "macos" ) ]
1085
1095
sender,
@@ -1094,6 +1104,50 @@ pub extern "C" fn krun_start_enter(ctx_id: u32) -> i32 {
1094
1104
#[ cfg( target_os = "macos" ) ]
1095
1105
let mapper_vmm = _vmm. clone ( ) ;
1096
1106
1107
+ let vm = _vmm. lock ( ) . unwrap ( ) . kvm_vm ( ) . fd . clone ( ) ;
1108
+ let guest_mem = _vmm. lock ( ) . unwrap ( ) . guest_memory ( ) . clone ( ) ;
1109
+ let guest_memfd = _vmm. lock ( ) . unwrap ( ) . guest_memfd_vec . clone ( ) ;
1110
+
1111
+ std:: thread:: spawn ( move || loop {
1112
+ match receiver. recv ( ) {
1113
+ Err ( e) => error ! ( "Error in receiver: {:?}" , e) ,
1114
+ Ok ( m) => {
1115
+ let _ret = vm
1116
+ . lock ( )
1117
+ . unwrap ( )
1118
+ . set_memory_attributes ( kvm_memory_attributes {
1119
+ address : m. addr ,
1120
+ size : m. size ,
1121
+ attributes : m. attributes as u64 ,
1122
+ flags : 0 ,
1123
+ } ) ;
1124
+
1125
+ // from private to shared
1126
+ // e.g., ram_block_discard_guest_memfd_range
1127
+ if m. attributes == 0 {
1128
+ for ( index, region) in guest_mem. iter ( ) . enumerate ( ) {
1129
+ if ( region. start_addr ( ) . raw_value ( ) + region. size ( ) as u64 ) > m. addr {
1130
+ // offset es function de la posicion de mapeo
1131
+ let offset = m. addr - region. start_addr ( ) . raw_value ( ) ;
1132
+ unsafe {
1133
+ let _ret = fallocate (
1134
+ * guest_memfd. get ( index) . unwrap ( ) ,
1135
+ FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE ,
1136
+ offset as i64 ,
1137
+ m. size as i64 ,
1138
+ ) ;
1139
+ }
1140
+ }
1141
+ }
1142
+ // from shared to private
1143
+ // e.g., ram_block_discard_range
1144
+ } else {
1145
+ // do something
1146
+ }
1147
+ }
1148
+ }
1149
+ } ) ;
1150
+
1097
1151
#[ cfg( target_os = "macos" ) ]
1098
1152
std:: thread:: spawn ( move || loop {
1099
1153
match receiver. recv ( ) {
0 commit comments