Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp20991ybp; Thu, 3 Oct 2019 09:36:31 -0700 (PDT) X-Google-Smtp-Source: APXvYqw+sY+1UDHB2XBgnZpMtq53NUW6vcW2wBzLtV/5ufKfCorsGZX8kHtusbeJ0ScNj/roUyMR X-Received: by 2002:a17:906:d154:: with SMTP id br20mr8689654ejb.79.1570120590928; Thu, 03 Oct 2019 09:36:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570120590; cv=none; d=google.com; s=arc-20160816; b=Fq/acrAp4wEWgTacX2NrEVPMpFFAeD54dGrTxfGTCkF7BEIrYPaY4w0jIDjyezZtpT lGF5A6TAWONwMfm7W/eMgsErT2Isv/iH1wd8evGLIIpwubESJfRWhYthdza2aPPO4g4H mWo35PaezABxCmNetj78E0NYK6D3PGhNNS7qZAGM3n37fR+5oQ5hC48lcg+9IqZnJ5iK pzLtiVRhN5dND14sYZFabOAliUWMYBoOv2rvtpVIJuNa0ulqDbKHX173oWkWSHWincVw w7w/wFd3Upp/seBMmnutJFDCdAMLnAs0/z1ASkDVhN6AUmaucO2GPjyB10N5sL2n82k5 zOUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=shJ0bnoaSwyxbAZxY4iJH76sfUcDAvKF4gLdWV8Cb2o=; b=IhavEAvF+4qeGmac9Y7Ec3bLEDNY0fpV4oa5ghjW56oj9S6mmkfci1Ijyrbb4eYwcQ M+RkpPfXBmvXnfQ6DgIQxy+A1ZK9UGg3fr+x5tkYttmPfrceBVcMzYDw9EpcEJhkEPwI 3WZWzbJ0S4Z7Dww5dSI3zNJL3YubgrJCCnxUxT0qNfAazzVKFDenVm0l4JAnwRL1NRYh i3FTR3pFxrAw+QLtKuRhTujbZQ0iFKvupfPSEuv5wOMdBrENUlVKMVzvx6ZYLpCgQru7 fSktktO7juiSelTtaXl6EoBsoG+3j2AN+v0gSzv0Eln7duQLstu28rHS1Xs82G2sIgJP KpRQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=hvgttceQ; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f13si1675887eda.277.2019.10.03.09.36.06; Thu, 03 Oct 2019 09:36:30 -0700 (PDT) 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=@kernel.org header.s=default header.b=hvgttceQ; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391923AbfJCQc1 (ORCPT + 99 others); Thu, 3 Oct 2019 12:32:27 -0400 Received: from mail.kernel.org ([198.145.29.99]:39948 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390436AbfJCQcZ (ORCPT ); Thu, 3 Oct 2019 12:32:25 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 50E8A2070B; Thu, 3 Oct 2019 16:32:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570120343; bh=HlgQtIyPanrqp3NrtSIRncC6kR3bDwrU5TfjDjtS9bI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hvgttceQuZhTqijSY0H3BY1d8DTRuJVYbAsWzgUiCfjUK1TsjDgzgbNvUrgm1rPBR mHkT8vWBSU98aJULENatAm7qv2KcJiUBPZBmzOtzCN+HgLU6xErWi4QtvIFmm+vSc0 bhZyTyT46SOEWNrJC72eWw8nZ4oQvYjySput5d0Q= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Pavel Begunkov , Hou Tao , Jens Axboe , Sasha Levin Subject: [PATCH 5.2 187/313] block: make rq sector size accessible for block stats Date: Thu, 3 Oct 2019 17:52:45 +0200 Message-Id: <20191003154551.403130600@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191003154533.590915454@linuxfoundation.org> References: <20191003154533.590915454@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hou Tao [ Upstream commit 3d24430694077313c75c6b89f618db09943621e4 ] Currently rq->data_len will be decreased by partial completion or zeroed by completion, so when blk_stat_add() is invoked, data_len will be zero and there will never be samples in poll_cb because blk_mq_poll_stats_bkt() will return -1 if data_len is zero. We could move blk_stat_add() back to __blk_mq_complete_request(), but that would make the effort of trying to call ktime_get_ns() once in vain. Instead we can reuse throtl_size field, and use it for both block stats and block throttle, and adjust the logic in blk_mq_poll_stats_bkt() accordingly. Fixes: 4bc6339a583c ("block: move blk_stat_add() to __blk_mq_end_request()") Tested-by: Pavel Begunkov Signed-off-by: Hou Tao Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- block/blk-mq.c | 11 +++++------ block/blk-throttle.c | 3 ++- include/linux/blkdev.h | 15 ++++++++++++--- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index f934e8afe5b43..af93ca28ce4f0 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -44,12 +44,12 @@ static void blk_mq_poll_stats_fn(struct blk_stat_callback *cb); static int blk_mq_poll_stats_bkt(const struct request *rq) { - int ddir, bytes, bucket; + int ddir, sectors, bucket; ddir = rq_data_dir(rq); - bytes = blk_rq_bytes(rq); + sectors = blk_rq_stats_sectors(rq); - bucket = ddir + 2*(ilog2(bytes) - 9); + bucket = ddir + 2 * ilog2(sectors); if (bucket < 0) return -1; @@ -330,6 +330,7 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data, else rq->start_time_ns = 0; rq->io_start_time_ns = 0; + rq->stats_sectors = 0; rq->nr_phys_segments = 0; #if defined(CONFIG_BLK_DEV_INTEGRITY) rq->nr_integrity_segments = 0; @@ -679,9 +680,7 @@ void blk_mq_start_request(struct request *rq) if (test_bit(QUEUE_FLAG_STATS, &q->queue_flags)) { rq->io_start_time_ns = ktime_get_ns(); -#ifdef CONFIG_BLK_DEV_THROTTLING_LOW - rq->throtl_size = blk_rq_sectors(rq); -#endif + rq->stats_sectors = blk_rq_sectors(rq); rq->rq_flags |= RQF_STATS; rq_qos_issue(q, rq); } diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 8ab6c81532236..ee74bffe3504d 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -2246,7 +2246,8 @@ void blk_throtl_stat_add(struct request *rq, u64 time_ns) struct request_queue *q = rq->q; struct throtl_data *td = q->td; - throtl_track_latency(td, rq->throtl_size, req_op(rq), time_ns >> 10); + throtl_track_latency(td, blk_rq_stats_sectors(rq), req_op(rq), + time_ns >> 10); } void blk_throtl_bio_endio(struct bio *bio) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 93baef66b9424..4c6754e536725 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -202,9 +202,12 @@ struct request { #ifdef CONFIG_BLK_WBT unsigned short wbt_flags; #endif -#ifdef CONFIG_BLK_DEV_THROTTLING_LOW - unsigned short throtl_size; -#endif + /* + * rq sectors used for blk stats. It has the same value + * with blk_rq_sectors(rq), except that it never be zeroed + * by completion. + */ + unsigned short stats_sectors; /* * Number of scatter-gather DMA addr+len pairs after @@ -902,6 +905,7 @@ static inline struct request_queue *bdev_get_queue(struct block_device *bdev) * blk_rq_err_bytes() : bytes left till the next error boundary * blk_rq_sectors() : sectors left in the entire request * blk_rq_cur_sectors() : sectors left in the current segment + * blk_rq_stats_sectors() : sectors of the entire request used for stats */ static inline sector_t blk_rq_pos(const struct request *rq) { @@ -930,6 +934,11 @@ static inline unsigned int blk_rq_cur_sectors(const struct request *rq) return blk_rq_cur_bytes(rq) >> SECTOR_SHIFT; } +static inline unsigned int blk_rq_stats_sectors(const struct request *rq) +{ + return rq->stats_sectors; +} + #ifdef CONFIG_BLK_DEV_ZONED static inline unsigned int blk_rq_zone_no(struct request *rq) { -- 2.20.1