Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3152933imu; Sun, 9 Dec 2018 18:46:07 -0800 (PST) X-Google-Smtp-Source: AFSGD/WuyNqp9pcUAhH5RXop+1pYtktxJXwaowEBEpuXQqGJxZ+ZfP00xwQPOoKaipOf6jidrtiw X-Received: by 2002:a65:5c4b:: with SMTP id v11mr9361334pgr.333.1544409967174; Sun, 09 Dec 2018 18:46:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544409967; cv=none; d=google.com; s=arc-20160816; b=BKP0tizVXf+j3xwW2UZ6R8wibPtgQYIQAITXLPnv0BkEXkBDjJzAz1MXM+jctesWiO Z5F2swkviTVmDgMPAcdYjd3n9nYazZ9OQINRaOyE5XO+yxV5cwH8UBe9BA359UqXMgPX 3q/nsV4rJAEH20thdTDO7sGWJRPU2M8s08ZQgbluxLtwfdRovuvNmi3whrYdZwd4mNr0 KQ2r00sP1xOnRxDT5Bp86XU64LhbJB61WBKVTKgUdNbaS+G/48j2y5NdXIV6zdoynAvh KMpTsW1lOx35YlcFszc8U7uGZqvSTjrI3RXEn51K+keTswcxHeluIyUbzRhUc0d08CYk D9xQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=1I4WU5pAJIPO2B5WsvKbH7U8W/PZ6adMl6UTg+hWGIE=; b=aDJJ7K9rp4FwNh14uP7X6szIsf7NjHs4sgMY/aJ46yNy7/pxSCP9Whj6YR9KM50kbl dO3aN9P8isds/i+SdWUpCZDM3TsyL2HhcYIh8/Bk+p7gp+aDT8z/fXC37u0anJ2sSal3 nEEMjClP0pd76XVT+oAapA9483c3gnq7+/Fv+FjajL2Nv2sa7eeK5jBkDOIntNwkiIp2 eIqrqkQtd6gssXac7KRPxcd9toI7C2zg4Lj0+BUy+9VCeXwFrNchg9HXMT5XwzrN2rGO j41LxWmmwWzWFQw3amPovT7YUuNUoadIP3mkU1ebFVtErwmd/Yd9r2lC4XttkmXbzCDQ 1ZwA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2018-07-02 header.b=ObHHtwSA; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b5si9049734ple.387.2018.12.09.18.45.52; Sun, 09 Dec 2018 18:46:07 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2018-07-02 header.b=ObHHtwSA; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726564AbeLJCo4 (ORCPT + 99 others); Sun, 9 Dec 2018 21:44:56 -0500 Received: from aserp2130.oracle.com ([141.146.126.79]:41832 "EHLO aserp2130.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726530AbeLJCox (ORCPT ); Sun, 9 Dec 2018 21:44:53 -0500 Received: from pps.filterd (aserp2130.oracle.com [127.0.0.1]) by aserp2130.oracle.com (8.16.0.22/8.16.0.22) with SMTP id wBA2iX7B117171; Mon, 10 Dec 2018 02:44:49 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2018-07-02; bh=1I4WU5pAJIPO2B5WsvKbH7U8W/PZ6adMl6UTg+hWGIE=; b=ObHHtwSAJqY62nThH3dX/e6HtvD1zybQzZWEBzydy1vX2z7PZ0YwhSQrKz9AcYgFLtb8 0aNa0FhibEYZw6bGpkjECicw/ns6xqV3fru4Z2YGsqrBLc0cyUv1SY0RpwoUUqKRXCO8 SVKtSFe6K2gmLpHVWZUqTv/h902m08F7XEaCp2TwlK1R79+/NvVssjSSmek/qrmnblVD L5+66YwzdY8OxsaF2i/BZBPyTd0T07uDNxJ57nnHxmQAZpaRp1N2uemAvm1lRbjZ56So GXfj9sVStMCt8zhRYF9+iWEbdIn59LYbCnaPJgXmV3EJCNk13O7dl9qhf49BjVp/dgNV yQ== Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp2130.oracle.com with ESMTP id 2p83fdukg4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 10 Dec 2018 02:44:49 +0000 Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.14.4/8.14.4) with ESMTP id wBA2im4E021939 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 10 Dec 2018 02:44:48 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id wBA2imml007566; Mon, 10 Dec 2018 02:44:48 GMT Received: from will-ThinkCentre-M93p.cn.oracle.com (/10.182.70.234) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 09 Dec 2018 18:44:47 -0800 From: Jianchao Wang To: axboe@kernel.dk Cc: ming.lei@redhat.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH V12 1/3] blk-mq: refactor the code of issue request directly Date: Mon, 10 Dec 2018 10:44:07 +0800 Message-Id: <1544409849-20119-2-git-send-email-jianchao.w.wang@oracle.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1544409849-20119-1-git-send-email-jianchao.w.wang@oracle.com> References: <1544409849-20119-1-git-send-email-jianchao.w.wang@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=9102 signatures=668679 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=1 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1812100024 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Merge blk_mq_try_issue_directly and __blk_mq_try_issue_directly into one interface to unify the interfaces to issue requests directly. The merged interface takes over the requests totally, it could insert, end or do nothing based on the return value of .queue_rq and 'bypass' parameter. Then caller needn't any other handling any more and then code could be cleaned up. Signed-off-by: Jianchao Wang --- block/blk-mq.c | 104 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 55 insertions(+), 49 deletions(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index b645275..261ff6d 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1794,78 +1794,84 @@ static blk_status_t __blk_mq_issue_directly(struct blk_mq_hw_ctx *hctx, return ret; } -static blk_status_t __blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx, +static blk_status_t blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx, struct request *rq, blk_qc_t *cookie, - bool bypass_insert, bool last) + bool bypass, bool last) { struct request_queue *q = rq->q; bool run_queue = true; + blk_status_t ret = BLK_STS_RESOURCE; + int srcu_idx; + bool force = false; + hctx_lock(hctx, &srcu_idx); /* - * RCU or SRCU read lock is needed before checking quiesced flag. + * hctx_lock is needed before checking quiesced flag. * - * When queue is stopped or quiesced, ignore 'bypass_insert' from - * blk_mq_request_issue_directly(), and return BLK_STS_OK to caller, - * and avoid driver to try to dispatch again. + * When queue is stopped or quiesced, ignore 'bypass', insert + * and return BLK_STS_OK to caller, and avoid driver to try to + * dispatch again. */ - if (blk_mq_hctx_stopped(hctx) || blk_queue_quiesced(q)) { + if (unlikely(blk_mq_hctx_stopped(hctx) || blk_queue_quiesced(q))) { run_queue = false; - bypass_insert = false; - goto insert; + bypass = false; + goto out_unlock; } - if (q->elevator && !bypass_insert) - goto insert; + if (unlikely(q->elevator && !bypass)) + goto out_unlock; if (!blk_mq_get_dispatch_budget(hctx)) - goto insert; + goto out_unlock; if (!blk_mq_get_driver_tag(rq)) { blk_mq_put_dispatch_budget(hctx); - goto insert; + goto out_unlock; } - return __blk_mq_issue_directly(hctx, rq, cookie, last); -insert: - if (bypass_insert) - return BLK_STS_RESOURCE; - - blk_mq_request_bypass_insert(rq, run_queue); - return BLK_STS_OK; -} - -static void blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx, - struct request *rq, blk_qc_t *cookie) -{ - blk_status_t ret; - int srcu_idx; - - might_sleep_if(hctx->flags & BLK_MQ_F_BLOCKING); - - hctx_lock(hctx, &srcu_idx); - - ret = __blk_mq_try_issue_directly(hctx, rq, cookie, false, true); - if (ret == BLK_STS_RESOURCE || ret == BLK_STS_DEV_RESOURCE) - blk_mq_request_bypass_insert(rq, true); - else if (ret != BLK_STS_OK) - blk_mq_end_request(rq, ret); - + /* + * Always add a request that has been through + *.queue_rq() to the hardware dispatch list. + */ + force = true; + ret = __blk_mq_issue_directly(hctx, rq, cookie, last); +out_unlock: hctx_unlock(hctx, srcu_idx); +out: + switch (ret) { + case BLK_STS_OK: + break; + case BLK_STS_DEV_RESOURCE: + case BLK_STS_RESOURCE: + if (force) { + blk_mq_request_bypass_insert(rq, run_queue); + /* + * We have to return BLK_STS_OK for the DM + * to avoid livelock. Otherwise, we return + * the real result to indicate whether the + * request is direct-issued successfully. + */ + ret = bypass ? BLK_STS_OK : ret; + } else if (!bypass) { + blk_mq_sched_insert_request(rq, false, + run_queue, false); + } + break; + default: + if (!bypass) + blk_mq_end_request(rq, ret); + break; + } + + return ret; } blk_status_t blk_mq_request_issue_directly(struct request *rq, bool last) { - blk_status_t ret; - int srcu_idx; - blk_qc_t unused_cookie; - struct blk_mq_hw_ctx *hctx = rq->mq_hctx; + blk_qc_t unused; - hctx_lock(hctx, &srcu_idx); - ret = __blk_mq_try_issue_directly(hctx, rq, &unused_cookie, true, last); - hctx_unlock(hctx, srcu_idx); - - return ret; + return blk_mq_try_issue_directly(rq->mq_hctx, rq, &unused, true, last); } void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx, @@ -2006,13 +2012,13 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) if (same_queue_rq) { data.hctx = same_queue_rq->mq_hctx; blk_mq_try_issue_directly(data.hctx, same_queue_rq, - &cookie); + &cookie, false, true); } } else if ((q->nr_hw_queues > 1 && is_sync) || (!q->elevator && !data.hctx->dispatch_busy)) { blk_mq_put_ctx(data.ctx); blk_mq_bio_to_request(rq, bio); - blk_mq_try_issue_directly(data.hctx, rq, &cookie); + blk_mq_try_issue_directly(data.hctx, rq, &cookie, false, true); } else { blk_mq_put_ctx(data.ctx); blk_mq_bio_to_request(rq, bio); -- 2.7.4