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.