From: Greg Kroah-Hartman Date: Thu, 22 Mar 2018 14:06:32 +0000 (+0100) Subject: drop dm patch from 4.9.y, 4.14.y and 4.15.y queues X-Git-Tag: v3.18.102~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=72aae746fcfd08abb6b54c78c6a5d6d2fd390cb5;p=thirdparty%2Fkernel%2Fstable-queue.git drop dm patch from 4.9.y, 4.14.y and 4.15.y queues --- diff --git a/queue-4.14/dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch b/queue-4.14/dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch deleted file mode 100644 index a5b91773b81..00000000000 --- a/queue-4.14/dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch +++ /dev/null @@ -1,137 +0,0 @@ -From foo@baz Thu Mar 22 14:26:48 CET 2018 -From: NeilBrown -Date: Wed, 6 Sep 2017 09:43:28 +1000 -Subject: dm: ensure bio submission follows a depth-first tree walk - -From: NeilBrown - - -[ Upstream commit 18a25da84354c6bb655320de6072c00eda6eb602 ] - -A dm device can, in general, represent a tree of targets, each of which -handles a sub-range of the range of blocks handled by the parent. - -The bio sequencing managed by generic_make_request() requires that bios -are generated and handled in a depth-first manner. Each call to a -make_request_fn() may submit bios to a single member device, and may -submit bios for a reduced region of the same device as the -make_request_fn. - -In particular, any bios submitted to member devices must be expected to -be processed in order, so a later one must never wait for an earlier -one. - -This ordering is usually achieved by using bio_split() to reduce a bio -to a size that can be completely handled by one target, and resubmitting -the remainder to the originating device. bio_queue_split() shows the -canonical approach. - -dm doesn't follow this approach, largely because it has needed to split -bios since long before bio_split() was available. It currently can -submit bios to separate targets within the one dm_make_request() call. -Dependencies between these targets, as can happen with dm-snap, can -cause deadlocks if either bios gets stuck behind the other in the queues -managed by generic_make_request(). This requires the 'rescue' -functionality provided by dm_offload_{start,end}. - -Some of this requirement can be removed by changing the order of bio -submission to follow the canonical approach. That is, if dm finds that -it needs to split a bio, the remainder should be sent to -generic_make_request() rather than being handled immediately. This -delays the handling until the first part is completely processed, so the -deadlock problems do not occur. - -__split_and_process_bio() can be called both from dm_make_request() and -from dm_wq_work(). When called from dm_wq_work() the current approach -is perfectly satisfactory as each bio will be processed immediately. -When called from dm_make_request(), current->bio_list will be non-NULL, -and in this case it is best to create a separate "clone" bio for the -remainder. - -When we use bio_clone_bioset() to split off the front part of a bio -and chain the two together and submit the remainder to -generic_make_request(), it is important that the newly allocated -bio is used as the head to be processed immediately, and the original -bio gets "bio_advance()"d and sent to generic_make_request() as the -remainder. Otherwise, if the newly allocated bio is used as the -remainder, and if it then needs to be split again, then the next -bio_clone_bioset() call will be made while holding a reference a bio -(result of the first clone) from the same bioset. This can potentially -exhaust the bioset mempool and result in a memory allocation deadlock. - -Note that there is no race caused by reassigning cio.io->bio after already -calling __map_bio(). This bio will only be dereferenced again after -dec_pending() has found io->io_count to be zero, and this cannot happen -before the dec_pending() call at the end of __split_and_process_bio(). - -To provide the clone bio when splitting, we use q->bio_split. This -was previously being freed by bio-based dm to avoid having excess -rescuer threads. As bio_split bio sets no longer create rescuer -threads, there is little cost and much gain from restoring the -q->bio_split bio set. - -Signed-off-by: NeilBrown -Signed-off-by: Mike Snitzer -Signed-off-by: Sasha Levin -Signed-off-by: Greg Kroah-Hartman ---- - drivers/md/dm.c | 33 ++++++++++++++++++++++++--------- - 1 file changed, 24 insertions(+), 9 deletions(-) - ---- a/drivers/md/dm.c -+++ b/drivers/md/dm.c -@@ -1497,8 +1497,29 @@ static void __split_and_process_bio(stru - } else { - ci.bio = bio; - ci.sector_count = bio_sectors(bio); -- while (ci.sector_count && !error) -+ while (ci.sector_count && !error) { - error = __split_and_process_non_flush(&ci); -+ if (current->bio_list && ci.sector_count && !error) { -+ /* -+ * Remainder must be passed to generic_make_request() -+ * so that it gets handled *after* bios already submitted -+ * have been completely processed. -+ * We take a clone of the original to store in -+ * ci.io->bio to be used by end_io_acct() and -+ * for dec_pending to use for completion handling. -+ * As this path is not used for REQ_OP_ZONE_REPORT, -+ * the usage of io->bio in dm_remap_zone_report() -+ * won't be affected by this reassignment. -+ */ -+ struct bio *b = bio_clone_bioset(bio, GFP_NOIO, -+ md->queue->bio_split); -+ ci.io->bio = b; -+ bio_advance(bio, (bio_sectors(bio) - ci.sector_count) << 9); -+ bio_chain(b, bio); -+ generic_make_request(bio); -+ break; -+ } -+ } - } - - /* drop the extra reference count */ -@@ -1509,8 +1530,8 @@ static void __split_and_process_bio(stru - *---------------------------------------------------------------*/ - - /* -- * The request function that just remaps the bio built up by -- * dm_merge_bvec. -+ * The request function that remaps the bio to one target and -+ * splits off any remainder. - */ - static blk_qc_t dm_make_request(struct request_queue *q, struct bio *bio) - { -@@ -2044,12 +2065,6 @@ int dm_setup_md_queue(struct mapped_devi - case DM_TYPE_DAX_BIO_BASED: - dm_init_normal_md_queue(md); - blk_queue_make_request(md->queue, dm_make_request); -- /* -- * DM handles splitting bios as needed. Free the bio_split bioset -- * since it won't be used (saves 1 process per bio-based DM device). -- */ -- bioset_free(md->queue->bio_split); -- md->queue->bio_split = NULL; - - if (type == DM_TYPE_DAX_BIO_BASED) - queue_flag_set_unlocked(QUEUE_FLAG_DAX, md->queue); diff --git a/queue-4.14/series b/queue-4.14/series index 7867e03857b..4157cb0c469 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -6,7 +6,6 @@ cpufreq-longhaul-revert-transition_delay_us-to-200-ms.patch media-c8sectpfe-fix-potential-null-pointer-dereference-in-c8sectpfe_timer_interrupt.patch drm-msm-fix-leak-in-failed-get_pages.patch net-fec-add-phy_reset_after_clk_enable-support.patch -dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch rdma-iwpm-fix-uninitialized-error-code-in-iwpm_send_mapinfo.patch hv_netvsc-fix-the-receive-buffer-size-limit.patch hv_netvsc-fix-the-tx-rx-buffer-default-sizes.patch diff --git a/queue-4.15/dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch b/queue-4.15/dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch deleted file mode 100644 index 0186f94daa2..00000000000 --- a/queue-4.15/dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch +++ /dev/null @@ -1,137 +0,0 @@ -From foo@baz Thu Mar 22 14:03:39 CET 2018 -From: NeilBrown -Date: Wed, 6 Sep 2017 09:43:28 +1000 -Subject: dm: ensure bio submission follows a depth-first tree walk - -From: NeilBrown - - -[ Upstream commit 18a25da84354c6bb655320de6072c00eda6eb602 ] - -A dm device can, in general, represent a tree of targets, each of which -handles a sub-range of the range of blocks handled by the parent. - -The bio sequencing managed by generic_make_request() requires that bios -are generated and handled in a depth-first manner. Each call to a -make_request_fn() may submit bios to a single member device, and may -submit bios for a reduced region of the same device as the -make_request_fn. - -In particular, any bios submitted to member devices must be expected to -be processed in order, so a later one must never wait for an earlier -one. - -This ordering is usually achieved by using bio_split() to reduce a bio -to a size that can be completely handled by one target, and resubmitting -the remainder to the originating device. bio_queue_split() shows the -canonical approach. - -dm doesn't follow this approach, largely because it has needed to split -bios since long before bio_split() was available. It currently can -submit bios to separate targets within the one dm_make_request() call. -Dependencies between these targets, as can happen with dm-snap, can -cause deadlocks if either bios gets stuck behind the other in the queues -managed by generic_make_request(). This requires the 'rescue' -functionality provided by dm_offload_{start,end}. - -Some of this requirement can be removed by changing the order of bio -submission to follow the canonical approach. That is, if dm finds that -it needs to split a bio, the remainder should be sent to -generic_make_request() rather than being handled immediately. This -delays the handling until the first part is completely processed, so the -deadlock problems do not occur. - -__split_and_process_bio() can be called both from dm_make_request() and -from dm_wq_work(). When called from dm_wq_work() the current approach -is perfectly satisfactory as each bio will be processed immediately. -When called from dm_make_request(), current->bio_list will be non-NULL, -and in this case it is best to create a separate "clone" bio for the -remainder. - -When we use bio_clone_bioset() to split off the front part of a bio -and chain the two together and submit the remainder to -generic_make_request(), it is important that the newly allocated -bio is used as the head to be processed immediately, and the original -bio gets "bio_advance()"d and sent to generic_make_request() as the -remainder. Otherwise, if the newly allocated bio is used as the -remainder, and if it then needs to be split again, then the next -bio_clone_bioset() call will be made while holding a reference a bio -(result of the first clone) from the same bioset. This can potentially -exhaust the bioset mempool and result in a memory allocation deadlock. - -Note that there is no race caused by reassigning cio.io->bio after already -calling __map_bio(). This bio will only be dereferenced again after -dec_pending() has found io->io_count to be zero, and this cannot happen -before the dec_pending() call at the end of __split_and_process_bio(). - -To provide the clone bio when splitting, we use q->bio_split. This -was previously being freed by bio-based dm to avoid having excess -rescuer threads. As bio_split bio sets no longer create rescuer -threads, there is little cost and much gain from restoring the -q->bio_split bio set. - -Signed-off-by: NeilBrown -Signed-off-by: Mike Snitzer -Signed-off-by: Sasha Levin -Signed-off-by: Greg Kroah-Hartman ---- - drivers/md/dm.c | 33 ++++++++++++++++++++++++--------- - 1 file changed, 24 insertions(+), 9 deletions(-) - ---- a/drivers/md/dm.c -+++ b/drivers/md/dm.c -@@ -1499,8 +1499,29 @@ static void __split_and_process_bio(stru - } else { - ci.bio = bio; - ci.sector_count = bio_sectors(bio); -- while (ci.sector_count && !error) -+ while (ci.sector_count && !error) { - error = __split_and_process_non_flush(&ci); -+ if (current->bio_list && ci.sector_count && !error) { -+ /* -+ * Remainder must be passed to generic_make_request() -+ * so that it gets handled *after* bios already submitted -+ * have been completely processed. -+ * We take a clone of the original to store in -+ * ci.io->bio to be used by end_io_acct() and -+ * for dec_pending to use for completion handling. -+ * As this path is not used for REQ_OP_ZONE_REPORT, -+ * the usage of io->bio in dm_remap_zone_report() -+ * won't be affected by this reassignment. -+ */ -+ struct bio *b = bio_clone_bioset(bio, GFP_NOIO, -+ md->queue->bio_split); -+ ci.io->bio = b; -+ bio_advance(bio, (bio_sectors(bio) - ci.sector_count) << 9); -+ bio_chain(b, bio); -+ generic_make_request(bio); -+ break; -+ } -+ } - } - - /* drop the extra reference count */ -@@ -1511,8 +1532,8 @@ static void __split_and_process_bio(stru - *---------------------------------------------------------------*/ - - /* -- * The request function that just remaps the bio built up by -- * dm_merge_bvec. -+ * The request function that remaps the bio to one target and -+ * splits off any remainder. - */ - static blk_qc_t dm_make_request(struct request_queue *q, struct bio *bio) - { -@@ -2035,12 +2056,6 @@ int dm_setup_md_queue(struct mapped_devi - case DM_TYPE_DAX_BIO_BASED: - dm_init_normal_md_queue(md); - blk_queue_make_request(md->queue, dm_make_request); -- /* -- * DM handles splitting bios as needed. Free the bio_split bioset -- * since it won't be used (saves 1 process per bio-based DM device). -- */ -- bioset_free(md->queue->bio_split); -- md->queue->bio_split = NULL; - - if (type == DM_TYPE_DAX_BIO_BASED) - queue_flag_set_unlocked(QUEUE_FLAG_DAX, md->queue); diff --git a/queue-4.15/series b/queue-4.15/series index 07e14bb2024..00e824d467b 100644 --- a/queue-4.15/series +++ b/queue-4.15/series @@ -7,7 +7,6 @@ cpufreq-longhaul-revert-transition_delay_us-to-200-ms.patch media-c8sectpfe-fix-potential-null-pointer-dereference-in-c8sectpfe_timer_interrupt.patch drm-msm-fix-leak-in-failed-get_pages.patch net-fec-add-phy_reset_after_clk_enable-support.patch -dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch ib-ipoib-warn-when-one-port-fails-to-initialize.patch rdma-iwpm-fix-uninitialized-error-code-in-iwpm_send_mapinfo.patch hv_netvsc-fix-the-receive-buffer-size-limit.patch diff --git a/queue-4.9/dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch b/queue-4.9/dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch deleted file mode 100644 index 4dce67db09e..00000000000 --- a/queue-4.9/dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch +++ /dev/null @@ -1,137 +0,0 @@ -From foo@baz Thu Mar 22 14:40:24 CET 2018 -From: NeilBrown -Date: Wed, 6 Sep 2017 09:43:28 +1000 -Subject: dm: ensure bio submission follows a depth-first tree walk - -From: NeilBrown - - -[ Upstream commit 18a25da84354c6bb655320de6072c00eda6eb602 ] - -A dm device can, in general, represent a tree of targets, each of which -handles a sub-range of the range of blocks handled by the parent. - -The bio sequencing managed by generic_make_request() requires that bios -are generated and handled in a depth-first manner. Each call to a -make_request_fn() may submit bios to a single member device, and may -submit bios for a reduced region of the same device as the -make_request_fn. - -In particular, any bios submitted to member devices must be expected to -be processed in order, so a later one must never wait for an earlier -one. - -This ordering is usually achieved by using bio_split() to reduce a bio -to a size that can be completely handled by one target, and resubmitting -the remainder to the originating device. bio_queue_split() shows the -canonical approach. - -dm doesn't follow this approach, largely because it has needed to split -bios since long before bio_split() was available. It currently can -submit bios to separate targets within the one dm_make_request() call. -Dependencies between these targets, as can happen with dm-snap, can -cause deadlocks if either bios gets stuck behind the other in the queues -managed by generic_make_request(). This requires the 'rescue' -functionality provided by dm_offload_{start,end}. - -Some of this requirement can be removed by changing the order of bio -submission to follow the canonical approach. That is, if dm finds that -it needs to split a bio, the remainder should be sent to -generic_make_request() rather than being handled immediately. This -delays the handling until the first part is completely processed, so the -deadlock problems do not occur. - -__split_and_process_bio() can be called both from dm_make_request() and -from dm_wq_work(). When called from dm_wq_work() the current approach -is perfectly satisfactory as each bio will be processed immediately. -When called from dm_make_request(), current->bio_list will be non-NULL, -and in this case it is best to create a separate "clone" bio for the -remainder. - -When we use bio_clone_bioset() to split off the front part of a bio -and chain the two together and submit the remainder to -generic_make_request(), it is important that the newly allocated -bio is used as the head to be processed immediately, and the original -bio gets "bio_advance()"d and sent to generic_make_request() as the -remainder. Otherwise, if the newly allocated bio is used as the -remainder, and if it then needs to be split again, then the next -bio_clone_bioset() call will be made while holding a reference a bio -(result of the first clone) from the same bioset. This can potentially -exhaust the bioset mempool and result in a memory allocation deadlock. - -Note that there is no race caused by reassigning cio.io->bio after already -calling __map_bio(). This bio will only be dereferenced again after -dec_pending() has found io->io_count to be zero, and this cannot happen -before the dec_pending() call at the end of __split_and_process_bio(). - -To provide the clone bio when splitting, we use q->bio_split. This -was previously being freed by bio-based dm to avoid having excess -rescuer threads. As bio_split bio sets no longer create rescuer -threads, there is little cost and much gain from restoring the -q->bio_split bio set. - -Signed-off-by: NeilBrown -Signed-off-by: Mike Snitzer -Signed-off-by: Sasha Levin -Signed-off-by: Greg Kroah-Hartman ---- - drivers/md/dm.c | 33 ++++++++++++++++++++++++--------- - 1 file changed, 24 insertions(+), 9 deletions(-) - ---- a/drivers/md/dm.c -+++ b/drivers/md/dm.c -@@ -1320,8 +1320,29 @@ static void __split_and_process_bio(stru - } else { - ci.bio = bio; - ci.sector_count = bio_sectors(bio); -- while (ci.sector_count && !error) -+ while (ci.sector_count && !error) { - error = __split_and_process_non_flush(&ci); -+ if (current->bio_list && ci.sector_count && !error) { -+ /* -+ * Remainder must be passed to generic_make_request() -+ * so that it gets handled *after* bios already submitted -+ * have been completely processed. -+ * We take a clone of the original to store in -+ * ci.io->bio to be used by end_io_acct() and -+ * for dec_pending to use for completion handling. -+ * As this path is not used for REQ_OP_ZONE_REPORT, -+ * the usage of io->bio in dm_remap_zone_report() -+ * won't be affected by this reassignment. -+ */ -+ struct bio *b = bio_clone_bioset(bio, GFP_NOIO, -+ md->queue->bio_split); -+ ci.io->bio = b; -+ bio_advance(bio, (bio_sectors(bio) - ci.sector_count) << 9); -+ bio_chain(b, bio); -+ generic_make_request(bio); -+ break; -+ } -+ } - } - - /* drop the extra reference count */ -@@ -1332,8 +1353,8 @@ static void __split_and_process_bio(stru - *---------------------------------------------------------------*/ - - /* -- * The request function that just remaps the bio built up by -- * dm_merge_bvec. -+ * The request function that remaps the bio to one target and -+ * splits off any remainder. - */ - static blk_qc_t dm_make_request(struct request_queue *q, struct bio *bio) - { -@@ -1854,12 +1875,6 @@ int dm_setup_md_queue(struct mapped_devi - case DM_TYPE_DAX_BIO_BASED: - dm_init_normal_md_queue(md); - blk_queue_make_request(md->queue, dm_make_request); -- /* -- * DM handles splitting bios as needed. Free the bio_split bioset -- * since it won't be used (saves 1 process per bio-based DM device). -- */ -- bioset_free(md->queue->bio_split); -- md->queue->bio_split = NULL; - - if (type == DM_TYPE_DAX_BIO_BASED) - queue_flag_set_unlocked(QUEUE_FLAG_DAX, md->queue); diff --git a/queue-4.9/series b/queue-4.9/series index 9b8cc52a2da..529c1649e5b 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -136,7 +136,6 @@ bluetooth-hci_qca-avoid-setup-failure-on-missing-rampatch.patch bluetooth-btqcomsmd-fix-skb-double-free-corruption.patch media-c8sectpfe-fix-potential-null-pointer-dereference-in-c8sectpfe_timer_interrupt.patch drm-msm-fix-leak-in-failed-get_pages.patch -dm-ensure-bio-submission-follows-a-depth-first-tree-walk.patch rdma-iwpm-fix-uninitialized-error-code-in-iwpm_send_mapinfo.patch rtlwifi-rtl_pci-fix-the-bug-when-inactiveps-is-enabled.patch media-bt8xx-fix-err-bt878_probe.patch