Release 4.12 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;
__blk_end_request_all(rq, -ENXIO);
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 | 50.00% | 5 | 27.78% |
Muthukumar Ratty | 19 | 12.84% | 1 | 5.56% |
James Bottomley | 17 | 11.49% | 1 | 5.56% |
Christoph Hellwig | 17 | 11.49% | 6 | 33.33% |
Tejun Heo | 13 | 8.78% | 1 | 5.56% |
Mike Christie | 3 | 2.03% | 1 | 5.56% |
Bartlomiej Zolnierkiewicz | 3 | 2.03% | 1 | 5.56% |
Bart Van Assche | 2 | 1.35% | 2 | 11.11% |
Total | 148 | 100.00% | 18 | 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.
*/
void blk_execute_rq(struct request_queue *q, struct gendisk *bd_disk,
struct request *rq, int at_head)
{
DECLARE_COMPLETION_ONSTACK(wait);
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);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Jens Axboe | 52 | 60.47% | 1 | 25.00% |
Mark Lord | 31 | 36.05% | 1 | 25.00% |
Vladimir Davydov | 2 | 2.33% | 1 | 25.00% |
Christoph Hellwig | 1 | 1.16% | 1 | 25.00% |
Total | 86 | 100.00% | 4 | 100.00% |
EXPORT_SYMBOL(blk_execute_rq);
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Jens Axboe | 192 | 62.54% | 5 | 20.83% |
Mark Lord | 31 | 10.10% | 1 | 4.17% |
Muthukumar Ratty | 20 | 6.51% | 1 | 4.17% |
Christoph Hellwig | 18 | 5.86% | 7 | 29.17% |
James Bottomley | 17 | 5.54% | 1 | 4.17% |
Tejun Heo | 13 | 4.23% | 1 | 4.17% |
Mike Christie | 3 | 0.98% | 1 | 4.17% |
Clark Williams | 3 | 0.98% | 1 | 4.17% |
Bartlomiej Zolnierkiewicz | 3 | 0.98% | 1 | 4.17% |
Bart Van Assche | 2 | 0.65% | 2 | 8.33% |
Vladimir Davydov | 2 | 0.65% | 1 | 4.17% |
Randy Dunlap | 2 | 0.65% | 1 | 4.17% |
FUJITA Tomonori | 1 | 0.33% | 1 | 4.17% |
Total | 307 | 100.00% | 24 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.