diff options
author | Mike Snitzer <snitzer@redhat.com> | 2011-02-11 05:05:46 -0500 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2011-02-11 05:05:46 -0500 |
commit | 9d5a4e946ce5352f19400b6370f4cd8e72806278 (patch) | |
tree | ba62a2ab56da1f943b0dbcae527c70b817a104de /block | |
parent | ae1b1539622fb46e51b4d13b3f9e5f4c713f86ae (diff) |
block: skip elevator data initialization for flush requests
Skip elevator initialization for flush requests by passing priv=0 to
blk_alloc_request() in get_request(). As such elv_set_request() is
never called for flush requests.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-core.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index 05746093b45e..ab4a7696956d 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -738,6 +738,25 @@ static void freed_request(struct request_queue *q, int sync, int priv) | |||
738 | } | 738 | } |
739 | 739 | ||
740 | /* | 740 | /* |
741 | * Determine if elevator data should be initialized when allocating the | ||
742 | * request associated with @bio. | ||
743 | */ | ||
744 | static bool blk_rq_should_init_elevator(struct bio *bio) | ||
745 | { | ||
746 | if (!bio) | ||
747 | return true; | ||
748 | |||
749 | /* | ||
750 | * Flush requests do not use the elevator so skip initialization. | ||
751 | * This allows a request to share the flush and elevator data. | ||
752 | */ | ||
753 | if (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) | ||
754 | return false; | ||
755 | |||
756 | return true; | ||
757 | } | ||
758 | |||
759 | /* | ||
741 | * Get a free request, queue_lock must be held. | 760 | * Get a free request, queue_lock must be held. |
742 | * Returns NULL on failure, with queue_lock held. | 761 | * Returns NULL on failure, with queue_lock held. |
743 | * Returns !NULL on success, with queue_lock *not held*. | 762 | * Returns !NULL on success, with queue_lock *not held*. |
@@ -749,7 +768,7 @@ static struct request *get_request(struct request_queue *q, int rw_flags, | |||
749 | struct request_list *rl = &q->rq; | 768 | struct request_list *rl = &q->rq; |
750 | struct io_context *ioc = NULL; | 769 | struct io_context *ioc = NULL; |
751 | const bool is_sync = rw_is_sync(rw_flags) != 0; | 770 | const bool is_sync = rw_is_sync(rw_flags) != 0; |
752 | int may_queue, priv; | 771 | int may_queue, priv = 0; |
753 | 772 | ||
754 | may_queue = elv_may_queue(q, rw_flags); | 773 | may_queue = elv_may_queue(q, rw_flags); |
755 | if (may_queue == ELV_MQUEUE_NO) | 774 | if (may_queue == ELV_MQUEUE_NO) |
@@ -793,9 +812,11 @@ static struct request *get_request(struct request_queue *q, int rw_flags, | |||
793 | rl->count[is_sync]++; | 812 | rl->count[is_sync]++; |
794 | rl->starved[is_sync] = 0; | 813 | rl->starved[is_sync] = 0; |
795 | 814 | ||
796 | priv = !test_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags); | 815 | if (blk_rq_should_init_elevator(bio)) { |
797 | if (priv) | 816 | priv = !test_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags); |
798 | rl->elvpriv++; | 817 | if (priv) |
818 | rl->elvpriv++; | ||
819 | } | ||
799 | 820 | ||
800 | if (blk_queue_io_stat(q)) | 821 | if (blk_queue_io_stat(q)) |
801 | rw_flags |= REQ_IO_STAT; | 822 | rw_flags |= REQ_IO_STAT; |