mirror of
https://github.com/uselessd/alcove.git
synced 2026-04-15 09:15:19 +00:00
cgroup: use an iolist() for the namespace path
Use a list of binaries as the namespace:
[<<"alcove">>, <<"guest1234">>] % <<"alcove/guest1234">>
is converted to:
<<"/sys/fs/cgroup/blkio/alcove/guest1234">>
<<"/sys/fs/cgroup/cpu/alcove/guest1234">>
<<"/sys/fs/cgroup/cpuacct/alcove/guest1234">>
<<"/sys/fs/cgroup/cpuset/alcove/guest1234">>
This commit is contained in:
@@ -23,14 +23,14 @@ start() ->
|
||||
{ok, Drv} = alcove_drv:start([{exec, "sudo"}]),
|
||||
case alcove_cgroup:supported(Drv) of
|
||||
true ->
|
||||
ok = alcove_cgroup:create(Drv, [], <<"alcove">>),
|
||||
{ok,1} = alcove_cgroup:set(Drv, [], <<"cpuset">>, <<"alcove">>,
|
||||
[ok] = alcove_cgroup:create(Drv, [], [<<"alcove">>]),
|
||||
{ok,1} = alcove_cgroup:set(Drv, [], <<"cpuset">>, [<<"alcove">>],
|
||||
<<"cpuset.cpus">>, <<"0">>),
|
||||
{ok,1} = alcove_cgroup:set(Drv, [], <<"cpuset">>, <<"alcove">>,
|
||||
{ok,1} = alcove_cgroup:set(Drv, [], <<"cpuset">>, [<<"alcove">>],
|
||||
<<"cpuset.mems">>, <<"0">>),
|
||||
alcove_cgroup:set(Drv, [], <<"memory">>, <<"alcove">>,
|
||||
alcove_cgroup:set(Drv, [], <<"memory">>, [<<"alcove">>],
|
||||
<<"memory.memsw.limit_in_bytes">>, <<"16m">>),
|
||||
{ok,3} = alcove_cgroup:set(Drv, [], <<"memory">>, <<"alcove">>,
|
||||
{ok,3} = alcove_cgroup:set(Drv, [], <<"memory">>, [<<"alcove">>],
|
||||
<<"memory.limit_in_bytes">>, <<"16m">>),
|
||||
Drv;
|
||||
false ->
|
||||
@@ -66,7 +66,7 @@ argv([Arg0, Args]) ->
|
||||
{Path, Progname, Args}.
|
||||
|
||||
setlimits(Drv, Child) ->
|
||||
{ok,_} = alcove_cgroup:set(Drv, [], <<>>, <<"alcove">>,
|
||||
{ok,_} = alcove_cgroup:set(Drv, [], <<>>, [<<"alcove">>],
|
||||
<<"tasks">>, integer_to_list(Child)).
|
||||
|
||||
chroot(Drv, Child, Path) ->
|
||||
|
||||
@@ -108,7 +108,7 @@ clone(Drv, _Options) ->
|
||||
clone_init(Drv, Child, _Options) ->
|
||||
case alcove_cgroup:supported(Drv) of
|
||||
true ->
|
||||
{ok,_} = alcove_cgroup:set(Drv, [], <<>>, <<"alcove">>,
|
||||
{ok,_} = alcove_cgroup:set(Drv, [], <<>>, [<<"alcove">>],
|
||||
<<"tasks">>, integer_to_list(Child));
|
||||
false ->
|
||||
ok
|
||||
@@ -271,14 +271,14 @@ chroot_init() ->
|
||||
cgroup_init(Drv) ->
|
||||
case alcove_cgroup:supported(Drv) of
|
||||
true ->
|
||||
ok = alcove_cgroup:create(Drv, [], <<"alcove">>),
|
||||
alcove_cgroup:set(Drv, [], <<"cpuset">>, <<"alcove">>,
|
||||
[ok] = alcove_cgroup:create(Drv, [], [<<"alcove">>]),
|
||||
alcove_cgroup:set(Drv, [], <<"cpuset">>, [<<"alcove">>],
|
||||
<<"cpuset.cpus">>, <<"0">>),
|
||||
alcove_cgroup:set(Drv, [], <<"cpuset">>, <<"alcove">>,
|
||||
alcove_cgroup:set(Drv, [], <<"cpuset">>, [<<"alcove">>],
|
||||
<<"cpuset.mems">>, <<"0">>),
|
||||
alcove_cgroup:set(Drv, [], <<"memory">>, <<"alcove">>,
|
||||
alcove_cgroup:set(Drv, [], <<"memory">>, [<<"alcove">>],
|
||||
<<"memory.memsw.limit_in_bytes">>, <<"16m">>),
|
||||
alcove_cgroup:set(Drv, [], <<"memory">>, <<"alcove">>,
|
||||
alcove_cgroup:set(Drv, [], <<"memory">>, [<<"alcove">>],
|
||||
<<"memory.limit_in_bytes">>, <<"16m">>);
|
||||
false ->
|
||||
ok
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
-export([get/5, set/6]).
|
||||
-export([is_file/3, is_dir/3]).
|
||||
-export([mounts/1, mounts/2]).
|
||||
-export([join/2,relpath/1,expand/1]).
|
||||
|
||||
supported(Drv) ->
|
||||
supported(Drv, []).
|
||||
@@ -50,8 +51,11 @@ supported(Drv, Pids) ->
|
||||
create(Drv) ->
|
||||
create(Drv, []).
|
||||
create(Drv, Pids) ->
|
||||
create(Drv, Pids, <<"alcove">>).
|
||||
create(Drv, Pids, Namespace) ->
|
||||
create(Drv, Pids, [<<"alcove">>]).
|
||||
create(Drv, Pids, Namespaces) ->
|
||||
[ create_1(Drv, Pids, Namespace) || Namespace <- expand(Namespaces) ].
|
||||
|
||||
create_1(Drv, Pids, Namespace) ->
|
||||
Fun = fun(Cgroup, _Acc) ->
|
||||
Path = join(Cgroup, Namespace),
|
||||
case alcove:mkdir(Drv, Pids, Path, 8#755) of
|
||||
@@ -60,12 +64,12 @@ create(Drv, Pids, Namespace) ->
|
||||
Error -> Error
|
||||
end
|
||||
end,
|
||||
fold(Drv, <<>>, <<>>, Fun, []).
|
||||
fold(Drv, <<>>, [], Fun, []).
|
||||
|
||||
destroy(Drv) ->
|
||||
destroy(Drv, []).
|
||||
destroy(Drv, Pids) ->
|
||||
destroy(Drv, Pids, <<"alcove">>).
|
||||
destroy(Drv, Pids, [<<"alcove">>]).
|
||||
destroy(Drv, Pids, Namespace) ->
|
||||
Fun = fun(Cgroup, _Acc) ->
|
||||
Path = join(Cgroup, Namespace),
|
||||
@@ -75,18 +79,18 @@ destroy(Drv, Pids, Namespace) ->
|
||||
Error -> Error
|
||||
end
|
||||
end,
|
||||
fold(Drv, <<>>, <<>>, Fun, []).
|
||||
fold(Drv, <<>>, [], Fun, []).
|
||||
|
||||
set(Drv, Pids, MntOpt, Namespace, Key, Value) ->
|
||||
Fun = fun(Cgroup, _Acc) ->
|
||||
File = join(Cgroup, Key),
|
||||
File = join(Cgroup, [Key]),
|
||||
write(Drv, Pids, File, Value)
|
||||
end,
|
||||
fold(Drv, MntOpt, Namespace, Fun, []).
|
||||
|
||||
get(Drv, Pids, MntOpt, Namespace, Key) ->
|
||||
Fun = fun(Cgroup, _Acc) ->
|
||||
File = join(Cgroup, Key),
|
||||
File = join(Cgroup, [Key]),
|
||||
read(Drv, Pids, File)
|
||||
end,
|
||||
fold(Drv, MntOpt, Namespace, Fun, []).
|
||||
@@ -218,12 +222,13 @@ join(Cgroup, Path) ->
|
||||
filename:join([Cgroup|relpath(Path)]).
|
||||
|
||||
relpath(Path) ->
|
||||
case filename:split(Path) of
|
||||
[Root|Rest] when Root =:= "/"; Root =:= <<"/">> ->
|
||||
Rest;
|
||||
Rest ->
|
||||
Rest
|
||||
end.
|
||||
lists:flatmap(fun(N) -> case filename:split(maybe_binary(N)) of
|
||||
[Root|Rest] when Root =:= "/"; Root =:= <<"/">> ->
|
||||
Rest;
|
||||
Rest ->
|
||||
Rest
|
||||
end
|
||||
end, Path).
|
||||
|
||||
foreach([]) ->
|
||||
true;
|
||||
@@ -232,3 +237,11 @@ foreach([Fun|Funs]) ->
|
||||
true -> foreach(Funs);
|
||||
false -> false
|
||||
end.
|
||||
|
||||
% [<<"a">>, <<"b">>, <<"c">>] ->
|
||||
% [[<<"a">>], [<<"a">>,<<"b">>], [<<"a">>,<<"b">>,<<"c">>]]
|
||||
expand(Path) ->
|
||||
[ element(1, lists:split(X, Path)) || X <- lists:seq(1, length(Path)) ].
|
||||
|
||||
maybe_binary(N) when is_binary(N) -> N;
|
||||
maybe_binary(N) when is_list(N) -> list_to_binary(N).
|
||||
|
||||
Reference in New Issue
Block a user