mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* How can I migrate a currently running task?
@ 2008-06-27 13:17 夏亮
  2008-06-27 13:25 ` Bart Van Assche
  2008-06-27 14:27 ` Dmitry Adamushko
  0 siblings, 2 replies; 7+ messages in thread
From: 夏亮 @ 2008-06-27 13:17 UTC (permalink / raw)
  To: linux-kernel

Hi,

       I am working on Intel Duo Core with Linux OS 2.6.21, and I'd  
like to migrate task from one cpu to another cpu.
In SMP systems, load_balance() function uses move_tasks() to move  
processes from source runqueue to local runqueue, but it does not move  
a currently running task. If I want to migrate a currently running  
task from source runqueue to local runqueue, how can I do? Any  
suggestion is preferred. Thanks!

     Liang


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How can I migrate a currently running task?
  2008-06-27 13:17 How can I migrate a currently running task? 夏亮
@ 2008-06-27 13:25 ` Bart Van Assche
  2008-06-27 13:38   ` xialiang
  2008-06-27 14:27 ` Dmitry Adamushko
  1 sibling, 1 reply; 7+ messages in thread
From: Bart Van Assche @ 2008-06-27 13:25 UTC (permalink / raw)
  To: 夏亮; +Cc: linux-kernel

On Fri, Jun 27, 2008 at 3:17 PM, 夏亮 <xiaiaxaxi@sjtu.edu.cn> wrote:
> I am working on Intel Duo Core with Linux OS 2.6.21, and I'd like to
> migrate task from one cpu to another cpu.
> In SMP systems, load_balance() function uses move_tasks() to move processes
> from source runqueue to local runqueue, but it does not move a currently
> running task. If I want to migrate a currently running task from source
> runqueue to local runqueue, how can I do? Any suggestion is preferred.

Are you familiar with the glibc pthread_setaffinity_np() function
and/or the sched_setaffinity() system call ?

Bart.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How can I migrate a currently running task?
  2008-06-27 13:25 ` Bart Van Assche
@ 2008-06-27 13:38   ` xialiang
  2008-06-27 18:48     ` Robin Holt
  0 siblings, 1 reply; 7+ messages in thread
From: xialiang @ 2008-06-27 13:38 UTC (permalink / raw)
  To: Bart Van Assche; +Cc: linux-kernel

Quoting Bart Van Assche <bart.vanassche@gmail.com>:

> On Fri, Jun 27, 2008 at 3:17 PM, 夏亮 <xiaiaxaxi@sjtu.edu.cn> wrote:
>> I am working on Intel Duo Core with Linux OS 2.6.21, and I'd like to
>> migrate task from one cpu to another cpu.
>> In SMP systems, load_balance() function uses move_tasks() to move processes
>> from source runqueue to local runqueue, but it does not move a currently
>> running task. If I want to migrate a currently running task from source
>> runqueue to local runqueue, how can I do? Any suggestion is preferred.
>
> Are you familiar with the glibc pthread_setaffinity_np() function
> and/or the sched_setaffinity() system call ?
>
> Bart.
>

Yes. I know sched_setaffinity(), it sets cpu_mask of a task. I want to  
use it in a timer interrupt( scheduler_tick() ), can I?

I use sched_getaffinity() in a timer interrupt, but it doesn't work.As  
following,

scheduler_tick()
{
     every 100ms, balance();
}

static int balance(void)
{
     Get temperature of two cpus.
     int ret;
     cpumask_t mask;

     If(one cpu is much hotter than another one){
         ret = sched_getaffinity(rq->curr->pid, &mask);
     }
}

If I comment sched_getaffinity, it works well.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How can I migrate a currently running task?
  2008-06-27 13:17 How can I migrate a currently running task? 夏亮
  2008-06-27 13:25 ` Bart Van Assche
@ 2008-06-27 14:27 ` Dmitry Adamushko
  1 sibling, 0 replies; 7+ messages in thread
From: Dmitry Adamushko @ 2008-06-27 14:27 UTC (permalink / raw)
  To: 夏亮; +Cc: linux-kernel

2008/6/27 夏亮 <xiaiaxaxi@sjtu.edu.cn>:
> Hi,
>
>      I am working on Intel Duo Core with Linux OS 2.6.21, and I'd like to
> migrate task from one cpu to another cpu.
> In SMP systems, load_balance() function uses move_tasks() to move processes
> from source runqueue to local runqueue, but it does not move a currently
> running task. If I want to migrate a currently running task from source
> runqueue to local runqueue, how can I do? Any suggestion is preferred.
> Thanks!

