Skip to content

Instantly share code, notes, and snippets.

@jerrinsg
Last active May 14, 2016 06:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jerrinsg/333e584d1f65dc95b9f13b61dcebdaa7 to your computer and use it in GitHub Desktop.
Save jerrinsg/333e584d1f65dc95b9f13b61dcebdaa7 to your computer and use it in GitHub Desktop.
unsigned volatile int migrate_flag;
EXPORT_SYMBOL(migrate_flag);
static int migrate_to(void *data)
{
struct migration_arg *arg = (struct migration_arg *)data;
struct rq *rq;
local_irq_disable();
rq = task_rq( arg->task );
raw_spin_lock(&((arg->task)->pi_lock));
raw_spin_lock(&rq->lock);
deactivate_task(rq, arg->task, DEQUEUE_SLEEP);
arg->task->on_rq = 0;
raw_spin_unlock(&rq->lock);
raw_spin_unlock(&((arg->task)->pi_lock));
local_irq_enable();
migrate_flag = 1;
return 0;
}
static int migrate_back(void *data)
{
struct migration_arg *arg = (struct migration_arg *)data;
struct rq *rq;
local_irq_disable();
rq = task_rq( arg->task );
raw_spin_lock(&((arg->task)->pi_lock));
raw_spin_lock(&rq->lock);
activate_task(rq, arg->task, 0);
arg->task->on_rq = 1;
check_preempt_curr(rq, arg->task, 0);
raw_spin_unlock(&rq->lock);
raw_spin_unlock(&((arg->task)->pi_lock));
local_irq_enable();
return 0;
}
void migrate_to_call(struct task_struct *task, int target_cpu )
{
struct migration_arg arg = { task, target_cpu };
int curr_cpu = task_cpu(task);
int rt = stop_one_cpu(curr_cpu, migrate_to, &arg);
}
EXPORT_SYMBOL(migrate_to_call);
void migrate_back_call(struct task_struct *task, int target_cpu )
{
struct migration_arg arg = { task, target_cpu };
int curr_cpu = task_cpu(task);
migrate_back( &arg );
}
EXPORT_SYMBOL(migrate_back_call);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment