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:
Michael Santos
2014-05-04 09:53:05 -04:00
parent 6655928fda
commit b68086154f
3 changed files with 38 additions and 25 deletions

View File

@@ -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) ->

View File

@@ -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

View File

@@ -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).