@@ -125,6 +125,7 @@ pub struct Env {
125
125
daemonize : bool ,
126
126
new_pid_ns : bool ,
127
127
start_time_us : u64 ,
128
+ start_time_cpu_us : u64 ,
128
129
jailer_cpu_time_us : u64 ,
129
130
extra_args : Vec < String > ,
130
131
cgroups : Vec < Box < dyn Cgroup > > ,
@@ -160,7 +161,11 @@ impl fmt::Debug for Env {
160
161
}
161
162
162
163
impl Env {
163
- pub fn new ( arguments : & arg_parser:: Arguments , start_time_us : u64 ) -> Result < Self , JailerError > {
164
+ pub fn new (
165
+ arguments : & arg_parser:: Arguments ,
166
+ start_time_us : u64 ,
167
+ start_time_cpu_us : u64 ,
168
+ ) -> Result < Self , JailerError > {
164
169
// Unwraps should not fail because the arguments are mandatory arguments or with default
165
170
// values.
166
171
let id = arguments
@@ -285,6 +290,7 @@ impl Env {
285
290
daemonize,
286
291
new_pid_ns,
287
292
start_time_us,
293
+ start_time_cpu_us,
288
294
jailer_cpu_time_us : 0 ,
289
295
extra_args : arguments. extra_args ( ) ,
290
296
cgroups,
@@ -496,6 +502,7 @@ impl Env {
496
502
Command :: new ( chroot_exec_file)
497
503
. args ( [ "--id" , & self . id ] )
498
504
. args ( [ "--start-time-us" , & self . start_time_us . to_string ( ) ] )
505
+ . args ( [ "--start-time-cpu-us" , & self . start_time_cpu_us . to_string ( ) ] )
499
506
. args ( [ "--parent-cpu-time-us" , & self . jailer_cpu_time_us . to_string ( ) ] )
500
507
. stdin ( Stdio :: inherit ( ) )
501
508
. stdout ( Stdio :: inherit ( ) )
@@ -723,7 +730,10 @@ impl Env {
723
730
}
724
731
725
732
// Compute jailer's total CPU time up to the current time.
726
- self . jailer_cpu_time_us += utils:: time:: get_time_us ( utils:: time:: ClockType :: ProcessCpu ) ;
733
+ self . jailer_cpu_time_us +=
734
+ utils:: time:: get_time_us ( utils:: time:: ClockType :: ProcessCpu ) - self . start_time_cpu_us ;
735
+ // Reset process start time.
736
+ self . start_time_cpu_us = 0 ;
727
737
728
738
// If specified, exec the provided binary into a new PID namespace.
729
739
if self . new_pid_ns {
@@ -848,7 +858,7 @@ mod tests {
848
858
let arg_parser = build_arg_parser ( ) ;
849
859
let mut args = arg_parser. arguments ( ) . clone ( ) ;
850
860
args. parse ( & make_args ( & ArgVals :: new ( ) ) ) . unwrap ( ) ;
851
- Env :: new ( & args, 0 ) . unwrap ( )
861
+ Env :: new ( & args, 0 , 0 ) . unwrap ( )
852
862
}
853
863
854
864
#[ test]
@@ -862,7 +872,7 @@ mod tests {
862
872
args. parse ( & make_args ( & good_arg_vals) ) . unwrap ( ) ;
863
873
// This should be fine.
864
874
let good_env =
865
- Env :: new ( & args, 0 ) . expect ( "This new environment should be created successfully." ) ;
875
+ Env :: new ( & args, 0 , 0 ) . expect ( "This new environment should be created successfully." ) ;
866
876
867
877
let mut chroot_dir = PathBuf :: from ( good_arg_vals. chroot_base ) ;
868
878
chroot_dir. push ( Path :: new ( good_arg_vals. exec_file ) . file_name ( ) . unwrap ( ) ) ;
@@ -887,7 +897,7 @@ mod tests {
887
897
let arg_parser = build_arg_parser ( ) ;
888
898
args = arg_parser. arguments ( ) . clone ( ) ;
889
899
args. parse ( & make_args ( & another_good_arg_vals) ) . unwrap ( ) ;
890
- let another_good_env = Env :: new ( & args, 0 )
900
+ let another_good_env = Env :: new ( & args, 0 , 0 )
891
901
. expect ( "This another new environment should be created successfully." ) ;
892
902
assert ! ( !another_good_env. daemonize) ;
893
903
assert ! ( !another_good_env. new_pid_ns) ;
@@ -905,7 +915,7 @@ mod tests {
905
915
let arg_parser = build_arg_parser ( ) ;
906
916
args = arg_parser. arguments ( ) . clone ( ) ;
907
917
args. parse ( & make_args ( & invalid_cgroup_arg_vals) ) . unwrap ( ) ;
908
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
918
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
909
919
910
920
let invalid_res_limit_arg_vals = ArgVals {
911
921
resource_limits : vec ! [ "zzz" ] ,
@@ -915,7 +925,7 @@ mod tests {
915
925
let arg_parser = build_arg_parser ( ) ;
916
926
args = arg_parser. arguments ( ) . clone ( ) ;
917
927
args. parse ( & make_args ( & invalid_res_limit_arg_vals) ) . unwrap ( ) ;
918
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
928
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
919
929
920
930
let invalid_id_arg_vals = ArgVals {
921
931
id : "/ad./sa12" ,
@@ -925,7 +935,7 @@ mod tests {
925
935
let arg_parser = build_arg_parser ( ) ;
926
936
args = arg_parser. arguments ( ) . clone ( ) ;
927
937
args. parse ( & make_args ( & invalid_id_arg_vals) ) . unwrap ( ) ;
928
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
938
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
929
939
930
940
let inexistent_exec_file_arg_vals = ArgVals {
931
941
exec_file : "/this!/file!/should!/not!/exist!/" ,
@@ -936,7 +946,7 @@ mod tests {
936
946
args = arg_parser. arguments ( ) . clone ( ) ;
937
947
args. parse ( & make_args ( & inexistent_exec_file_arg_vals) )
938
948
. unwrap ( ) ;
939
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
949
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
940
950
941
951
let invalid_uid_arg_vals = ArgVals {
942
952
uid : "zzz" ,
@@ -946,7 +956,7 @@ mod tests {
946
956
let arg_parser = build_arg_parser ( ) ;
947
957
args = arg_parser. arguments ( ) . clone ( ) ;
948
958
args. parse ( & make_args ( & invalid_uid_arg_vals) ) . unwrap ( ) ;
949
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
959
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
950
960
951
961
let invalid_gid_arg_vals = ArgVals {
952
962
gid : "zzz" ,
@@ -956,7 +966,7 @@ mod tests {
956
966
let arg_parser = build_arg_parser ( ) ;
957
967
args = arg_parser. arguments ( ) . clone ( ) ;
958
968
args. parse ( & make_args ( & invalid_gid_arg_vals) ) . unwrap ( ) ;
959
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
969
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
960
970
961
971
let invalid_parent_cg_vals = ArgVals {
962
972
parent_cgroup : Some ( "/root" ) ,
@@ -966,7 +976,7 @@ mod tests {
966
976
let arg_parser = build_arg_parser ( ) ;
967
977
args = arg_parser. arguments ( ) . clone ( ) ;
968
978
args. parse ( & make_args ( & invalid_parent_cg_vals) ) . unwrap ( ) ;
969
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
979
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
970
980
971
981
let invalid_controller_pt = ArgVals {
972
982
cgroups : vec ! [ "../file_name=1" , "./root=1" , "/home=1" ] ,
@@ -975,7 +985,7 @@ mod tests {
975
985
let arg_parser = build_arg_parser ( ) ;
976
986
args = arg_parser. arguments ( ) . clone ( ) ;
977
987
args. parse ( & make_args ( & invalid_controller_pt) ) . unwrap ( ) ;
978
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
988
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
979
989
980
990
let invalid_format = ArgVals {
981
991
cgroups : vec ! [ "./root/" , "../root" ] ,
@@ -984,7 +994,7 @@ mod tests {
984
994
let arg_parser = build_arg_parser ( ) ;
985
995
args = arg_parser. arguments ( ) . clone ( ) ;
986
996
args. parse ( & make_args ( & invalid_format) ) . unwrap ( ) ;
987
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
997
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
988
998
989
999
// The chroot-base-dir param is not validated by Env::new, but rather in run, when we
990
1000
// actually attempt to create the folder structure (the same goes for netns).
@@ -1186,7 +1196,7 @@ mod tests {
1186
1196
} ;
1187
1197
fs:: write ( exec_file_path, "some_content" ) . unwrap ( ) ;
1188
1198
args. parse ( & make_args ( & some_arg_vals) ) . unwrap ( ) ;
1189
- let mut env = Env :: new ( & args, 0 ) . unwrap ( ) ;
1199
+ let mut env = Env :: new ( & args, 0 , 0 ) . unwrap ( ) ;
1190
1200
1191
1201
// Create the required chroot dir hierarchy.
1192
1202
fs:: create_dir_all ( env. chroot_dir ( ) ) . expect ( "Could not create dir hierarchy." ) ;
@@ -1248,7 +1258,7 @@ mod tests {
1248
1258
..good_arg_vals. clone ( )
1249
1259
} ;
1250
1260
args. parse ( & make_args ( & invalid_cgroup_arg_vals) ) . unwrap ( ) ;
1251
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
1261
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
1252
1262
1253
1263
// Check empty string
1254
1264
let mut args = arg_parser. arguments ( ) . clone ( ) ;
@@ -1257,7 +1267,7 @@ mod tests {
1257
1267
..good_arg_vals. clone ( )
1258
1268
} ;
1259
1269
args. parse ( & make_args ( & invalid_cgroup_arg_vals) ) . unwrap ( ) ;
1260
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
1270
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
1261
1271
1262
1272
// Check valid file empty value
1263
1273
let mut args = arg_parser. arguments ( ) . clone ( ) ;
@@ -1266,7 +1276,7 @@ mod tests {
1266
1276
..good_arg_vals. clone ( )
1267
1277
} ;
1268
1278
args. parse ( & make_args ( & invalid_cgroup_arg_vals) ) . unwrap ( ) ;
1269
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
1279
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
1270
1280
1271
1281
// Check valid file no value
1272
1282
let mut args = arg_parser. arguments ( ) . clone ( ) ;
@@ -1275,7 +1285,7 @@ mod tests {
1275
1285
..good_arg_vals. clone ( )
1276
1286
} ;
1277
1287
args. parse ( & make_args ( & invalid_cgroup_arg_vals) ) . unwrap ( ) ;
1278
- Env :: new ( & args, 0 ) . unwrap_err ( ) ;
1288
+ Env :: new ( & args, 0 , 0 ) . unwrap_err ( ) ;
1279
1289
1280
1290
// Cases that should succeed
1281
1291
@@ -1286,7 +1296,7 @@ mod tests {
1286
1296
..good_arg_vals. clone ( )
1287
1297
} ;
1288
1298
args. parse ( & make_args ( & invalid_cgroup_arg_vals) ) . unwrap ( ) ;
1289
- Env :: new ( & args, 0 ) . unwrap ( ) ;
1299
+ Env :: new ( & args, 0 , 0 ) . unwrap ( ) ;
1290
1300
1291
1301
// Check valid case
1292
1302
let mut args = arg_parser. arguments ( ) . clone ( ) ;
@@ -1295,7 +1305,7 @@ mod tests {
1295
1305
..good_arg_vals. clone ( )
1296
1306
} ;
1297
1307
args. parse ( & make_args ( & invalid_cgroup_arg_vals) ) . unwrap ( ) ;
1298
- Env :: new ( & args, 0 ) . unwrap ( ) ;
1308
+ Env :: new ( & args, 0 , 0 ) . unwrap ( ) ;
1299
1309
1300
1310
// Check file with multiple "."
1301
1311
let mut args = arg_parser. arguments ( ) . clone ( ) ;
@@ -1304,7 +1314,7 @@ mod tests {
1304
1314
..good_arg_vals. clone ( )
1305
1315
} ;
1306
1316
args. parse ( & make_args ( & invalid_cgroup_arg_vals) ) . unwrap ( ) ;
1307
- Env :: new ( & args, 0 ) . unwrap ( ) ;
1317
+ Env :: new ( & args, 0 , 0 ) . unwrap ( ) ;
1308
1318
}
1309
1319
1310
1320
#[ test]
0 commit comments