O que cat memory.memsw.usage_in_bytes
diz? Você não pode definir o máximo abaixo do limite atual.
Olhando para as origens do Linux 3.10, modificar memsw.limit_in_bytes
resulta em uma chamada para mem_cgroup_write()
:
{
.name = "memsw.limit_in_bytes",
.private = MEMFILE_PRIVATE(_MEMSWAP, RES_LIMIT),
.write_string = mem_cgroup_write,
.read = mem_cgroup_read,
},
mem_cgroup_write()
é definido em: link
mem_cgroup_write()
, por sua vez, chama mem_cgroup_resize_memsw_limit()
quando o tipo é _MEMSWAP
:
else if (type == _MEMSWAP)
ret = mem_cgroup_resize_memsw_limit(memcg, val);
mem_cgroup_resize_memsw_limit()
é definido em: link
Essa função chama res_counter_set_limit()
:
link
A implementação dessa função é:
unsigned long flags;
int ret = -EBUSY;
spin_lock_irqsave(&cnt->lock, flags);
if (cnt->usage <= limit) {
cnt->limit = limit;
ret = 0;
}
spin_unlock_irqrestore(&cnt->lock, flags);
return ret;
Observe que ret
é inicializado como -EBUSY
(que corresponde à mensagem Device or resource busy
que você está vendo) e é alterado para zero apenas se o uso atual for menor ou igual ao limite solicitado. Meu palpite é que no seu caso não é, então a função retorna -EBUSY
.
Se res_counter_set_limit()
retornar um valor diferente de zero para mem_cgroup_resize_memsw_limit()
, então mem_cgroup_resize_limit()
retornará o mesmo valor. mem_cgroup_resize_limit()
retorna o valor para mem_cgroup_write()
. Esse valor de retorno é propagado para o espaço do usuário e é por isso que você vê o erro que está vendo em echo
.
A implementação é que as fontes atuais do kernel são um pouco diferentes, mas o comportamento é o mesmo. Você não pode ajustar o valor mínimo para um valor menor que o valor em uso.