From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751059AbdALVp2 (ORCPT ); Thu, 12 Jan 2017 16:45:28 -0500 Received: from mail-dm3nam03on0089.outbound.protection.outlook.com ([104.47.41.89]:17769 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750730AbdALVpZ (ORCPT ); Thu, 12 Jan 2017 16:45:25 -0500 Authentication-Results: spf=pass (sender IP is 74.221.232.54) smtp.mailfrom=sandisk.com; osandov.com; dkim=none (message not signed) header.d=none;osandov.com; dmarc=bestguesspass action=none header.from=sandisk.com; X-AuditID: ac1c2133-0c3ff70000013ebf-de-587873b86ba5 From: Bart Van Assche To: "linux-kernel@vger.kernel.org" , "linux-block@vger.kernel.org" , "axboe@fb.com" CC: "osandov@osandov.com" Subject: Re: [PATCH 08/10] blk-mq-sched: add framework for MQ capable IO schedulers Thread-Topic: [PATCH 08/10] blk-mq-sched: add framework for MQ capable IO schedulers Thread-Index: AQHSbR0psJkzG41kTki82+enkYl2+Q== Date: Thu, 12 Jan 2017 21:45:16 +0000 Message-ID: <1484257502.2720.21.camel@sandisk.com> References: <1484170803-9311-1-git-send-email-axboe@fb.com> <1484170803-9311-9-git-send-email-axboe@fb.com> In-Reply-To: <1484170803-9311-9-git-send-email-axboe@fb.com> Accept-Language: nl-NL, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [172.28.1.254] Content-Type: text/plain; charset="iso-8859-1" Content-ID: MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrAIsWRmVeSWpSXmKPExsWyRobxn+6u4ooIg6f/tCz+7znGZrH3lrbF 5V1z2Cz2HDnD6MDiMbH5HbvHnD8HmT0+b5ILYI7isklJzcksSy3St0vgytjVG1BwXaNi66q/ jA2MB+S7GDk5JARMJG79nMnUxcjFISSwhEli8+73jBDOJUaJxn3fmUGq2ASMJGZP2MMCkhAR WMgoMe/pJNYuRg4OZgF9iSuf9EBqhAVCJaY27mYCsUUEwiQmNi1ihbD1JK6euMgOYrMIqEp8 XzmDBcTmBZq5ZdEZNpAxQgJ5Ene3aIKEOQVsJF4/+MYOEmYUkJVoec0NEmYWEJe49WQ+E8TN AhJL9pxnhrBFJV4+/scKYStIfF7xjw2iXk/ixtQpULaVxJVFjVC2tsSyha+ZIS4QlDg58wnL BEaxWUhWzELSPgtJ+ywk7bOQtC9gZF3FKFacmFycm55aYGiiV5yYl5JZnK2XnJ+7iREcb4rG Oxj/bXA/xCjAwajEw3sivCJCiDWxrLgy9xCjBAezkghv7tfyCCHelMTKqtSi/Pii0pzU4kOM 0hwsSuK88gd2hwoJpCeWpGanphakFsFkmTg4pRoYm/f+jEq3ufdd5lju6Qvmup2aDXemC6le sb5vNm/O9ZMue09/majtoie//8DyPRINjC+XbTmn29TxifXNqb8t31jXmL6/sb/H2SZR4ojL +ZB/TP851+6o02Y6Yxsm3bbj1rL2zyxlvd9Do1z22lSYGG9OfnSa+7FBdeThlldvDIotF4l0 71L1UWIpzkg01GIuKk4EALdoAdqzAgAA X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:74.221.232.54;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(39850400002)(39410400002)(39860400002)(39450400003)(39840400002)(2980300002)(438002)(24454002)(189002)(377424004)(199003)(626004)(305945005)(106466001)(36756003)(7736002)(103116003)(69596002)(3846002)(6116002)(50986999)(2501003)(81156014)(4326007)(54356999)(76176999)(8676002)(81166006)(8936002)(8746002)(23756003)(50466002)(102836003)(68736007)(33646002)(230783001)(2900100001)(2270400002)(47776003)(356003)(92566002)(38730400001)(97736004)(2906002)(2201001)(106116001)(229853002)(5001770100001)(86362001)(2950100002)(189998001)(5660300001)(7099028);DIR:OUT;SFP:1101;SCL:1;SRVR:DM2PR02MB1417;H:sacsmgep14.sandisk.com;FPR:;SPF:Pass;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD007;1:KXrofEzuxBQkChOCG/8aswroXuKSJigcfb8dEZ3EFlTb3IZ2cLw8K/80wM8eS4SlJq3mCZXJgkdxhkaOmsLl9II5z4c+gGPfvN9aMcwI79RB9Uu/QtwWhgSkuM0zevhz1+GgKzG9HTm620zUFKnkR1zBJ59STElv+kPWOPDmpxUKzbGxGr9KwTZE/P6Oqb25CEL2ooD2kUn7YU9NKaOJL1M8W+hZOYigsYqnLcOGfAckf+r/a5uPj47OTK8GVFQBvG3MLN58KcvF3HLUBjD80O2O+WL02UPYbP4cl30lH2mG0Bxd+iuUW7NivvUZIKToTuFh4jKRy1FoLY6rRfam2Mv1W9PTkOwlFRdiqN4IL1ZdZhmb2n+l0Ltxv+kRMownZkBg4ga3bHR/XdoKcJEv0TM2IHhWY6phrqyuDUVOIw4d7Bj2krar1e5Zz+GhQxfdDOm5XsxlyLZP+93lnUjwlHjqo4ifblr5+ILWi6L6sJW/f9mzehLDMCcyTK8o8/emIyEmK09DiQMqywwoiurVIWRix2dnun/EYavCQm2dbVN1ECphbcMdtpT9+dUaMY1m X-MS-Office365-Filtering-Correlation-Id: 63c72780-b98f-410f-8841-08d43b344f38 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(8251501002);SRVR:DM2PR02MB1417; X-Microsoft-Exchange-Diagnostics: 1;DM2PR02MB1417;3:DAIJ8Yyg5mtTb+2bVy761N8eJ5LnDJSLKdp5xbeevFx0HmtxbFHKh7TYccIlnmnYshKrDsw/6ZzcpHEk47NYljQvAvqCNiGB1mzAHrPm7PUs+OTyhR80rDNN31ZEoQ19abJxuvnR3kOWiUyl0snl5m9SoVw6rzDYJHGiBy0dMF43R9aBegYbKmDe4hDrT1PCukY+hpqPpBKLrzIO8Nvc118aICz6J/JC0F95E7npGfJAGKzciIyYU7WYfmxqQAcfN/v/CXajeDvatnc2mGu7x76fCpZRted7wLvlgM7IgrWN3hfpMB7wj9gFy+S+s2u1NlBr5uVV5voHJhjOQMNgkf7YHDV8cI1djc1SsCg9tu5M59zdffB3RIyLlGh1bfXXZnZzS4yXXTCTtlsCQSKnow==;25:Ut6k6RbOvyGpkG+SERKJJO85aVfMCof2Wws9VgCQPl2nLXgl4VdjbbtDTNxlTwgJJmDUwZxw4BYfbicBIdu1rzrUYX55gFVIr3kmF5Uuj6QIU9WBO1iENaxZBXtLJP18ofUbz5Xys4xudF/y1VKKIvFcEUH2gmp1ozJCnCwkXBjAWN0ASL37fBvRkIX/4vMX3pTRxta9jUNWFEtN362wlnqev+hSdw+53vwya+lOqI8jBVe8zVMHucpCW5vrJhkpWXBHpwJrDZN1WodFAm+cgEmQIBp9uPaaD4hDe0DNfeuoOoXf10JbhqtqWlXLsBNKrqAFSGv0+nF5oFHieDyGZmPAW7Vi2o406htMafRgQEJP5WK9t9iRSOb3FW1ySLPVU1ZFDW0L2ce9iyO4daMk8JSFcIwToc+eIx/LXCi8zAhdvJ12/giiqsdrSiXZAFyVDY2sRCQ4NjtiBB6KtaZXXA== X-Microsoft-Exchange-Diagnostics: 1;DM2PR02MB1417;31:RvwFeqYOoJYtVHK0uSGGdfpF1+SsHTP+7koKL0vsD/4Kqk1kL13ZtAzfUzQLeDyZqSPAFdfOSurapP24Fb4HPZqbEkvXnp0ZC1wXs7fJidUx3e8mv8Sy+8GmhkdELlv5RovfcaW1tD3RTWYOFXIorczZM5PDF/vx0x6G8N/0KzbZmcy8kc10Ynx4vVaMZioF6+2WBHAVloLBCRd/Cr+Q6imPm8Skuqzr2Y0EUsKzhw26KrSIs5a4yvxwEKnvd8JesJkXrir29St9ool5l2zUlQ==;20:QjiQs4pO9/ubs1oD+ShfkwSBZ0+dKx7o0SbCtGIobvOpcvtKACiPl5cDGFl0Tk8KMMTbkc/0VfW1cXeQCLlj1+/Mm+Q7uWrs1VBUYlVFBLY1jH0LQGxP+aM4fUm+c2B528fIjGYodwqdVL+AC+IUwCz58iSEGBEb0RV+gOpApTTlTU2wI9eZRaNzNUgSYI+61QSL3opdARulC6/qHctlgLCl/N2X0hoYhOFK3M/Ma8QWHCZdSynYypPNaA6z3DzV8AgL3IRhUrpp6l64eSZbsyeNw4B+5WZYu/bd+kaBByQQWCb1XV+4Xfsd6MDfNrjd0H3AW0KQtahXVxuE5nKsT9g3D4wjnWxIPlnj1X290uFhjoZ9iPOgod02REfVr8HF2rjckNVmzVHpwr9pZfCfqx2QtwqLJOkzfq88xB00w4hDZNxnulG0ZVsr6aPKMWghaQjNLeby9jOe6Hx2am4/bVwcoYE5Lu2gsCz34VHZGCntbfKHF5QMNEI8X67zQMj6 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(13023025)(13017025)(13015025)(13018025)(13024025)(10201501046)(3002001)(6055026)(6041248)(20161123555025)(20161123560025)(20161123564025)(20161123562025)(6072148);SRVR:DM2PR02MB1417;BCL:0;PCL:0;RULEID:;SRVR:DM2PR02MB1417; X-Microsoft-Exchange-Diagnostics: 1;DM2PR02MB1417;4:U5UwHcJDSf5Ynxsl/gsvtYCeHR41zYO8oLiz8LbfVn8poJclP8vHnS4U8K140PVxSg4mJODsFJbkZtMlevdltM+pKZyl0K9Ib/mlaKLFqAZ47rgA4JU2Br00LhqusciDowRXAj9ypLzZlAaRmL5nXRKpWxzsHSP/JgKp+qoYucmdipBvb9zJPrtZfQHfUyX5RRPy2izMawr2UHXq/a/Rz7X4rEv3+sWPHCBp+EcqAf6jJlr9Zh1pujobUiLaW/ytFOab8BV9T9nU82l02i6Q3QA/vwuFg3ujnGJO5RqCYz/OvUaLtQAM0wVxP74aCqQqvwC3dWDzI4DPEIFJYbbeSdov9Pfe/wAGh+gfKzXwSQYM7LiyQJ6mBKlHk0E1ngqJqhHxfYdjUB7Hrm5xr2avHzX9iWYPJJLDIZZTW5MrKEGm1knZdh4ZzpubOqiqvC1CNtA6NdAUhgfAGjDw+BZvq52C8kFDCDPMTph0ygyqDHLNFoGfbgaymFHe8lNFxRpdHzhU+T+lyRwI7ZutmZCi5FgVpe+eiHNuRmOi3xTCmmOKdzkCAKIY1YK5RM86XYjRlxvpb22Zm0c+7Pso4mDng0FubsWF/2mNG8tiWlbJrOiRyHruEcqH/q8RbVPXoyVAScQJn9qEIIhIR+j+rx/wn/D0wBRJuWAukaUCVavBQIfuO7544mgqJin9+x4cawo7 X-Forefront-PRVS: 018577E36E X-Microsoft-Exchange-Diagnostics: =?iso-8859-1?Q?1;DM2PR02MB1417;23:LP0Fkuu3Her0h/ik0iFNt2Ww7ZzXkBy6kjkCZXO?= =?iso-8859-1?Q?Car/70Qoh/DMcBXa1NNhWeX3qV/H0c8Waytx89rtNrVXCQMWKXFV9lrF3h?= =?iso-8859-1?Q?r04q+eiuVsxAMx4fgNt70CPxoi7El87QeaFF857z7ZyxtXcVQTooUzzzoD?= =?iso-8859-1?Q?gwRb0fCNE1JVlKGjwRKPHoDLzv5DUv6HifLFi6KD4b80NH5ova6pC+6Ogv?= =?iso-8859-1?Q?EoFXGfv48++Jx2N2juhQuPsyrF24mZvVXp24HEbllsJ/1nBKIddmkU0AfT?= =?iso-8859-1?Q?au0tGHPE/G0TcLrU1kJvC8aNSr+V2oW7Ij/L5CWBCJ/vtMThGvN8afAYMr?= =?iso-8859-1?Q?1bjz40D6ue6rvLjNrzxaK4AFikACF1xVQMl7LPkNu0nLKxOJZku5kTvkXu?= =?iso-8859-1?Q?Ykl8yS00eAjc/6cmFFOOckqIQqxH51NDcTBWbwkWq+wrmiNMdJ4uP8BQWO?= =?iso-8859-1?Q?kRwR2p+PK3PvYOuG3/7CqBiiIkO6aOxIgD9AweXv75aCLMjUgR8XbDRQNL?= =?iso-8859-1?Q?OawHpV/sN3RuU2P9r3inGSXlbSSV6/9Ao0pXGKpBbYuqG7JHwya9NihlMd?= =?iso-8859-1?Q?t1xuMEvLHBxhs5wTLY1BzG4PjlS/y6aTWOtLc6TMZ3n9QeYBjdC8MPcdjj?= =?iso-8859-1?Q?qczpFDWDFYuA/Cr1FOG8WoHigduMWSKOAs3JlrnjeWBIs2kFHXewxI0a5F?= =?iso-8859-1?Q?ntuKnjCkKWdemrLo9ccC/3GrFRCjchmHDs7XHsPrZMm06g8/kBq/Dnl0vF?= =?iso-8859-1?Q?u4cdTame77Yb0hQyv1SLdH1O33D6n2Rv6vl+MsvxxrW4B8fDWADHidIq5C?= =?iso-8859-1?Q?infSzsdbGnQCk02puR6qL64Vw5XCRafjtKwW+mPFgi83jQ3cTliUoUaRGp?= =?iso-8859-1?Q?hNOT108dQRvmh1Ux4sQ9GIn2VKoLkLEKneR7CY987sJ6v/tOFmDwyidU2g?= =?iso-8859-1?Q?pBdl6UKpqm5e7hqgBboUNFsMB5tgpQfrraDJKEMrNlbj7F0O//u2uVdcFh?= =?iso-8859-1?Q?Z/X6ffFpqyi+aXh4RDgL/M5K92lP7DXpFlYiGeHv45MlXVmecLtXM+1Da+?= =?iso-8859-1?Q?dwiACBjKC5gExUFbIZQeY35ycya2OAAJqBTe8mPyqUYEvPB0VGiIi5NjFr?= =?iso-8859-1?Q?I0HDNmk2YLxjN2i9NUR2E68oG7wMbVQpa76C1wkIrwb4fippE6yy2Zvurv?= =?iso-8859-1?Q?nSL/B0bQ7JBMJ2o1HbJzsp7w0VKSQvpUvXq5836HAsfl1lhYyv45KAZxLK?= =?iso-8859-1?Q?XtehSfis0I9mMBqYy+iej6VS+/Fuxis/4aJS4mNmCTg8dii29C/DzrFzL0?= =?iso-8859-1?Q?eydsuTw/PrYM6sCbSR4xT+8jIQ9WW2yj8WZnYrA7jFZXCBOgoqELwLcodo?= =?iso-8859-1?Q?LJR6LyUR0LptXucqAw/LyFtafX3eK?= X-Microsoft-Exchange-Diagnostics: 1;DM2PR02MB1417;6:CTve6r3ShMq1gF6hzR+tty21T3WDjHSABAa4o3n+UKlOm4mZhNPW2Q2qNC13kizljE8xr6ouvvB7hATuzS1gSVR9r8AXQdTcIfw70BPeTrxqF/HjiHCgHrvJoU4IWFx3oErAKmNPa+brpJAAcyapcaG07g9ESd9OApXRE7udHSyZe/sj4w9EMOCBSiwq9BcGxKxIkGbMDTgHnCt644rsbi9yzCUtaP/FsX3sgCsNN6TtPFsvUlVy/kV/hQ1zhgFvKoTaMUKU6qfhGbcZmarWgbAphWyHNPh5XKvsZtFOMbx1BnR/z85dXgZ+Qh8S6YNO2quGemKOfOSFgcXftAfhxArHFAdv/+hO5Hn9rdyCDYk8BdWGePkSPtgnXo2Tw25EGdBc69jag6XeECnCN6WIQYFPjQDp/9IXsdc4Q22zr1PlUA0f2eAYV1GpFUk+WFaFnARTad16U8gBllQqimL3LQ==;5:EXzTu1pvqjz741gGfJYlcQ2GeUFJZhHvObcfYI43uEBUMefBEw3beqXRanso/BwKfhydS+eqdKMvc5Srg9uVaTXfsaXgAuEKUL3HYLcQz02oGxxf5qkBn1lwzvpI9+1Nb1UiCfcx/BZPDXJUFT1sHeBYzPBdREJCf4gtvIsAdkI=;24:arGz4I4LLCdWeBCsyvuDZCzw6pATrlm2ZlIajgKemPt6on3K5FlntsAZjXYKVaeeWWASJjGMwVXuk3E3dOfZdQ+mAuyPAnk9fJFVlE1sS10= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DM2PR02MB1417;7:1ampRiuK5lVs0Dz1ExJOhy/P/qc9UJX2mXIFQ2g+yHtzrRhG2i643cS/Qi611haT1zpVDxlTxXU3+0tMfO+PE7+lZSn3wWLgqnVJ3/qCrNzgeiEO5s/IKgFS+4bFzcocvxqHoSTbrmSU7hJ9hCosUvby8HUhO+b7/YPDZBiSt9VFzH5NPqCIdnfOymMiDT4FIgqTmW5se94Z9FQUBqjwPRzIxfoXxpRB/o53HTJEUlBeum11jgd1SOS8w/8kUYYPJRsJz6dQCePgja9OnvuNsajjgSkch2XHZhdtimCJ3lWCaigHsdpqh74GJ/yK9yNAUMR9+ottOlcnFSFPdYxsIJKkPVQPkZcwbWQuohQ85MwzM96PIr74iJSqGVK+lT+uoVn91oAfcagbKHgGw3d5PY4k4I60Ma9dNAh9IT1V9S6oODYsMgxm55CozkfDxHbTKeGdQ/zNx29au4vx/8gZQg== X-OriginatorOrg: sandisk.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Jan 2017 21:45:21.4533 (UTC) X-MS-Exchange-CrossTenant-Id: fcd9ea9c-ae8c-460c-ab3c-3db42d7ac64d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=fcd9ea9c-ae8c-460c-ab3c-3db42d7ac64d;Ip=[74.221.232.54];Helo=[sacsmgep14.sandisk.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR02MB1417 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by mail.home.local id v0CLjXKJ002187 On Wed, 2017-01-11 at 14:40 -0700, Jens Axboe wrote: > @@ -451,11 +456,11 @@ void blk_insert_flush(struct request *rq) > * processed directly without going through flush machinery. Queue > * for normal execution. > */ > - if ((policy & REQ_FSEQ_DATA) && > - !(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) { > - if (q->mq_ops) { > - blk_mq_insert_request(rq, false, true, false); > - } else > + if (((policy & REQ_FSEQ_DATA) && > + !(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH)))) { > + if (q->mq_ops) > + blk_mq_sched_insert_request(rq, false, true, false); > + else > list_add_tail(&rq->queuelist, &q->queue_head); > return; > } Not that it really matters, but this change adds a pair of parentheses -- "if (e)" is changed into "if ((e))". Is this necessary? > +void blk_mq_sched_free_hctx_data(struct request_queue *q, > + void (*exit)(struct blk_mq_hw_ctx *)) > +{ > + struct blk_mq_hw_ctx *hctx; > + int i; > + > + queue_for_each_hw_ctx(q, hctx, i) { > + if (exit) > + exit(hctx); > + kfree(hctx->sched_data); > + hctx->sched_data = NULL; > + } > +} > +EXPORT_SYMBOL_GPL(blk_mq_sched_free_hctx_data); > + > +int blk_mq_sched_init_hctx_data(struct request_queue *q, size_t size, > + int (*init)(struct blk_mq_hw_ctx *), > + void (*exit)(struct blk_mq_hw_ctx *)) > +{ > + struct blk_mq_hw_ctx *hctx; > + int ret; > + int i; > + > + queue_for_each_hw_ctx(q, hctx, i) { > + hctx->sched_data = kmalloc_node(size, GFP_KERNEL, hctx->numa_node); > + if (!hctx->sched_data) { > + ret = -ENOMEM; > + goto error; > + } > + > + if (init) { > + ret = init(hctx); > + if (ret) { > + /* > + * We don't want to give exit() a partially > + * initialized sched_data. init() must clean up > + * if it fails. > + */ > + kfree(hctx->sched_data); > + hctx->sched_data = NULL; > + goto error; > + } > + } > + } > + > + return 0; > +error: > + blk_mq_sched_free_hctx_data(q, exit); > + return ret; > +} If one of the init() calls by blk_mq_sched_init_hctx_data() fails then blk_mq_sched_free_hctx_data() will call exit() even for hctx's for which init() has not been called. How about changing "if (exit)" into "if (exit && hctx->sched_data)" such that exit() is only called for hctx's for which init() has been called? > +struct request *blk_mq_sched_get_request(struct request_queue *q, > + struct bio *bio, > + unsigned int op, > + struct blk_mq_alloc_data *data) > +{ > + struct elevator_queue *e = q->elevator; > + struct blk_mq_hw_ctx *hctx; > + struct blk_mq_ctx *ctx; > + struct request *rq; > + > + blk_queue_enter_live(q); > + ctx = blk_mq_get_ctx(q); > + hctx = blk_mq_map_queue(q, ctx->cpu); > + > + blk_mq_set_alloc_data(data, q, 0, ctx, hctx); > + > + if (e) { > + data->flags |= BLK_MQ_REQ_INTERNAL; > + if (e->type->ops.mq.get_request) > + rq = e->type->ops.mq.get_request(q, op, data); > + else > + rq = __blk_mq_alloc_request(data, op); > + } else { > + rq = __blk_mq_alloc_request(data, op); > + if (rq) { > + rq->tag = rq->internal_tag; > + rq->internal_tag = -1; > + } > + } > + > + if (rq) { > + rq->elv.icq = NULL; > + if (e && e->type->icq_cache) > + blk_mq_sched_assign_ioc(q, rq, bio); > + data->hctx->queued++; > + return rq; > + } > + > + blk_queue_exit(q); > + return NULL; > +} The "rq->tag = rq->internal_tag; rq->internal_tag = -1;" occurs not only here but also in blk_mq_alloc_request_hctx(). Has it been considered to move that code into __blk_mq_alloc_request()? @@ -223,14 +225,17 @@ struct request *__blk_mq_alloc_request(struct blk_mq_alloc_data *data, > > tag = blk_mq_get_tag(data); > if (tag != BLK_MQ_TAG_FAIL) { > - rq = data->hctx->tags->rqs[tag]; > + struct blk_mq_tags *tags = blk_mq_tags_from_data(data); > + > + rq = tags->rqs[tag]; > > if (blk_mq_tag_busy(data->hctx)) { > rq->rq_flags = RQF_MQ_INFLIGHT; > atomic_inc(&data->hctx->nr_active); > } > > - rq->tag = tag; > + rq->tag = -1; > + rq->internal_tag = tag; > blk_mq_rq_ctx_init(data->q, data->ctx, rq, op); > return rq; > } How about using the following code for tag assignment instead of "rq->tag = -1; rq->internal_tag = tag"? if (data->flags & BLK_MQ_REQ_INTERNAL) { rq->tag = -1; rq->internal_tag = tag; } else { rq->tag = tag; rq->internal_tag = -1; } > @@ -313,6 +313,9 @@ struct request *blk_mq_alloc_request_hctx(struct request_queue *q, int rw, > goto out_queue_exit; > } > > + rq->tag = rq->internal_tag; > + rq->internal_tag = -1; > + > return rq; > > out_queue_exit: > @@ -321,10 +324,10 @@ struct request *blk_mq_alloc_request_hctx(struct request_queue *q, int rw, > } > EXPORT_SYMBOL_GPL(blk_mq_alloc_request_hctx); Should something like "WARN_ON_ONCE(flags & BLK_MQ_REQ_INTERNAL)" be added at the start of this function to avoid that BLK_MQ_REQ_INTERNAL is passed in from outside the block layer? Bart.