2006-10-17 10:18:27

by Kay Tiong Khoo

[permalink] [raw]
Subject: stopping a process during a timer interrupt

On a timer interrupt, I tried to stop the current process by changing
it's run state to TASK_STOPPED via set_current_state(TASK_STOPPED).
However, this results in a system hang.

I can't find a way to stop the current process during an interrupt
context. Does such code exist in the kernel? If not, how does one go
about implementing it from within a kernel module.

Thanks.
Kay Tiong


2006-10-17 22:56:07

by Hagen Paul Pfeifer

[permalink] [raw]
Subject: Re: stopping a process during a timer interrupt

* Kay Tiong Khoo | 2006-10-17 18:18:25 [+0800]:

>On a timer interrupt, I tried to stop the current process by changing
>it's run state to TASK_STOPPED via set_current_state(TASK_STOPPED).
>However, this results in a system hang.
>
>I can't find a way to stop the current process during an interrupt
>context. Does such code exist in the kernel? If not, how does one go
>about implementing it from within a kernel module.

Take a look at some driver implementations!
There you will find some ways how to put a process into a sleep state.

Grep for "*->state*TASK_UNINTERRUPTIBLE" and take also a look at the
interaction with schedule() and spinlocks.

>Thanks.
>Kay Tiong

Best regards

--
Hagen Pfeifer

2006-10-18 14:31:12

by Michal Schmidt

[permalink] [raw]
Subject: Re: stopping a process during a timer interrupt

Kay Tiong Khoo skrev:
> On a timer interrupt, I tried to stop the current process by changing
> it's run state to TASK_STOPPED via set_current_state(TASK_STOPPED).
> However, this results in a system hang.
>
> I can't find a way to stop the current process during an interrupt
> context. Does such code exist in the kernel? If not, how does one go
> about implementing it from within a kernel module.

In interrupt context there's no "current process" by definition.

Michal

2006-10-19 03:38:12

by Kay Tiong Khoo

[permalink] [raw]
Subject: Re: stopping a process during a timer interrupt

Thanks!

For the record, I was trying to sleep kernel threads as well as user
threads. That didn't work out too well.

All worked fine when I only attempted to sleep user threads.

Kay Tiong

On Oct 18, 2006, at 6:56 AM, Hagen Paul Pfeifer wrote:

> * Kay Tiong Khoo | 2006-10-17 18:18:25 [+0800]:
>
>> On a timer interrupt, I tried to stop the current process by changing
>> it's run state to TASK_STOPPED via set_current_state(TASK_STOPPED).
>> However, this results in a system hang.
>>
>> I can't find a way to stop the current process during an interrupt
>> context. Does such code exist in the kernel? If not, how does one go
>> about implementing it from within a kernel module.
>
> Take a look at some driver implementations!
> There you will find some ways how to put a process into a sleep state.
>
> Grep for "*->state*TASK_UNINTERRUPTIBLE" and take also a look at the
> interaction with schedule() and spinlocks.
>
>> Thanks.
>> Kay Tiong
>
> Best regards
>
> --
> Hagen Pfeifer

2006-10-19 03:42:43

by Kay Tiong Khoo

[permalink] [raw]
Subject: Re: stopping a process during a timer interrupt

That's true. But if you are writing a profiler, the current process
is the process of interest in the interrupt context.

Kay Tiong

On Oct 18, 2006, at 10:30 PM, Michal Schmidt wrote:

> Kay Tiong Khoo skrev:
>> On a timer interrupt, I tried to stop the current process by changing
>> it's run state to TASK_STOPPED via set_current_state(TASK_STOPPED).
>> However, this results in a system hang.
>> I can't find a way to stop the current process during an interrupt
>> context. Does such code exist in the kernel? If not, how does one go
>> about implementing it from within a kernel module.
>
> In interrupt context there's no "current process" by definition.
>
> Michal