On 13/05/2020 04:48, Ming Lei wrote:
+static void blk_mq_resubmit_rq(struct request *rq)
+{
+ struct request *nrq;
+ unsigned int flags = 0;
+ struct blk_mq_hw_ctx *hctx = rq->mq_hctx;
+ struct blk_mq_tags *tags = rq->q->elevator ? hctx->sched_tags :
+ hctx->tags;
+ bool reserved = blk_mq_tag_is_reserved(tags, rq->internal_tag);
+
+ if (rq->rq_flags & RQF_PREEMPT)
+ flags |= BLK_MQ_REQ_PREEMPT;
+ if (reserved)
+ flags |= BLK_MQ_REQ_RESERVED;
+ /*
+ * Queue freezing might be in-progress, and wait freeze can't be
+ * done now because we have request not completed yet, so mark this
+ * allocation as BLK_MQ_REQ_FORCE for avoiding this allocation &
+ * freeze hung forever.
+ */
+ flags |= BLK_MQ_REQ_FORCE;
+
So setting this flag triggers this WARN:
[ 101.308666] Modules linked in:
[ 101.311710] CPU: 23 PID: 1491 Comm: bash Not tainted
5.7.0-rc2-00106-g63430d85fea8 #337
[ 101.319698] Hardware name: Huawei Taishan 2280 /D05, BIOS Hisilicon
D05 IT21 Nemo 2.0 RC0 04/18/2018
[ 101.328816] pstate: 60000005 (nZCv daif -PAN -UAO)
[ 101.333593] pc : blk_get_request+0xa4/0xac
[ 101.337676] lr : blk_get_request+0xa4/0xac
[ 101.341758] sp : ffff800021773aa0
[ 101.345059] x29: ffff800021773aa0 x28: 0000000000000004
[ 101.350357] x27: 0000000000000004 x26: 0000000000000004
[ 101.355655] x25: 0000000000000000 x24: ffff800010414b20
[ 101.360953] x23: 0000000000000008 x22: ffff001fb0ecf900
[ 101.366251] x21: ffff001fb0a42f40 x20: 0000000000004000
[ 101.371549] x19: 0000000000000010 x18: 0000000000000000
[ 101.376846] x17: 0000000000000000 x16: 0000000000000000
[ 101.382144] x15: 0000000000000000 x14: 0000000000000000
[ 101.387441] x13: 0000000000000000 x12: 0000000000000000
[ 101.392739] x11: 000000000000064f x10: 0000000000000008
[ 101.398036] x9 : ffff8000118f1c28 x8 : 2074736575716572
[ 101.403334] x7 : 5f7465675f6b6c62 x6 : ffff041febee21d0
[ 101.408632] x5 : 0000000000000000 x4 : 0000000000000000
[ 101.413930] x3 : 0000000000000000 x2 : ffff041febee9080
[ 101.419229] x1 : 0000000100000000 x0 : 000000000000001a
[ 101.424527] Call trace:
[ 101.426961] blk_get_request+0xa4/0xac
[ 101.430698] blk_mq_hctx_deactivate+0x270/0x3e4
[ 101.435215] blk_mq_hctx_notify_dead+0x198/0x1b4
[ 101.439821] cpuhp_invoke_callback+0x170/0x1e0
[ 101.444253] _cpu_down+0x100/0x238
[ 101.447642] cpu_down+0x40/0x68
[ 101.450770] cpu_device_down+0x14/0x1c
[ 101.454508] cpu_subsys_offline+0xc/0x14
[ 101.458417] device_offline+0x98/0xc4
[ 101.462065] online_store+0x3c/0x88
[ 101.465541] dev_attr_store+0x14/0x24
[ 101.469192] sysfs_kf_write+0x44/0x4c
[ 101.472840] kernfs_fop_write+0xfc/0x208
[ 101.476751] __vfs_write+0x18/0x3c
[ 101.480140] vfs_write+0xb4/0x1b8
[ 101.483442] ksys_write+0x4c/0xac
[ 101.486743] __arm64_sys_write+0x1c/0x24
[ 101.490654] el0_svc_common.constprop.3+0xb8/0x170
[ 101.495431] do_el0_svc+0x70/0x88
[ 101.498734] el0_sync_handler+0xf0/0x12c
[ 101.502643] el0_sync+0x140/0x180
[ 101.505944] ---[ end trace 137fed615521bd97 ]--
(the series tests ok, apart from that)
Thanks,
John
+ /* avoid allocation failure by clearing NOWAIT */
+ nrq = blk_get_request(rq->q, rq->cmd_flags & ~REQ_NOWAIT, flags);
+ if (!nrq)
+ return;