From 3ad9f1c9e229cb02060c16cc6af10ecae390ec81 Mon Sep 17 00:00:00 2001 From: Alexander Winkowski Date: Wed, 17 Aug 2022 05:19:13 +0000 Subject: [PATCH] Revert "block: pass 'op' to blk_queue_enter()" [5/7] This reverts commit 599917ee4f6cdbd4c7a02796332189340c61e7d1. Reason for revert: this patchset is either mismerged or incomplete. UFS may fail to resume from suspend with the log containing these lines: [23703.703882] scsi host0: runtime PM trying to activate child device host0 but parent (1d84000.ufshc) is not active [23703.703977] scsi target0:0:0: runtime PM trying to activate child device target0:0:0 but parent (host0) is not active [23703.704369] sd 0:0:0:0: runtime PM trying to activate child device 0:0:0:0 but parent (target0:0:0) is not active [23703.704380] scsi 0:0:0:49488: runtime PM trying to activate child device 0:0:0:49488 but parent (target0:0:0) is not active [23703.704470] sd 0:0:0:3: runtime PM trying to activate child device 0:0:0:3 but parent (target0:0:0) is not active [23703.704478] sd 0:0:0:5: runtime PM trying to activate child device 0:0:0:5 but parent (target0:0:0) is not active [23703.704557] sd 0:0:0:1: runtime PM trying to activate child device 0:0:0:1 but parent (target0:0:0) is not active [23703.704565] scsi 0:0:0:49476: runtime PM trying to activate child device 0:0:0:49476 but parent (target0:0:0) is not active [23703.704643] sd 0:0:0:4: runtime PM trying to activate child device 0:0:0:4 but parent (target0:0:0) is not active [23703.704651] scsi 0:0:0:49456: runtime PM trying to activate child device 0:0:0:49456 but parent (target0:0:0) is not active [23703.704722] sd 0:0:0:2: runtime PM trying to activate child device 0:0:0:2 but parent (target0:0:0) is not active This shoudn't be a problem [1], but the device becomes unresponsive until forced reboot is done by holding power button. [1] https://lkml.org/lkml/2020/11/13/2 Test: the mentioned kernel messages do not cause any issue Change-Id: I4bd04d2330db6de04f4a160c0870e130957a196c Signed-off-by: Alexander Winkowski --- block/blk-core.c | 13 ++++++------- block/blk-mq.c | 3 +-- fs/block_dev.c | 4 ++-- include/linux/blkdev.h | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 5941513d4d4f..6e5199736287 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -891,14 +891,14 @@ struct request_queue *blk_alloc_queue(gfp_t gfp_mask) } EXPORT_SYMBOL(blk_alloc_queue); -int blk_queue_enter(struct request_queue *q, unsigned int op) +int blk_queue_enter(struct request_queue *q, bool nowait) { while (true) { if (percpu_ref_tryget_live(&q->q_usage_counter)) return 0; - if (op & REQ_NOWAIT) + if (nowait) return -EBUSY; /* @@ -1540,8 +1540,8 @@ static struct request *blk_old_get_request(struct request_queue *q, /* create ioc upfront */ create_io_context(gfp_mask, q->node); - ret = blk_queue_enter(q, (gfp_mask & __GFP_DIRECT_RECLAIM) ? op : - op | REQ_NOWAIT); + ret = blk_queue_enter(q, !(gfp_mask & __GFP_DIRECT_RECLAIM) || + (op & REQ_NOWAIT)); if (ret) return ERR_PTR(ret); spin_lock_irq(q->queue_lock); @@ -1568,7 +1568,6 @@ struct request *blk_get_request(struct request_queue *q, unsigned int op, req = blk_mq_alloc_request(q, op, (gfp_mask & __GFP_DIRECT_RECLAIM) ? 0 : BLK_MQ_REQ_NOWAIT); - if (!IS_ERR(req) && q->mq_ops->initialize_rq_fn) q->mq_ops->initialize_rq_fn(req); } else { @@ -2318,7 +2317,7 @@ blk_qc_t generic_make_request(struct bio *bio) flags = BLK_MQ_REQ_NOWAIT; if (bio_flagged(bio, BIO_QUEUE_ENTERED)) blk_queue_enter_live(q); - else if (blk_queue_enter(q, bio->bi_opf) < 0) { + else if (blk_queue_enter(q, flags) < 0) { if (!blk_queue_dying(q) && (bio->bi_opf & REQ_NOWAIT)) bio_wouldblock_error(bio); else @@ -2371,7 +2370,7 @@ blk_qc_t generic_make_request(struct bio *bio) flags = 0; if (bio->bi_opf & REQ_NOWAIT) flags = BLK_MQ_REQ_NOWAIT; - if (blk_queue_enter(q, bio->bi_opf) < 0) + if (blk_queue_enter(q, flags) < 0) enter_succeeded = false; } diff --git a/block/blk-mq.c b/block/blk-mq.c index 4490fd758534..e991d2b4a78d 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -397,8 +397,7 @@ struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op, struct request *rq; int ret; - ret = blk_queue_enter(q, !(flags & BLK_MQ_REQ_NOWAIT) ? op : - op | REQ_NOWAIT); + ret = blk_queue_enter(q, flags & BLK_MQ_REQ_NOWAIT); if (ret) return ERR_PTR(ret); diff --git a/fs/block_dev.c b/fs/block_dev.c index 99dcc7896bef..4f34dc2bca5e 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -696,7 +696,7 @@ int bdev_read_page(struct block_device *bdev, sector_t sector, if (!ops->rw_page || bdev_get_integrity(bdev)) return result; - result = blk_queue_enter(bdev->bd_queue, 0); + result = blk_queue_enter(bdev->bd_queue, false); if (result) return result; result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, false); @@ -732,7 +732,7 @@ int bdev_write_page(struct block_device *bdev, sector_t sector, if (!ops->rw_page || bdev_get_integrity(bdev)) return -EOPNOTSUPP; - result = blk_queue_enter(bdev->bd_queue, 0); + result = blk_queue_enter(bdev->bd_queue, false); if (result) return result; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 9e3e4fec0e4e..f67d25137111 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1035,7 +1035,7 @@ extern int scsi_cmd_ioctl(struct request_queue *, struct gendisk *, fmode_t, extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t, struct scsi_ioctl_command __user *); -extern int blk_queue_enter(struct request_queue *q, unsigned int op); +extern int blk_queue_enter(struct request_queue *q, bool nowait); extern void blk_queue_exit(struct request_queue *q); extern void blk_start_queue(struct request_queue *q); extern void blk_start_queue_async(struct request_queue *q);