Some high-prio task takes away CPU from a 'target' task and then
pushes it onto another CPU. That's what 'migration_thread' does.

Take a look at use-cases of migrate_task() in sched.c.


>
>    Liang
>

-- 
Best regards,
Dmitry Adamushko

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How can I migrate a currently running task?
  2008-06-27 13:38   ` xialiang
@ 2008-06-27 18:48     ` Robin Holt
  2008-06-28  4:05       ` xialiang
  0 siblings, 1 reply; 7+ messages in thread
From: Robin Holt @ 2008-06-27 18:48 UTC (permalink / raw)
  To: xialiang; +Cc: Bart Van Assche, linux-kernel

On Fri, Jun 27, 2008 at 09:38:05PM +0800, xialiang wrote:
> Quoting Bart Van Assche <bart.vanassche@gmail.com>:
>
>> On Fri, Jun 27, 2008 at 3:17 PM, 夏亮 <xiaiaxaxi@sjtu.edu.cn> wrote:
>>> I am working on Intel Duo Core with Linux OS 2.6.21, and I'd like to
>>> migrate task from one cpu to another cpu.
>>> In SMP systems, load_balance() function uses move_tasks() to move processes
>>> from source runqueue to local runqueue, but it does not move a currently
>>> running task. If I want to migrate a currently running task from source
>>> runqueue to local runqueue, how can I do? Any suggestion is preferred.
>>
>> Are you familiar with the glibc pthread_setaffinity_np() function
>> and/or the sched_setaffinity() system call ?
>>
>> Bart.
>>
>
> Yes. I know sched_setaffinity(), it sets cpu_mask of a task. I want to  
> use it in a timer interrupt( scheduler_tick() ), can I?

Don't use it from a timer handler.  You can use migrate_task() to move the
task, but your email from a couple days ago said you wanted to move the
task at the head of the runqueue due to cpu heat or something like that.
That is a very imprecise way to move the task as any unfortunate task
that happens to be running when the timer tick occurs could get migrated,
not the one generating the work.

I think you really want to look at the other areas of the kernel which do
stuff like throttling the cpu.  Just moving a task off the cpu does not
prevent it from being used for another compute intesive load.  You could
take the cpu offline.  I guess to do that, I would use schedule_work()
or kthread_create() to get out of the timer context and into a regular
thread context then take the cpu offline from there.

Good Luck,
Robin

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How can I migrate a currently running task?
  2008-06-27 18:48     ` Robin Holt
@ 2008-06-28  4:05       ` xialiang
  2008-06-28  7:55         ` Peter Zijlstra
  0 siblings, 1 reply; 7+ messages in thread
From: xialiang @ 2008-06-28  4:05 UTC (permalink / raw)
  To: Robin Holt; +Cc: Bart Van Assche, linux-kernel

Quoting Robin Holt <holt@sgi.com>:

> On Fri, Jun 27, 2008 at 09:38:05PM +0800, xialiang wrote:
>> Quoting Bart Van Assche <bart.vanassche@gmail.com>:
>>
>>> On Fri, Jun 27, 2008 at 3:17 PM, 夏亮 <xiaiaxaxi@sjtu.edu.cn> wrote:
>>>> I am working on Intel Duo Core with Linux OS 2.6.21, and I'd like to
>>>> migrate task from one cpu to another cpu.
>>>> In SMP systems, load_balance() function uses move_tasks() to move  
>>>>  processes
>>>> from source runqueue to local runqueue, but it does not move a currently
>>>> running task. If I want to migrate a currently running task from source
>>>> runqueue to local runqueue, how can I do? Any suggestion is preferred.
>>>
>>> Are you familiar with the glibc pthread_setaffinity_np() function
>>> and/or the sched_setaffinity() system call ?
>>>
>>> Bart.
>>>
>>
>> Yes. I know sched_setaffinity(), it sets cpu_mask of a task. I want to
>> use it in a timer interrupt( scheduler_tick() ), can I?
>
> Don't use it from a timer handler.  You can use migrate_task() to move the
> task, but your email from a couple days ago said you wanted to move the
> task at the head of the runqueue due to cpu heat or something like that.
> That is a very imprecise way to move the task as any unfortunate task
> that happens to be running when the timer tick occurs could get migrated,
> not the one generating the work.
>
> I think you really want to look at the other areas of the kernel which do
> stuff like throttling the cpu.  Just moving a task off the cpu does not
> prevent it from being used for another compute intesive load.  You could
> take the cpu offline.  I guess to do that, I would use schedule_work()
> or kthread_create() to get out of the timer context and into a regular
> thread context then take the cpu offline from there.
>
> Good Luck,
> Robin
>

       I would move a task at the head of the runqueue, but I already  
