Re: [lxc-devel] Question on freezer.c

2010-10-11 Thread Daniel Lezcano
On 10/11/2010 08:48 AM, richard -rw- weinberger wrote:
> Hi list,
>
> I've a question on freezer.c.
> In freeze_unfreeze() is a while(1) loop which write()s "FROZEN" or
> "THAWED" until read() returns the same.
> Why do we need this loop?
> It looks like a hack to me.


The freezer documentation specifies:
  state (because of the cgroup state 'freezeing), making the cgroup to 
converge to the frozen state.

When we check the cgroup is frozen, the kernel look at this task list 
and find the new child process which is not yet frozen and will return 
'freezing' instead of "frozen'. Freezing the cgroup again will freeze 
this missing task.

"It's important to note that freezing can be incomplete. In that case we 
return EBUSY. This means that some tasks in the cgroup are busy doing 
something that prevents us from completely freezing the cgroup at this 
time. After EBUSY, the cgroup will remain partially frozen -- reflected 
by freezer.state reporting "FREEZING" when read. The state will remain 
"FREEZING" until one of these things happens:

  1) Userspace cancels the freezing operation by writing "THAWED" to the 
freezer.state file

  2) Userspace retries the freezing operation by writing "FROZEN" to 
the freezer.state file (writing "FREEZING" is not legal and returns EINVAL)

  3) The tasks that blocked the cgroup from entering the "FROZEN" state 
disappear from the cgroup's set of tasks."

The loop in the code is for the case (2).

Let me clarify:

(1) When we freeze a cgroup, the kernel browse the cgroup's tasks list 
and will send a fake signal to each of them.

But the places where the hooks are in the kernel code (fork and exit), 
make possible to send this signal to a task while it is forking and the 
child process is not yet in the cgroup's task list.

The forking task will go to the frozen state right after returning from 
the fork but the child task won't because it didn't receive the fake signal.

If this child process forks again, the new child will automatically go 
to the frozen state (because of the cgroup state 'freezing), making the 
cgroup to converge to the frozen state.

When we check the cgroup is frozen, the kernel look at this task list 
and find the new child process which is not yet frozen and will return 
'freezing' instead of "frozen'. Freezing the cgroup again will freeze 
this missing task.


(2) It's possible to freeze a cgroup while it is in important IO, aka 
'uninteruptible state', so we won't be able to freeze  immediately and 
we have to retry.



These both cases happen rarely, so most of the time, one iteration in 
the loop is enough to freeze the container.

--
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
___
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel


Re: [lxc-devel] Question on freezer.c

2010-10-11 Thread Daniel Lezcano
On 10/11/2010 09:42 AM, Daniel Lezcano wrote:
> On 10/11/2010 08:48 AM, richard -rw- weinberger wrote:
>
>> Hi list,
>>
>> I've a question on freezer.c.
>> In freeze_unfreeze() is a while(1) loop which write()s "FROZEN" or
>> "THAWED" until read() returns the same.
>> Why do we need this loop?
>> It looks like a hack to me.
>>  
>
> The freezer documentation specifies:
>
>

Sorry I did an unwanted copy-paste at this place with the end of this 
email :)

