Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp6415204imu; Wed, 14 Nov 2018 00:47:24 -0800 (PST) X-Google-Smtp-Source: AJdET5fFU6gbJLUfajQHa6Q8bKgOjT0ucrO8uB9sBL2LH5XzL37H1B8LDZhzQn6ggzmlGMvCSfJ1 X-Received: by 2002:a62:6e47:: with SMTP id j68-v6mr1011182pfc.197.1542185244642; Wed, 14 Nov 2018 00:47:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542185244; cv=none; d=google.com; s=arc-20160816; b=IOLrf7itb/0G5niumfUr/2AF3LBb3lILzm4xiMqEFx4UNtRnL9mVMxfCb5rxb/Ti/p FUzXRSVeqzvm+cecXSVDxfoJNBZHWCkDgjwfw0jdDIJoY56+VgXLJk0aBbyZSPvT9pEr dLmU+S7aTghbcGlPV+p5mubmsRBZR+sNKxYUL/4mOHceGujNpuEhXLQeS6Xg5Ky5E2J0 pP53+64UX6CsYOwCE3ZnIIdM9d0GfNs5Gjrgfuwl5TzYYkTA5pee3LBifTQSSNssNeOq y/mjWUqdyOFWFAI2g2GEpF18F96CRnl750LKU1tm3GA2VReWEjGaoAdVMb1bbAyX3oxe qUUA== 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=KjtFBzl48kWHUaiGs45dIZaVO/sEyPqGFzaPjx5bZbs=; b=GLlhEG02unhNDrWzh5554xIvv/lKbBkj9EK62yiQL+YGmPcGKp18mKGEYoaotbwBKE HcDvaigsdVw+EQ9C0NvXNdqiB9ujLXOzdum3d2UTSrQN7dA/v/YTC3t7wzhdm/Onq1dT GdUW7+5tBAFnJHRKywNtkevw+HHHY6XUoVyWnmjCA3ISdRPx/LqylaP4qjaIYnyIsOT2 HH301DUZW5IypXG4BUAOXgEgSh6+7v0ixYChrnBsoBDTBOQ4TX70NEWLyAkuXbkK1wel AwSuxuj5/oTMwVZFEmj1LEzPN+f0gBWj/xFJYEVw5dk5WKop26AIa4+Luhg1u+f21rmc IWTQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2018-07-02 header.b=G1O35tlN; 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 f1-v6si20866540pgv.468.2018.11.14.00.47.09; Wed, 14 Nov 2018 00:47:24 -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=G1O35tlN; 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 S1732263AbeKNSsa (ORCPT + 99 others); Wed, 14 Nov 2018 13:48:30 -0500 Received: from aserp2120.oracle.com ([141.146.126.78]:38826 "EHLO aserp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732156AbeKNSsa (ORCPT ); Wed, 14 Nov 2018 13:48:30 -0500 Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.22/8.16.0.22) with SMTP id wAE8ho6e088992; Wed, 14 Nov 2018 08:46:10 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=KjtFBzl48kWHUaiGs45dIZaVO/sEyPqGFzaPjx5bZbs=; b=G1O35tlNYi/1JO0QydAdqGAp0EpezPPjLG6qGsJW+DQNaOSCuD/k/469TV/QPxxqIRSz wQZB3kifJQq5Vyoz02u0R9s3a7EKUSwQg57xF33aD8M+YktRP0LfNCnL9b7F47Xl/ze7 AMOXw6jifL4rhPjAUwGS2dwKaYP52rTk98G55tqdG8qrU6kvCunSsNaQwXX2op5ctfg6 TfEEAy+KFew4Baq+b0w+o4Wp3Jyz03sEGnU2XhwC6xfudZeUKCAk6ZZ4sQRj13pVgLEr nm1aGsrPJxPxvjRZ9IJtPfjsk/ZDM+psDcLHfAIAkx9XNzEBreJE3FBmKmbmsoRCgP02 sA== Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp2120.oracle.com with ESMTP id 2nr7cs1vsk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 14 Nov 2018 08:46:10 +0000 Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.14.4/8.14.4) with ESMTP id wAE8k45e029574 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 14 Nov 2018 08:46:04 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id wAE8k3Zh025044; Wed, 14 Nov 2018 08:46:03 GMT Received: from will-ThinkCentre-M93p.cn.oracle.com (/10.182.70.234) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 14 Nov 2018 00:46:03 -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 V7 1/4] blk-mq: refactor the code of issue request directly Date: Wed, 14 Nov 2018 16:45:28 +0800 Message-Id: <1542185131-15029-2-git-send-email-jianchao.w.wang@oracle.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1542185131-15029-1-git-send-email-jianchao.w.wang@oracle.com> References: <1542185131-15029-1-git-send-email-jianchao.w.wang@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=9076 signatures=668683 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-1811140080 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. Signed-off-by: Jianchao Wang --- block/blk-mq.c | 93 ++++++++++++++++++++++++++++------------------------------ 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index 411be60..14b4d06 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1766,78 +1766,75 @@ 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 bypass) { struct request_queue *q = rq->q; bool run_queue = true; + blk_status_t ret = BLK_STS_RESOURCE; + int srcu_idx; + 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; + /* + * Bypass the potential scheduler on the bottom device. + */ + if (unlikely(q->elevator && !bypass)) + goto out_unlock; - if (!blk_mq_get_dispatch_budget(hctx)) - goto insert; + if (unlikely(!blk_mq_get_dispatch_budget(hctx))) + goto out_unlock; - if (!blk_mq_get_driver_tag(rq)) { + if (unlikely(!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); -insert: - if (bypass_insert) - return BLK_STS_RESOURCE; - - blk_mq_sched_insert_request(rq, false, run_queue, false); - 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); + ret = __blk_mq_issue_directly(hctx, rq, cookie); - hctx_lock(hctx, &srcu_idx); +out_unlock: + hctx_unlock(hctx, srcu_idx); - ret = __blk_mq_try_issue_directly(hctx, rq, cookie, false); - if (ret == BLK_STS_RESOURCE || ret == BLK_STS_DEV_RESOURCE) - blk_mq_sched_insert_request(rq, false, true, false); - else if (ret != BLK_STS_OK) - blk_mq_end_request(rq, ret); + switch (ret) { + case BLK_STS_OK: + break; + case BLK_STS_DEV_RESOURCE: + case BLK_STS_RESOURCE: + if (!bypass) { + blk_mq_sched_insert_request(rq, false, run_queue, false); + ret = BLK_STS_OK; + } + break; + default: + if (!bypass) { + blk_mq_end_request(rq, ret); + ret = BLK_STS_OK; + } + break; + } - hctx_unlock(hctx, srcu_idx); + return ret; } blk_status_t blk_mq_request_issue_directly(struct request *rq) { - blk_status_t ret; - int srcu_idx; blk_qc_t unused_cookie; - struct blk_mq_hw_ctx *hctx = rq->mq_hctx; - hctx_lock(hctx, &srcu_idx); - ret = __blk_mq_try_issue_directly(hctx, rq, &unused_cookie, true); - hctx_unlock(hctx, srcu_idx); - - return ret; + return blk_mq_try_issue_directly(rq->mq_hctx, rq, &unused_cookie, true); } void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx, @@ -1958,13 +1955,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); } } 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); } else { blk_mq_put_ctx(data.ctx); blk_mq_bio_to_request(rq, bio); -- 2.7.4