[patch] BFS 421: remove global runqueue lock in running tick

From: Hillf Danton
Date: Fri Jun 08 2012 - 09:37:48 EST


We simply deschedule current, with no bother grabbing global lock, since IPI,
if triggered by preempt, could not change our result, like no schedule when
preempt enabled.

preempt_enable_no_resched();
if (unlikely(need_resched()))
goto need_resched;


--- a/kernel/sched/bfs.c Wed Jun 6 21:02:50 2012
+++ b/kernel/sched/bfs.c Fri Jun 8 21:17:24 2012
@@ -2784,11 +2784,13 @@ static void task_running_tick(struct rq
} else if (rq->rq_time_slice >= RESCHED_US)
return;

- /* p->time_slice < RESCHED_US. We only modify task_struct under grq lock */
+ /*
+ * With irq disabled, current is descheduled without global lock
+ * held and IPI cared.
+ */
p = rq->curr;
- grq_lock();
- set_tsk_need_resched(p);
- grq_unlock();
+ if (!test_tsk_need_resched(p))
+ set_tsk_need_resched(p);
}


--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/