From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C316DC433FE for ; Fri, 24 Jul 2020 07:33:50 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 751F620767 for ; Fri, 24 Jul 2020 07:33:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="CfD2KeaR" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 751F620767 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lst.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 5E1258D001C; Fri, 24 Jul 2020 03:33:43 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4BDFC8D0015; Fri, 24 Jul 2020 03:33:43 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1859D8D001C; Fri, 24 Jul 2020 03:33:43 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0193.hostedemail.com [216.40.44.193]) by kanga.kvack.org (Postfix) with ESMTP id EE7CB8D0015 for ; Fri, 24 Jul 2020 03:33:42 -0400 (EDT) Received: from smtpin30.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id B6E05125C for ; Fri, 24 Jul 2020 07:33:42 +0000 (UTC) X-FDA: 77072154684.30.sugar34_2614f0926f45 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin30.hostedemail.com (Postfix) with ESMTP id 88CE11803D60B for ; Fri, 24 Jul 2020 07:33:42 +0000 (UTC) X-HE-Tag: sugar34_2614f0926f45 X-Filterd-Recvd-Size: 12176 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf38.hostedemail.com (Postfix) with ESMTP for ; Fri, 24 Jul 2020 07:33:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=FzZ6/zgVBqPtRjoXgIlMHr6borSDoijxnK9rowFZCss=; b=CfD2KeaRJ2qBZP1kGC4kr75Plv RUd9ep4PNe4vlSlJj9CkVcud4LGi1HiZsC1Gm26T7GCAzkMmWrgDMCo9enSiZ3R3KFjnANsLche7J pGpbI3JkAQZKSWh3c/YykNOuyTtW/2oP/VUz8szZ0Qj7JLhD6aBkkFwWPeuxBKUCM8aRLakaop48L lJfYG3VKEJ9U4reUzRBpsZqrJUot2zofzJHGsLG1UUNg4hnAbFhK1rW0BP1yhsESEI3KNHSrTpyhc 1DGrBJAoSyQjjGZTPk340CKjIKrbfgmclbSslue9JMa23y9f78VPKszpgrbxsgx1Z5XTppjom91TI FTAfadJw==; Received: from [2001:4bb8:18c:2acc:8dfe:be3c:592c:efc5] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1jysCv-0006Ca-Ni; Fri, 24 Jul 2020 07:33:31 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Song Liu , Hans de Goede , Richard Weinberger , Minchan Kim , linux-mtd@lists.infradead.org, dm-devel@redhat.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, drbd-dev@lists.linbit.com, linux-raid@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org Subject: [PATCH 06/14] block: lift setting the readahead size into the block layer Date: Fri, 24 Jul 2020 09:33:05 +0200 Message-Id: <20200724073313.138789-7-hch@lst.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200724073313.138789-1-hch@lst.de> References: <20200724073313.138789-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html X-Rspamd-Queue-Id: 88CE11803D60B X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam01 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Drivers shouldn't really mess with the readahead size, as that is a VM concept. Instead set it based on the optimal I/O size by lifting the algorithm from the md driver when registering the disk. Also set bdi->io_pages there as well by applying the same scheme based on max_sectors. Signed-off-by: Christoph Hellwig --- block/blk-settings.c | 5 ++--- block/blk-sysfs.c | 1 - block/genhd.c | 13 +++++++++++-- drivers/block/aoe/aoeblk.c | 2 -- drivers/block/drbd/drbd_nl.c | 12 +----------- drivers/md/bcache/super.c | 4 ---- drivers/md/dm-table.c | 3 --- drivers/md/raid0.c | 16 ---------------- drivers/md/raid10.c | 24 +----------------------- drivers/md/raid5.c | 13 +------------ 10 files changed, 16 insertions(+), 77 deletions(-) diff --git a/block/blk-settings.c b/block/blk-settings.c index 76a7e03bcd6cac..01049e9b998f1d 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -452,6 +452,8 @@ EXPORT_SYMBOL(blk_limits_io_opt); void blk_queue_io_opt(struct request_queue *q, unsigned int opt) { blk_limits_io_opt(&q->limits, opt); + q->backing_dev_info->ra_pages =3D + max(queue_io_opt(q) * 2 / PAGE_SIZE, VM_READAHEAD_PAGES); } EXPORT_SYMBOL(blk_queue_io_opt); =20 @@ -628,9 +630,6 @@ void disk_stack_limits(struct gendisk *disk, struct b= lock_device *bdev, printk(KERN_NOTICE "%s: Warning: Device %s is misaligned\n", top, bottom); } - - t->backing_dev_info->io_pages =3D - t->limits.max_sectors >> (PAGE_SHIFT - 9); } EXPORT_SYMBOL(disk_stack_limits); =20 diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 7dda709f3ccb6f..ce418d9128a0b2 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -245,7 +245,6 @@ queue_max_sectors_store(struct request_queue *q, cons= t char *page, size_t count) =20 spin_lock_irq(&q->queue_lock); q->limits.max_sectors =3D max_sectors_kb << 1; - q->backing_dev_info->io_pages =3D max_sectors_kb >> (PAGE_SHIFT - 10); spin_unlock_irq(&q->queue_lock); =20 return ret; diff --git a/block/genhd.c b/block/genhd.c index 8b1e9f48957cb5..097d4e4bc0b8a2 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -775,6 +775,7 @@ static void __device_add_disk(struct device *parent, = struct gendisk *disk, const struct attribute_group **groups, bool register_queue) { + struct request_queue *q =3D disk->queue; dev_t devt; int retval; =20 @@ -785,7 +786,7 @@ static void __device_add_disk(struct device *parent, = struct gendisk *disk, * registration. */ if (register_queue) - elevator_init_mq(disk->queue); + elevator_init_mq(q); =20 /* minors =3D=3D 0 indicates to use ext devt from part0 and should * be accompanied with EXT_DEVT flag. Make sure all @@ -815,10 +816,18 @@ static void __device_add_disk(struct device *parent= , struct gendisk *disk, disk->flags |=3D GENHD_FL_SUPPRESS_PARTITION_INFO; disk->flags |=3D GENHD_FL_NO_PART_SCAN; } else { - struct backing_dev_info *bdi =3D disk->queue->backing_dev_info; + struct backing_dev_info *bdi =3D q->backing_dev_info; struct device *dev =3D disk_to_dev(disk); int ret; =20 + /* + * For read-ahead of large files to be effective, we need to + * readahead at least twice the optimal I/O size. + */ + bdi->ra_pages =3D max(queue_io_opt(q) * 2 / PAGE_SIZE, + VM_READAHEAD_PAGES); + bdi->io_pages =3D queue_max_sectors(q) >> (PAGE_SHIFT - 9); + /* Register BDI before referencing it from bdev */ dev->devt =3D devt; ret =3D bdi_register(bdi, "%u:%u", MAJOR(devt), MINOR(devt)); diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c index 5ca7216e9e01f3..89b33b402b4e52 100644 --- a/drivers/block/aoe/aoeblk.c +++ b/drivers/block/aoe/aoeblk.c @@ -347,7 +347,6 @@ aoeblk_gdalloc(void *vp) mempool_t *mp; struct request_queue *q; struct blk_mq_tag_set *set; - enum { KB =3D 1024, MB =3D KB * KB, READ_AHEAD =3D 2 * MB, }; ulong flags; int late =3D 0; int err; @@ -407,7 +406,6 @@ aoeblk_gdalloc(void *vp) WARN_ON(d->gd); WARN_ON(d->flags & DEVFL_UP); blk_queue_max_hw_sectors(q, BLK_DEF_MAX_SECTORS); - q->backing_dev_info->ra_pages =3D READ_AHEAD / PAGE_SIZE; d->bufpool =3D mp; d->blkq =3D gd->queue =3D q; q->queuedata =3D d; diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index 650372ee2c7822..212bf711fb6b41 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c @@ -1360,18 +1360,8 @@ static void drbd_setup_queue_param(struct drbd_dev= ice *device, struct drbd_backi decide_on_discard_support(device, q, b, discard_zeroes_if_aligned); decide_on_write_same_support(device, q, b, o, disable_write_same); =20 - if (b) { + if (b) blk_stack_limits(&q->limits, &b->limits, 0); - - if (q->backing_dev_info->ra_pages !=3D - b->backing_dev_info->ra_pages) { - drbd_info(device, "Adjusting my ra_pages to backing device's (%lu -> = %lu)\n", - q->backing_dev_info->ra_pages, - b->backing_dev_info->ra_pages); - q->backing_dev_info->ra_pages =3D - b->backing_dev_info->ra_pages; - } - } fixup_discard_if_not_supported(q); fixup_write_zeroes(device, q); } diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 9e45faa054b6f4..9d3f0711be030f 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -1367,10 +1367,6 @@ static int cached_dev_init(struct cached_dev *dc, = unsigned int block_size) if (ret) return ret; =20 - dc->disk.disk->queue->backing_dev_info->ra_pages =3D - max(dc->disk.disk->queue->backing_dev_info->ra_pages, - q->backing_dev_info->ra_pages); - atomic_set(&dc->io_errors, 0); dc->io_disable =3D false; dc->error_limit =3D DEFAULT_CACHED_DEV_ERROR_LIMIT; diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index aac4c31cfc8498..324a42ed2f8894 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -1924,9 +1924,6 @@ void dm_table_set_restrictions(struct dm_table *t, = struct request_queue *q, q->nr_zones =3D blkdev_nr_zones(t->md->disk); } #endif - - /* Allow reads to exceed readahead limits */ - q->backing_dev_info->io_pages =3D limits->max_sectors >> (PAGE_SHIFT - = 9); } =20 unsigned int dm_table_get_num_targets(struct dm_table *t) diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index f54a449f97aa79..aa2d7279176880 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -410,22 +410,6 @@ static int raid0_run(struct mddev *mddev) mdname(mddev), (unsigned long long)mddev->array_sectors); =20 - if (mddev->queue) { - /* calculate the max read-ahead size. - * For read-ahead of large files to be effective, we need to - * readahead at least twice a whole stripe. i.e. number of devices - * multiplied by chunk size times 2. - * If an individual device has an ra_pages greater than the - * chunk size, then we will not drive that device as hard as it - * wants. We consider this a configuration error: a larger - * chunksize should be used in that case. - */ - int stripe =3D mddev->raid_disks * - (mddev->chunk_sectors << 9) / PAGE_SIZE; - if (mddev->queue->backing_dev_info->ra_pages < 2* stripe) - mddev->queue->backing_dev_info->ra_pages =3D 2* stripe; - } - dump_zones(mddev); =20 ret =3D md_integrity_register(mddev); diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 9f88ff9bdee437..23d15acbf457d4 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -3865,19 +3865,6 @@ static int raid10_run(struct mddev *mddev) mddev->resync_max_sectors =3D size; set_bit(MD_FAILFAST_SUPPORTED, &mddev->flags); =20 - if (mddev->queue) { - int stripe =3D conf->geo.raid_disks * - ((mddev->chunk_sectors << 9) / PAGE_SIZE); - - /* Calculate max read-ahead size. - * We need to readahead at least twice a whole stripe.... - * maybe... - */ - stripe /=3D conf->geo.near_copies; - if (mddev->queue->backing_dev_info->ra_pages < 2 * stripe) - mddev->queue->backing_dev_info->ra_pages =3D 2 * stripe; - } - if (md_integrity_register(mddev)) goto out_free_conf; =20 @@ -4715,17 +4702,8 @@ static void end_reshape(struct r10conf *conf) conf->reshape_safe =3D MaxSector; spin_unlock_irq(&conf->device_lock); =20 - /* read-ahead size must cover two whole stripes, which is - * 2 * (datadisks) * chunksize where 'n' is the number of raid devices - */ - if (conf->mddev->queue) { - int stripe =3D conf->geo.raid_disks * - ((conf->mddev->chunk_sectors << 9) / PAGE_SIZE); - stripe /=3D conf->geo.near_copies; - if (conf->mddev->queue->backing_dev_info->ra_pages < 2 * stripe) - conf->mddev->queue->backing_dev_info->ra_pages =3D 2 * stripe; + if (conf->mddev->queue) raid10_set_io_opt(conf); - } conf->fullsync =3D 0; } =20 diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 68e41ce3ca75cc..415ce3cc155698 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -7413,8 +7413,6 @@ static int raid5_run(struct mddev *mddev) int data_disks =3D conf->previous_raid_disks - conf->max_degraded; int stripe =3D data_disks * ((mddev->chunk_sectors << 9) / PAGE_SIZE); - if (mddev->queue->backing_dev_info->ra_pages < 2 * stripe) - mddev->queue->backing_dev_info->ra_pages =3D 2 * stripe; =20 chunk_size =3D mddev->chunk_sectors << 9; blk_queue_io_min(mddev->queue, chunk_size); @@ -8002,17 +8000,8 @@ static void end_reshape(struct r5conf *conf) spin_unlock_irq(&conf->device_lock); wake_up(&conf->wait_for_overlap); =20 - /* read-ahead size must cover two whole stripes, which is - * 2 * (datadisks) * chunksize where 'n' is the number of raid devices - */ - if (conf->mddev->queue) { - int data_disks =3D conf->raid_disks - conf->max_degraded; - int stripe =3D data_disks * ((conf->chunk_sectors << 9) - / PAGE_SIZE); - if (conf->mddev->queue->backing_dev_info->ra_pages < 2 * stripe) - conf->mddev->queue->backing_dev_info->ra_pages =3D 2 * stripe; + if (conf->mddev->queue) raid5_set_io_opt(conf); - } } } =20 --=20 2.27.0