Release 4.11 block/blk-exec.c
/*
* Functions related to setting various queue properties from drivers
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/bio.h>
#include <linux/blkdev.h>
#include <linux/blk-mq.h>
#include <linux/sched/sysctl.h>
#include "blk.h"
#include "blk-mq-sched.h"
/**
* blk_end_sync_rq - executes a completion event on a request
* @rq: request to complete
* @error: end I/O status of the request
*/
static void blk_end_sync_rq(struct request *rq, int error)
{
struct completion *waiting = rq->end_io_data;
rq->end_io_data = NULL;
/*
* complete last, if this is a stack request the process (and thus
* the rq pointer) could be invalid right after this complete()
*/
complete(waiting);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Jens Axboe | 34 | 97.14% | 1 | 50.00% |
FUJITA Tomonori | 1 | 2.86% | 1 | 50.00% |
Total | 35 | 100.00% | 2 | 100.00% |
/**
* blk_execute_rq_nowait - insert a request into queue for execution
* @q: queue to insert the request in
* @bd_disk: matching gendisk
* @rq: request to insert
* @at_head: insert request at head or tail of queue
* @done: I/O completion handler
*
* Description:
* Insert a fully prepared request at the back of the I/O scheduler queue
* for execution. Don't wait for completion.
*
* Note:
* This function will invoke @done directly if the queue is dead.
*/
void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk,
struct request *rq, int at_head,
rq_end_io_fn *done)
{
int where = at_head ? ELEVATOR_INSERT_FRONT : ELEVATOR_INSERT_BACK;
WARN_ON(irqs_disabled());
WARN_ON(!blk_rq_is_passthrough(rq));
rq->rq_disk = bd_disk;
rq->end_io = done;
/*
* don't check dying flag for MQ because the request won't
* be reused after dying flag is set
*/
if (q->mq_ops) {
blk_mq_sched_insert_request(rq, at_head, true, false, false);
return;
}
spin_lock_irq(q->queue_lock);
if (unlikely(blk_queue_dying(q))) {
rq->rq_flags |= RQF_QUIET;
rq->errors = -ENXIO;
__blk_end_request_all(rq, rq->errors);
spin_unlock_irq(q->queue_lock);
return;
}
__elv_add_request(q, rq, where);
__blk_run_queue(q);
spin_unlock_irq(q->queue_lock);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Jens Axboe | 74 | 47.44% | 5 | 29.41% |
James Bottomley | 25 | 16.03% | 1 | 5.88% |
Muthukumar Ratty | 19 | 12.18% | 1 | 5.88% |
Christoph Hellwig | 15 | 9.62% | 5 | 29.41% |
Tejun Heo | 13 | 8.33% | 1 | 5.88% |
Mike Christie | 5 | 3.21% | 1 | 5.88% |
Bartlomiej Zolnierkiewicz | 3 | 1.92% | 1 | 5.88% |
Bart Van Assche | 2 | 1.28% | 2 | 11.76% |
Total | 156 | 100.00% | 17 | 100.00% |
EXPORT_SYMBOL_GPL(blk_execute_rq_nowait);
/**
* blk_execute_rq - insert a request into queue for execution
* @q: queue to insert the request in
* @bd_disk: matching gendisk
* @rq: request to insert
* @at_head: insert request at head or tail of queue
*
* Description:
* Insert a fully prepared request at the back of the I/O scheduler queue
* for execution and wait for completion.
*/
int blk_execute_rq(struct request_queue *q, struct gendisk *bd_disk,
struct request *rq, int at_head)
{
DECLARE_COMPLETION_ONSTACK(wait);
int err = 0;
unsigned long hang_check;
rq->end_io_data = &wait;
blk_execute_rq_nowait(q, bd_disk, rq, at_head, blk_end_sync_rq);
/* Prevent hang_check timer from firing at us during very long I/O */
hang_check = sysctl_hung_task_timeout_secs;
if (hang_check)
while (!wait_for_completion_io_timeout(&wait, hang_check * (HZ/2)));
else
wait_for_completion_io(&wait);
if (rq->errors)
err = -EIO;
return err;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Jens Axboe | 72 | 68.57% | 1 | 33.33% |
Mark Lord | 31 | 29.52% | 1 | 33.33% |
Vladimir Davydov | 2 | 1.90% | 1 | 33.33% |
Total | 105 | 100.00% | 3 | 100.00% |
EXPORT_SYMBOL(blk_execute_rq);
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Jens Axboe | 212 | 63.47% | 5 | 22.73% |
Mark Lord | 31 | 9.28% | 1 | 4.55% |
James Bottomley | 25 | 7.49% | 1 | 4.55% |
Muthukumar Ratty | 20 | 5.99% | 1 | 4.55% |
Christoph Hellwig | 15 | 4.49% | 5 | 22.73% |
Tejun Heo | 13 | 3.89% | 1 | 4.55% |
Mike Christie | 5 | 1.50% | 1 | 4.55% |
Bartlomiej Zolnierkiewicz | 3 | 0.90% | 1 | 4.55% |
Clark Williams | 3 | 0.90% | 1 | 4.55% |
Vladimir Davydov | 2 | 0.60% | 1 | 4.55% |
Randy Dunlap | 2 | 0.60% | 1 | 4.55% |
Bart Van Assche | 2 | 0.60% | 2 | 9.09% |
FUJITA Tomonori | 1 | 0.30% | 1 | 4.55% |
Total | 334 | 100.00% | 22 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.