> "It's important to note that freezing can be incomplete. In that case we
> return EBUSY. This means that some tasks in the cgroup are busy doing
> something that prevents us from completely freezing the cgroup at this
> time. After EBUSY, the cgroup will remain partially frozen -- reflected
> by freezer.state reporting "FREEZING" when read. The state will remain
> "FREEZING" until one of these things happens:
>
>1) Userspace cancels the freezing operation by writing "THAWED" to the
> freezer.state file
>
>2) Userspace retries the freezing operation by writing "FROZEN" to
> the freezer.state file (writing "FREEZING" is not legal and returns EINVAL)
>
>3) The tasks that blocked the cgroup from entering the "FROZEN" state
> disappear from the cgroup's set of tasks."
>
> The loop in the code is for the case (2).
>
> Let me clarify:
>
> (1) When we freeze a cgroup, the kernel browse the cgroup's tasks list
> and will send a fake signal to each of them.
>
> But the places where the hooks are in the kernel code (fork and exit),
> make possible to send this signal to a task while it is forking and the
> child process is not yet in the cgroup's task list.
>
> The forking task will go to the frozen state right after returning from
> the fork but the child task won't because it didn't receive the fake signal.
>
> If this child process forks again, the new child will automatically go
> to the frozen state (because of the cgroup state 'freezing), making the
> cgroup to converge to the frozen state.
>
> When we check the cgroup is frozen, the kernel look at this task list
> and find the new child process which is not yet frozen and will return
> 'freezing' instead of "frozen'. Freezing the cgroup again will freeze
> this missing task.
>
>
> (2) It's possible to freeze a cgroup while it is in important IO, aka
> 'uninteruptible state', so we won't be able to freeze  immediately and
> we have to retry.
>
>
>
> These both cases happen rarely, so most of the time, one iteration in
> the loop is enough to freeze the container.
>
> --
> Beautiful is writing same markup. Internet Explorer 9 supports
> standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2&  L3.
> Spend less time writing and  rewriting code and more time creating great
> experiences on the web. Be a part of the beta today.
> http://p.sf.net/sfu/beautyoftheweb
> ___
> Lxc-devel mailing list
> Lxc-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel
>
>


--
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
___
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel


Re: [lxc-devel] Question on freezer.c

2010-10-11 Thread richard -rw- weinberger
On Mon, Oct 11, 2010 at 9:42 AM, Daniel Lezcano  wrote:
> On 10/11/2010 08:48 AM, richard -rw- weinberger wrote:
>>
>> Hi list,
>>
>> I've a question on freezer.c.
>> In freeze_unfreeze() is a while(1) loop which write()s "FROZEN" or
>> "THAWED" until read() returns the same.
>> Why do we need this loop?
>> It looks like a hack to me.
>
>
> The freezer documentation specifies:
>  state (because of the cgroup state 'freezeing), making the cgroup to
> converge to the frozen state.
>
> When we check the cgroup is frozen, the kernel look at this task list and
> find the new child process which is not yet frozen and will return
> 'freezing' instead of "frozen'. Freezing the cgroup again will freeze this
> missing task.
>
> "It's important to note that freezing can be incomplete. In that case we
> return EBUSY. This means that some tasks in the cgroup are busy doing
> something that prevents us from completely freezing the cgroup at this time.
> After EBUSY, the cgroup will remain partially frozen -- reflected by
> freezer.state reporting "FREEZING" when read. The state will remain
> "FREEZING" until one of these things happens:
>
>  1) Userspace cancels the freezing operation by writing "THAWED" to the
> freezer.state file
>
>  2) Userspace retries the freezing operation by writing "FROZEN" to the
> freezer.state file (writing "FREEZING" is not legal and returns EINVAL)
>
>  3) The tasks that blocked the cgroup from entering the "FROZEN" state
> disappear from the cgroup's set of tasks."
>
> The loop in the code is for the case (2).
>
> Let me clarify:
>
> (1) When we freeze a cgroup, the kernel browse the cgroup's tasks list and
> will send a fake signal to each of them.
>
> But the places where the hooks are in the kernel code (fork and exit), make
> possible to send this signal to a task while it is forking and the child
> process is not yet in the cgroup's task list.
>
> The forking task will go to the frozen state right after returning from the
> fork but the child task won't because it didn't receive the fake signal.
>
> If this child process forks again, the new child will automatically go to
> the frozen state (because of the cgroup state 'freezing), making the cgroup
> to converge to the frozen state.
>
> When we check the cgroup is frozen, the kernel look at this task list and
> find the new child process which is not yet frozen and will return
> 'freezing' instead of "frozen'. Freezing the cgroup again will freeze this
> missing task.
>
>
> (2) It's possible to freeze a cgroup while it is in important IO, aka
> 'uninteruptible state', so we won't be able to freeze  immediately and we
> have to retry.
>
>
>
> These both cases happen rarely, so most of the time, one iteration in the
> loop is enough to freeze the container.
>

Thanks for the clarification! :-)

-- 
Thanks,
//richard

--
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
___
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel