From patchwork Mon Apr 9 04:47:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bart Van Assche X-Patchwork-Id: 10330585 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 69C836020F for ; Mon, 9 Apr 2018 04:47:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 578B4288B6 for ; Mon, 9 Apr 2018 04:47:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 47A592898C; Mon, 9 Apr 2018 04:47:46 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AABF1288B6 for ; Mon, 9 Apr 2018 04:47:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751522AbeDIErp (ORCPT ); Mon, 9 Apr 2018 00:47:45 -0400 Received: from esa3.hgst.iphmx.com ([216.71.153.141]:36905 "EHLO esa3.hgst.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751367AbeDIEro (ORCPT ); Mon, 9 Apr 2018 00:47:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1523249264; x=1554785264; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=MyLB68GIgHOAzfjjE0rEZhKT3fOt2NEEhRSGmTzTtF8=; b=K8rh2jX9YLj7YoxjbnIS58QLj1qaPbNUKWnRvWZx1fW+GDlWxlVHCd6H LKSF/uBjcOZybDGRiQjwig8AmdUHn2x1KE+nU6ucQKzw9J3G4W1nnZ/sQ 9F2gZe1YosmKa52XN3mkPdP6rA/dtb2u8BfQ+XF8xl9b8a0xt1gxa+3In BXraIKj7OEgIcwaiswp2jjFYJt5lRFE0NrUm5hZkLh27c2+YquKZ1V9cg P46YTof/DMzSx2uU6wboEaUzGaeoTgYq+xjvl9KBXSE1hpj29WllfwLOG oAd7tkaEE3B+biXL4gNiJio4y6aYeaItG+A4RxrChRbWOBSPUfAy7NJcW A==; X-IronPort-AV: E=Sophos;i="5.48,426,1517846400"; d="scan'208";a="76234272" Received: from mail-bn3nam01lp0177.outbound.protection.outlook.com (HELO NAM01-BN3-obe.outbound.protection.outlook.com) ([216.32.180.177]) by ob1.hgst.iphmx.com with ESMTP; 09 Apr 2018 12:47:43 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sharedspace.onmicrosoft.com; s=selector1-wdc-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=MyLB68GIgHOAzfjjE0rEZhKT3fOt2NEEhRSGmTzTtF8=; b=D956bTHpYLzjeiGkdokKujpuf3PNvo/DC5e9dIMsgwBVXlj1R6ICfNe7Vi6IywbxNsHS+GQD1soDvuAi1ORRvmR+ED3utMxdd6/A7jJ+jJ9UXSXU4cI6EoH93JKPEiwcfK5uQX3htMBOFGNW7oD088p1IlCaOwwCuixW9He+IZ4= Received: from MWHPR04MB1198.namprd04.prod.outlook.com (10.173.48.151) by MWHPR04MB0190.namprd04.prod.outlook.com (10.169.201.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.653.12; Mon, 9 Apr 2018 04:47:41 +0000 Received: from MWHPR04MB1198.namprd04.prod.outlook.com ([fe80::bc43:e461:43cb:4d27]) by MWHPR04MB1198.namprd04.prod.outlook.com ([fe80::bc43:e461:43cb:4d27%14]) with mapi id 15.20.0653.014; Mon, 9 Apr 2018 04:47:41 +0000 From: Bart Van Assche To: "ming.lei@redhat.com" , "axboe@kernel.dk" CC: "linux-block@vger.kernel.org" , "joseph.qi@linux.alibaba.com" Subject: Re: [block regression] kernel oops triggered by removing scsi device dring IO Thread-Topic: [block regression] kernel oops triggered by removing scsi device dring IO Thread-Index: AQHTzvEVSGuTDcM2zkK3qfeX9OrP7aP33eUA Date: Mon, 9 Apr 2018 04:47:41 +0000 Message-ID: <678220c26fa1677ab162006620b345ea4f38c86b.camel@wdc.com> References: <20180408042112.GB19128@ming.t460p> In-Reply-To: <20180408042112.GB19128@ming.t460p> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=Bart.VanAssche@wdc.com; x-originating-ip: [76.103.131.8] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; MWHPR04MB0190; 7:QVzyDzotfgWHg2XfmQNa1rtui1lJtQ0NnWmsxGQjBnCx+BQOBHf/VAFP8n7eWbPxySdgYCMwWC9fPZ0qpMiOfEqXAkp4wsVEDETt/Kh0aFfFp8t10JdowpT8D2J0MynXiuRC65S0HKOYd0dmzJi5JLfvqvLOFBjHWlxfbColMKp8g4NGu/YinyfqHpJkr2LE/FFqgP3aCQ2CjjuXy7K9FBDMl7bGKg0L+OLCj/HFbcGU4lLT0iHFb3BMUD520/ql; 20:1yK+4yCAoAOcUSGco2jY3Vheagar4A/CcU0Vntf76FOqADCb47iQuybU3Tpyq6I5mmBarZbFH6D/L7wUDDfmNDoB61iHna2anzCFYvMH6CxqOfmSrkrLZ1FHSerjCvhEov2nox3FyTJIrmyGSpYSxEXFrlIBoD5H7kaMOPSaSVA= x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-ht: Tenant X-MS-Office365-Filtering-Correlation-Id: 287316d6-42c5-492b-af19-08d59dd5070a x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(3008032)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:MWHPR04MB0190; x-ms-traffictypediagnostic: MWHPR04MB0190: wdcipoutbound: EOP-TRUE x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(17755550239193); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040522)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93001095)(3002001)(3231221)(944501327)(52105095)(6055026)(6041310)(20161123560045)(20161123564045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(6072148)(201708071742011); SRVR:MWHPR04MB0190; BCL:0; PCL:0; RULEID:; SRVR:MWHPR04MB0190; x-forefront-prvs: 0637FCE711 x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(39860400002)(366004)(396003)(39380400002)(346002)(376002)(377424004)(199004)(189003)(66066001)(8936002)(97736004)(26005)(478600001)(6512007)(3846002)(6116002)(6246003)(186003)(316002)(8676002)(68736007)(305945005)(81156014)(81166006)(118296001)(105586002)(53936002)(110136005)(86362001)(102836004)(229853002)(7736002)(106356001)(5250100002)(2501003)(6436002)(5660300001)(6486002)(25786009)(4326008)(36756003)(3660700001)(14454004)(72206003)(54906003)(476003)(2616005)(11346002)(2906002)(486006)(2900100001)(59450400001)(99286004)(3280700002)(446003)(76176011)(6506007); DIR:OUT; SFP:1102; SCL:1; SRVR:MWHPR04MB0190; H:MWHPR04MB1198.namprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; x-microsoft-antispam-message-info: CouzIdj5bBu9+kKJ8gHD2dxTbUjaGnATHjCmiWxqLP7sdsiwx8VTjGeCuGw7aUdp5eCuksk9Lnc9YSlYChtrGNsT+khnl+DAl5Gbq2C5hN5fvaT2UsiQ2Ld2K5nO0/mHHgYzD5casJKNsyAoSAq92pdMcnw9v/ZikRXwaTTTfkS9BrffemnXCQ+vKEmXS49dgUvKyNmm+ynx/pG/1VA99178Vmip9Dm8KiyaIh+79/iDgNSymrwNB/e3UDJ8OVxqd1BcKh4hNgnHEd5AYDx8Iyqmo3rOH+tSb5mBRin7B0j+VK6f24hePxpPntTV4E9JykWmjik+toAH0dERSdIOPKS9cxmwskeZDzFmEb1gfEY723vK3JQMA0GT61DL1uqr9IRyyuSkp2NUVo9VLbSUV8/Sp5e8EDQPi+tXrmaukAI= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-ID: MIME-Version: 1.0 X-OriginatorOrg: wdc.com X-MS-Exchange-CrossTenant-Network-Message-Id: 287316d6-42c5-492b-af19-08d59dd5070a X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Apr 2018 04:47:41.2653 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: b61c8803-16f3-4c35-9b17-6f65f441df86 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR04MB0190 Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On Sun, 2018-04-08 at 12:21 +0800, Ming Lei wrote: > The following kernel oops is triggered by 'removing scsi device' during > heavy IO. Is the below patch sufficient to fix this? Thanks, Bart. Subject: blk-mq: Avoid that submitting a bio concurrently with device removal triggers a crash Because blkcg_exit_queue() is now called from inside blk_cleanup_queue() it is no longer safe to access cgroup information during or after the blk_cleanup_queue() call. Hence check earlier in generic_make_request() whether the queue has been marked as "dying". --- block/blk-core.c | 72 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 35 deletions(-) -- 2.16.2 diff --git a/block/blk-core.c b/block/blk-core.c index aa8c99fae527..3ac9dd25e04e 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -2385,10 +2385,21 @@ blk_qc_t generic_make_request(struct bio *bio) * yet. */ struct bio_list bio_list_on_stack[2]; + blk_mq_req_flags_t flags = bio->bi_opf & REQ_NOWAIT ? + BLK_MQ_REQ_NOWAIT : 0; + struct request_queue *q = bio->bi_disk->queue; blk_qc_t ret = BLK_QC_T_NONE; if (!generic_make_request_checks(bio)) - goto out; + return ret; + + if (blk_queue_enter(q, flags) < 0) { + if (unlikely(!blk_queue_dying(q) && (bio->bi_opf & REQ_NOWAIT))) + bio_wouldblock_error(bio); + else + bio_io_error(bio); + return ret; + } /* * We only want one ->make_request_fn to be active at a time, else @@ -2423,46 +2434,37 @@ blk_qc_t generic_make_request(struct bio *bio) bio_list_init(&bio_list_on_stack[0]); current->bio_list = bio_list_on_stack; do { - struct request_queue *q = bio->bi_disk->queue; - blk_mq_req_flags_t flags = bio->bi_opf & REQ_NOWAIT ? - BLK_MQ_REQ_NOWAIT : 0; - - if (likely(blk_queue_enter(q, flags) == 0)) { - struct bio_list lower, same; - - /* Create a fresh bio_list for all subordinate requests */ - bio_list_on_stack[1] = bio_list_on_stack[0]; - bio_list_init(&bio_list_on_stack[0]); - ret = q->make_request_fn(q, bio); - - blk_queue_exit(q); - - /* sort new bios into those for a lower level - * and those for the same level - */ - bio_list_init(&lower); - bio_list_init(&same); - while ((bio = bio_list_pop(&bio_list_on_stack[0])) != NULL) - if (q == bio->bi_disk->queue) - bio_list_add(&same, bio); - else - bio_list_add(&lower, bio); - /* now assemble so we handle the lowest level first */ - bio_list_merge(&bio_list_on_stack[0], &lower); - bio_list_merge(&bio_list_on_stack[0], &same); - bio_list_merge(&bio_list_on_stack[0], &bio_list_on_stack[1]); - } else { - if (unlikely(!blk_queue_dying(q) && - (bio->bi_opf & REQ_NOWAIT))) - bio_wouldblock_error(bio); + struct bio_list lower, same; + + WARN_ON_ONCE(!(flags & BLK_MQ_REQ_NOWAIT) && + (bio->bi_opf & REQ_NOWAIT)); + WARN_ON_ONCE(q != bio->bi_disk->queue); + q = bio->bi_disk->queue; + /* Create a fresh bio_list for all subordinate requests */ + bio_list_on_stack[1] = bio_list_on_stack[0]; + bio_list_init(&bio_list_on_stack[0]); + ret = q->make_request_fn(q, bio); + + /* sort new bios into those for a lower level + * and those for the same level + */ + bio_list_init(&lower); + bio_list_init(&same); + while ((bio = bio_list_pop(&bio_list_on_stack[0])) != NULL) + if (q == bio->bi_disk->queue) + bio_list_add(&same, bio); else - bio_io_error(bio); - } + bio_list_add(&lower, bio); + /* now assemble so we handle the lowest level first */ + bio_list_merge(&bio_list_on_stack[0], &lower); + bio_list_merge(&bio_list_on_stack[0], &same); + bio_list_merge(&bio_list_on_stack[0], &bio_list_on_stack[1]); bio = bio_list_pop(&bio_list_on_stack[0]); } while (bio); current->bio_list = NULL; /* deactivate */ out: + blk_queue_exit(q); return ret; } EXPORT_SYMBOL(generic_make_request);