aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
Diffstat (limited to 'block')
-rw-r--r--block/blk-core.c42
-rw-r--r--block/blk-throttle.c3
2 files changed, 15 insertions, 30 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index 080204a10fcf..71894e143b91 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -855,15 +855,11 @@ static struct request *__get_request(struct request_queue *q, int rw_flags,
855{ 855{
856 struct request *rq; 856 struct request *rq;
857 struct request_list *rl = &q->rq; 857 struct request_list *rl = &q->rq;
858 struct elevator_type *et; 858 struct elevator_type *et = q->elevator->type;
859 struct io_context *ioc; 859 struct io_context *ioc = rq_ioc(bio);
860 struct io_cq *icq = NULL; 860 struct io_cq *icq = NULL;
861 const bool is_sync = rw_is_sync(rw_flags) != 0; 861 const bool is_sync = rw_is_sync(rw_flags) != 0;
862 bool retried = false;
863 int may_queue; 862 int may_queue;
864retry:
865 et = q->elevator->type;
866 ioc = rq_ioc(bio);
867 863
868 if (unlikely(blk_queue_dead(q))) 864 if (unlikely(blk_queue_dead(q)))
869 return NULL; 865 return NULL;
@@ -875,20 +871,6 @@ retry:
875 if (rl->count[is_sync]+1 >= queue_congestion_on_threshold(q)) { 871 if (rl->count[is_sync]+1 >= queue_congestion_on_threshold(q)) {
876 if (rl->count[is_sync]+1 >= q->nr_requests) { 872 if (rl->count[is_sync]+1 >= q->nr_requests) {
877 /* 873 /*
878 * We want ioc to record batching state. If it's
879 * not already there, creating a new one requires
880 * dropping queue_lock, which in turn requires
881 * retesting conditions to avoid queue hang.
882 */
883 if (!ioc && !retried) {
884 spin_unlock_irq(q->queue_lock);
885 create_io_context(gfp_mask, q->node);
886 spin_lock_irq(q->queue_lock);
887 retried = true;
888 goto retry;
889 }
890
891 /*
892 * The queue will fill after this allocation, so set 874 * The queue will fill after this allocation, so set
893 * it as full, and mark this process as "batching". 875 * it as full, and mark this process as "batching".
894 * This process will be allowed to complete a batch of 876 * This process will be allowed to complete a batch of
@@ -955,12 +937,8 @@ retry:
955 /* init elvpriv */ 937 /* init elvpriv */
956 if (rw_flags & REQ_ELVPRIV) { 938 if (rw_flags & REQ_ELVPRIV) {
957 if (unlikely(et->icq_cache && !icq)) { 939 if (unlikely(et->icq_cache && !icq)) {
958 create_io_context(gfp_mask, q->node); 940 if (ioc)
959 ioc = rq_ioc(bio); 941 icq = ioc_create_icq(ioc, q, gfp_mask);
960 if (!ioc)
961 goto fail_elvpriv;
962
963 icq = ioc_create_icq(ioc, q, gfp_mask);
964 if (!icq) 942 if (!icq)
965 goto fail_elvpriv; 943 goto fail_elvpriv;
966 } 944 }
@@ -1071,7 +1049,6 @@ retry:
1071 * to allocate at least one request, and up to a big batch of them 1049 * to allocate at least one request, and up to a big batch of them
1072 * for a small period time. See ioc_batching, ioc_set_batching 1050 * for a small period time. See ioc_batching, ioc_set_batching
1073 */ 1051 */
1074 create_io_context(GFP_NOIO, q->node);
1075 ioc_set_batching(q, current->io_context); 1052 ioc_set_batching(q, current->io_context);
1076 1053
1077 spin_lock_irq(q->queue_lock); 1054 spin_lock_irq(q->queue_lock);
@@ -1086,6 +1063,9 @@ struct request *blk_get_request(struct request_queue *q, int rw, gfp_t gfp_mask)
1086 1063
1087 BUG_ON(rw != READ && rw != WRITE); 1064 BUG_ON(rw != READ && rw != WRITE);
1088 1065
1066 /* create ioc upfront */
1067 create_io_context(gfp_mask, q->node);
1068
1089 spin_lock_irq(q->queue_lock); 1069 spin_lock_irq(q->queue_lock);
1090 rq = get_request(q, rw, NULL, gfp_mask); 1070 rq = get_request(q, rw, NULL, gfp_mask);
1091 if (!rq) 1071 if (!rq)
@@ -1698,6 +1678,14 @@ generic_make_request_checks(struct bio *bio)
1698 goto end_io; 1678 goto end_io;
1699 } 1679 }
1700 1680
1681 /*
1682 * Various block parts want %current->io_context and lazy ioc
1683 * allocation ends up trading a lot of pain for a small amount of
1684 * memory. Just allocate it upfront. This may fail and block
1685 * layer knows how to live with it.
1686 */
1687 create_io_context(GFP_ATOMIC, q->node);
1688
1701 if (blk_throtl_bio(q, bio)) 1689 if (blk_throtl_bio(q, bio))
1702 return false; /* throttled, will be resubmitted later */ 1690 return false; /* throttled, will be resubmitted later */
1703 1691
diff --git a/block/blk-throttle.c b/block/blk-throttle.c
index 5b0659512047..e287c19908c8 100644
--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -1123,9 +1123,6 @@ bool blk_throtl_bio(struct request_queue *q, struct bio *bio)
1123 goto out; 1123 goto out;
1124 } 1124 }
1125 1125
1126 /* bio_associate_current() needs ioc, try creating */
1127 create_io_context(GFP_ATOMIC, q->node);
1128
1129 /* 1126 /*
1130 * A throtl_grp pointer retrieved under rcu can be used to access 1127 * A throtl_grp pointer retrieved under rcu can be used to access
1131 * basic fields like stats and io rates. If a group has no rules, 1128 * basic fields like stats and io rates. If a group has no rules,