know which task creates the heat. I get the profile of tasks  
beforehand. So if I find the temperature of a cpu is much higher than  
that of the other, and coincidentally the currently running task of  
the cpu is what I want to migrate. Can I migrate it in the  
scheduler_tick()? Or where should I put the migration code? Thanks!

Best regards,
Liang


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How can I migrate a currently running task?
  2008-06-28  4:05       ` xialiang
@ 2008-06-28  7:55         ` Peter Zijlstra
  0 siblings, 0 replies; 7+ messages in thread
From: Peter Zijlstra @ 2008-06-28  7:55 UTC (permalink / raw)
  To: xialiang; +Cc: Robin Holt, Bart Van Assche, linux-kernel

On Sat, 2008-06-28 at 12:05 +0800, xialiang wrote:
> Quoting Robin Holt <holt@sgi.com>:
> 
> > On Fri, Jun 27, 2008 at 09:38:05PM +0800, xialiang wrote:
> >> Quoting Bart Van Assche <bart.vanassche@gmail.com>:
> >>
> >>> On Fri, Jun 27, 2008 at 3:17 PM, 夏亮 <xiaiaxaxi@sjtu.edu.cn> wrote:
> >>>> I am working on Intel Duo Core with Linux OS 2.6.21, and I'd like to
> >>>> migrate task from one cpu to another cpu.
> >>>> In SMP systems, load_balance() function uses move_tasks() to move  
> >>>>  processes
> >>>> from source runqueue to local runqueue, but it does not move a currently
> >>>> running task. If I want to migrate a currently running task from source
> >>>> runqueue to local runqueue, how can I do? Any suggestion is preferred.
> >>>
> >>> Are you familiar with the glibc pthread_setaffinity_np() function
> >>> and/or the sched_setaffinity() system call ?
> >>>
> >>> Bart.
> >>>
> >>
> >> Yes. I know sched_setaffinity(), it sets cpu_mask of a task. I want to
> >> use it in a timer interrupt( scheduler_tick() ), can I?
> >
> > Don't use it from a timer handler.  You can use migrate_task() to move the
> > task, but your email from a couple days ago said you wanted to move the
> > task at the head of the runqueue due to cpu heat or something like that.
> > That is a very imprecise way to move the task as any unfortunate task
> > that happens to be running when the timer tick occurs could get migrated,
> > not the one generating the work.
> >
> > I think you really want to look at the other areas of the kernel which do
> > stuff like throttling the cpu.  Just moving a task off the cpu does not
> > prevent it from being used for another compute intesive load.  You could
> > take the cpu offline.  I guess to do that, I would use schedule_work()
> > or kthread_create() to get out of the timer context and into a regular
> > thread context then take the cpu offline from there.
> >
> > Good Luck,
> > Robin
> >
> 
>        I would move a task at the head of the runqueue, but I already  
> know which task creates the heat. I get the profile of tasks  
> beforehand. So if I find the temperature of a cpu is much higher than  
> that of the other, and coincidentally the currently running task of  
> the cpu is what I want to migrate. Can I migrate it in the  
> scheduler_tick()? 

No, you cannot migrate current from hardirq context. 

> Or where should I put the migration code? Thanks!

If you want to balance temperature, the best place would be the load
balancer.

Just don't wreck all the other balance conditions.


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2008-06-28  7:55 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-06-27 13:17 How can I migrate a currently running task? 夏亮
2008-06-27 13:25 ` Bart Van Assche
2008-06-27 13:38   ` xialiang
2008-06-27 18:48     ` Robin Holt
2008-06-28  4:05       ` xialiang
2008-06-28  7:55         ` Peter Zijlstra
2008-06-27 14:27 ` Dmitry Adamushko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®