|
@@ -4358,36 +4358,29 @@ EXPORT_SYMBOL_GPL(yield_to);
|
|
|
* This task is about to go to sleep on IO. Increment rq->nr_iowait so
|
|
|
* that process accounting knows that this is a task in IO wait state.
|
|
|
*/
|
|
|
-void __sched io_schedule(void)
|
|
|
-{
|
|
|
- struct rq *rq = raw_rq();
|
|
|
-
|
|
|
- delayacct_blkio_start();
|
|
|
- atomic_inc(&rq->nr_iowait);
|
|
|
- blk_flush_plug(current);
|
|
|
- current->in_iowait = 1;
|
|
|
- schedule();
|
|
|
- current->in_iowait = 0;
|
|
|
- atomic_dec(&rq->nr_iowait);
|
|
|
- delayacct_blkio_end();
|
|
|
-}
|
|
|
-EXPORT_SYMBOL(io_schedule);
|
|
|
-
|
|
|
long __sched io_schedule_timeout(long timeout)
|
|
|
{
|
|
|
- struct rq *rq = raw_rq();
|
|
|
+ int old_iowait = current->in_iowait;
|
|
|
+ struct rq *rq;
|
|
|
long ret;
|
|
|
|
|
|
+ current->in_iowait = 1;
|
|
|
+ if (old_iowait)
|
|
|
+ blk_schedule_flush_plug(current);
|
|
|
+ else
|
|
|
+ blk_flush_plug(current);
|
|
|
+
|
|
|
delayacct_blkio_start();
|
|
|
+ rq = raw_rq();
|
|
|
atomic_inc(&rq->nr_iowait);
|
|
|
- blk_flush_plug(current);
|
|
|
- current->in_iowait = 1;
|
|
|
ret = schedule_timeout(timeout);
|
|
|
- current->in_iowait = 0;
|
|
|
+ current->in_iowait = old_iowait;
|
|
|
atomic_dec(&rq->nr_iowait);
|
|
|
delayacct_blkio_end();
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
+EXPORT_SYMBOL(io_schedule_timeout);
|
|
|
|
|
|
/**
|
|
|
* sys_sched_get_priority_max - return maximum RT priority.
|