Release 4.16 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, blk_status_t 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 | 33 | 94.29% | 1 | 33.33% |
FUJITA Tomonori | 1 | 2.86% | 1 | 33.33% |
Christoph Hellwig | 1 | 2.86% | 1 | 33.33% |
Total | 35 | 100.00% | 3 | 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);
return;
}
spin_lock_irq(q->queue_lock);
if (unlikely(blk_queue_dying(q))) {
rq->rq_flags |= RQF_QUIET;
__blk_end_request_all(rq, BLK_STS_IOERR);
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 | 51.03% | 4 | 23.53% |
Muthukumar Ratty | 19 | 13.10% | 1 | 5.88% |
James Bottomley | 17 | 11.72% | 1 | 5.88% |
Christoph Hellwig | 16 | 11.03% | 6 | 35.29% |
Tejun Heo | 13 | 8.97% | 1 | 5.88% |
Mike Christie | 3 | 2.07% | 1 | 5.88% |
Bart Van Assche | 2 | 1.38% | 2 | 11.76% |
Bartlomiej Zolnierkiewicz | 1 | 0.69% | 1 | 5.88% |
Total | 145 | 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.
*/
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 | 191 | 62.83% | 4 | 17.39% |
Mark Lord | 31 | 10.20% | 1 | 4.35% |
Muthukumar Ratty | 20 | 6.58% | 1 | 4.35% |
Christoph Hellwig | 18 | 5.92% | 7 | 30.43% |
James Bottomley | 17 | 5.59% | 1 | 4.35% |
Tejun Heo | 13 | 4.28% | 1 | 4.35% |
Clark Williams | 3 | 0.99% | 1 | 4.35% |
Mike Christie | 3 | 0.99% | 1 | 4.35% |
Bart Van Assche | 2 | 0.66% | 2 | 8.70% |
Randy Dunlap | 2 | 0.66% | 1 | 4.35% |
Vladimir Davydov | 2 | 0.66% | 1 | 4.35% |
FUJITA Tomonori | 1 | 0.33% | 1 | 4.35% |
Bartlomiej Zolnierkiewicz | 1 | 0.33% | 1 | 4.35% |
Total | 304 | 100.00% | 23 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.