From patchwork Thu Sep 19 11:29:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?UXVuLXdlaSBMaW4gKOael+e+pOW0tCk=?= X-Patchwork-Id: 13807654 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8331CCE8D78 for ; Thu, 19 Sep 2024 11:31:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:CC:To:From:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=oyX6ix+Ca+kuBSd2zaDcetxDLf8fGfj/eEE4RWU8lsQ=; b=nC/cZdBOt7e8oKqv/0P+Yiprcv 6ahGBh44xmF7SZExABBfFZ7M7h99DU2O4EaWNhO8ytQo86UHKmQI20VL2NtuCuwgTvkk9P8BpFUMZ S0VSbSdfavy4HEcRVl84UmIN66X7O4sYM6cF0aagAScKAgRxCplQSJbVp2mEyEX2+mWmv2kzHgP7N bBvyZ3DQdWusgXHebZDX/Zoobm3Xm8ddPzFh0yCc+3wi8fAAnMGWzENpAo8K5ksBLKW8bEO/fxlXQ +mvJ0pTzWO3IgO++OZWbmJ4yeqLIn2PuQA9Yle46dv+WmFqAOegOWihoihi5e+i6gF/EfXWFZl2TG +zGhTaXg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1srFNj-0000000AALK-0fZj; Thu, 19 Sep 2024 11:31:31 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1srFMZ-0000000AA2d-2zgW; Thu, 19 Sep 2024 11:30:21 +0000 X-UUID: 89a67c3a767a11efb3adad29d29602c1-20240919 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=oyX6ix+Ca+kuBSd2zaDcetxDLf8fGfj/eEE4RWU8lsQ=; b=JpoSK834JdxhsMfYUVK1hDaZCq9YE9044w41Yle4h+LdHzSZKymPykj3vRiV6sdKKCTI6a2M9wG4FdtbtC0miLERvDSZvB+DrqjcwApRRTVJ8A19FvchOE0OFsjr7+o27ewfgwElCnbx9byDn8Bpn6g/ksHWagblqNHn+IhcXzo=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.41,REQID:1ff07fb1-1fa1-4f4e-8525-375b2f703bcd,IP:0,U RL:0,TC:0,Content:-25,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTIO N:release,TS:-25 X-CID-META: VersionHash:6dc6a47,CLOUDID:cef03d9e-8e9a-4ac1-b510-390a86b53c0a,B ulkID:nil,BulkQuantity:0,Recheck:0,SF:102,TC:nil,Content:0,EDM:-3,IP:nil,U RL:0,File:nil,RT:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1, SPR:NO,DKR:0,DKP:0,BRR:0,BRE:0,ARC:0 X-CID-BVR: 0 X-CID-BAS: 0,_,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-UUID: 89a67c3a767a11efb3adad29d29602c1-20240919 Received: from mtkmbs13n2.mediatek.inc [(172.21.101.108)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 961147067; Thu, 19 Sep 2024 04:30:13 -0700 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by MTKMBS09N2.mediatek.inc (172.21.101.94) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.26; Thu, 19 Sep 2024 04:30:10 -0700 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.1118.26 via Frontend Transport; Thu, 19 Sep 2024 19:30:10 +0800 From: Qun-Wei Lin To: Andrew Morton , Matthias Brugger , AngeloGioacchino Del Regno , Ryan Roberts , "Huang, Ying" , David Hildenbrand , Chris Li , "Matthew Wilcox (Oracle)" , Al Viro , Dan Schatzberg , Kairui Song , Barry Song , Jens Axboe CC: , , , , , Casper Li , Chinwen Chang , Andrew Yang , John Hsu , , Qun-Wei Lin Subject: [PATCH 1/2] block: add BLK_FEAT_READ_SYNCHRONOUS feature for synchronous read Date: Thu, 19 Sep 2024 19:29:51 +0800 Message-ID: <20240919112952.981-2-qun-wei.lin@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20240919112952.981-1-qun-wei.lin@mediatek.com> References: <20240919112952.981-1-qun-wei.lin@mediatek.com> MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240919_043019_786640_CD57E568 X-CRM114-Status: GOOD ( 12.93 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org This commit introduces a new feature flag, BLK_FEAT_READ_SYNCHRONOUS, which ensures that read operations always complete in the submit context. This is useful for scenarios where synchronous read operations are required while allowing write operations to remain asynchronous. This patch is preparation for optimizing of the operation of the swap device with next patch. Signed-off-by: Qun-Wei Lin --- include/linux/blkdev.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 643c9020a35a..a697db11d91c 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -332,6 +332,9 @@ typedef unsigned int __bitwise blk_features_t; #define BLK_FEAT_RAID_PARTIAL_STRIPES_EXPENSIVE \ ((__force blk_features_t)(1u << 15)) +/* read operations always completes in submit context */ +#define BLK_FEAT_READ_SYNCHRONOUS ((__force blk_features_t)(1u << 16)) + /* * Flags automatically inherited when stacking limits. */ @@ -1310,6 +1313,11 @@ static inline bool bdev_synchronous(struct block_device *bdev) return bdev->bd_disk->queue->limits.features & BLK_FEAT_SYNCHRONOUS; } +static inline bool bdev_read_synchronous(struct block_device *bdev) +{ + return bdev->bd_disk->queue->limits.features & BLK_FEAT_READ_SYNCHRONOUS; +} + static inline bool bdev_stable_writes(struct block_device *bdev) { struct request_queue *q = bdev_get_queue(bdev); From patchwork Thu Sep 19 11:29:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?UXVuLXdlaSBMaW4gKOael+e+pOW0tCk=?= X-Patchwork-Id: 13807656 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3ABEDCE8D78 for ; Thu, 19 Sep 2024 11:33:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:CC:To:From:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=Z1SfHddMinVKqBnBm88AjNHZXXoOonLGMKU9hBryUwg=; b=LLjh4GcAmy3MF+J6+EKl+TSr5G AEVdFEAXyCX9eJYdSe/4UkyGPE531ZdYbkD4QHCu2psXifzysfGvF3j5KS+cTcs4FCKjGruMiYPyc UOvLT5gBm1W6OsIGO0pS938hpQ1Wcr0rlpzEzPGWFsUpcqZkjbDUPl8gxUefZZ4QA1VT4NtXwlUjV XjEJVCHnZlX4UZYftNhj5aM56xMa/pdu9+Brb9RZCi9MlWv5xg9qa+nI/xIFXdSNeME20CtMTCKCZ w5oirmDV+OfvE3+m4JI1j0JVZ3OiGe7SLUL/FZHvTVWGkAJeiUbN0lh93OxwxoPpi0gjenFjaqbTx Q2FaPYSg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1srFPr-0000000AAbo-2dsB; Thu, 19 Sep 2024 11:33:43 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1srFMb-0000000AA2d-0887; Thu, 19 Sep 2024 11:30:22 +0000 X-UUID: 89c65f96767a11efb3adad29d29602c1-20240919 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=Z1SfHddMinVKqBnBm88AjNHZXXoOonLGMKU9hBryUwg=; b=H+UYOB/jxS26nMcyuJNX2vQjHqqwM6HxZ5BlhzQRcFpBxpne/WVLeOzAqB170VtJyLlanVhtUyyqOgZHg/xJu5+9PD4F8Zv6VmCpWAAhHXOe/6I5x7uLDIr+HgbSEqQx9SWSgLGe/vQwfex726o+bnECzCrwiUeEFDDQTmPucCk=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.41,REQID:491685d5-aba9-4721-8f4d-70a97f01e1d7,IP:0,U RL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION: release,TS:0 X-CID-META: VersionHash:6dc6a47,CLOUDID:e6f03d9e-8e9a-4ac1-b510-390a86b53c0a,B ulkID:nil,BulkQuantity:0,Recheck:0,SF:102,TC:nil,Content:0,EDM:-3,IP:nil,U RL:0,File:nil,RT:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1, SPR:NO,DKR:0,DKP:0,BRR:0,BRE:0,ARC:0 X-CID-BVR: 0,NGT X-CID-BAS: 0,NGT,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-UUID: 89c65f96767a11efb3adad29d29602c1-20240919 Received: from mtkmbs09n1.mediatek.inc [(172.21.101.35)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1539984087; Thu, 19 Sep 2024 04:30:14 -0700 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by mtkmbs11n1.mediatek.inc (172.21.101.185) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.26; Thu, 19 Sep 2024 19:30:10 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.1118.26 via Frontend Transport; Thu, 19 Sep 2024 19:30:10 +0800 From: Qun-Wei Lin To: Andrew Morton , Matthias Brugger , AngeloGioacchino Del Regno , Ryan Roberts , "Huang, Ying" , David Hildenbrand , Chris Li , "Matthew Wilcox (Oracle)" , Al Viro , Dan Schatzberg , Kairui Song , Barry Song , Jens Axboe CC: , , , , , Casper Li , Chinwen Chang , Andrew Yang , John Hsu , , Qun-Wei Lin Subject: [PATCH 2/2] mm, swap: introduce SWP_READ_SYNCHRONOUS_IO Date: Thu, 19 Sep 2024 19:29:52 +0800 Message-ID: <20240919112952.981-3-qun-wei.lin@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20240919112952.981-1-qun-wei.lin@mediatek.com> References: <20240919112952.981-1-qun-wei.lin@mediatek.com> MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240919_043021_138521_FDD2BF07 X-CRM114-Status: GOOD ( 17.40 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org The existing SWP_SYNCHRONOUS_IO flag is not enough for certain swap devices that support synchronous read operations but asynchronous write operations, so we need to introduce a new flag SWP_READ_SYNCHRONOUS_IO. Signed-off-by: Qun-Wei Lin --- include/linux/swap.h | 31 ++++++++++++++++--------------- mm/memory.c | 3 ++- mm/page_io.c | 2 +- mm/swapfile.c | 3 +++ 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index ba7ea95d1c57..f595050f431b 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -205,21 +205,22 @@ struct swap_extent { offsetof(union swap_header, info.badpages)) / sizeof(int)) enum { - SWP_USED = (1 << 0), /* is slot in swap_info[] used? */ - SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */ - SWP_DISCARDABLE = (1 << 2), /* blkdev support discard */ - SWP_DISCARDING = (1 << 3), /* now discarding a free cluster */ - SWP_SOLIDSTATE = (1 << 4), /* blkdev seeks are cheap */ - SWP_CONTINUED = (1 << 5), /* swap_map has count continuation */ - SWP_BLKDEV = (1 << 6), /* its a block device */ - SWP_ACTIVATED = (1 << 7), /* set after swap_activate success */ - SWP_FS_OPS = (1 << 8), /* swapfile operations go through fs */ - SWP_AREA_DISCARD = (1 << 9), /* single-time swap area discards */ - SWP_PAGE_DISCARD = (1 << 10), /* freed swap page-cluster discards */ - SWP_STABLE_WRITES = (1 << 11), /* no overwrite PG_writeback pages */ - SWP_SYNCHRONOUS_IO = (1 << 12), /* synchronous IO is efficient */ - /* add others here before... */ - SWP_SCANNING = (1 << 14), /* refcount in scan_swap_map */ + SWP_USED = (1 << 0), /* is slot in swap_info[] used? */ + SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */ + SWP_DISCARDABLE = (1 << 2), /* blkdev support discard */ + SWP_DISCARDING = (1 << 3), /* now discarding a free cluster */ + SWP_SOLIDSTATE = (1 << 4), /* blkdev seeks are cheap */ + SWP_CONTINUED = (1 << 5), /* swap_map has count continuation */ + SWP_BLKDEV = (1 << 6), /* its a block device */ + SWP_ACTIVATED = (1 << 7), /* set after swap_activate success */ + SWP_FS_OPS = (1 << 8), /* swapfile operations go through fs */ + SWP_AREA_DISCARD = (1 << 9), /* single-time swap area discards */ + SWP_PAGE_DISCARD = (1 << 10), /* freed swap page-cluster discards */ + SWP_STABLE_WRITES = (1 << 11), /* no overwrite PG_writeback pages */ + SWP_SYNCHRONOUS_IO = (1 << 12), /* synchronous IO is efficient */ + SWP_READ_SYNCHRONOUS_IO = (1 << 13), /* synchronous IO is efficient */ + /* add others here before... */ + SWP_SCANNING = (1 << 14), /* refcount in scan_swap_map */ }; #define SWAP_CLUSTER_MAX 32UL diff --git a/mm/memory.c b/mm/memory.c index ebfc9768f801..f531a6bfea5b 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4089,7 +4089,8 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) swapcache = folio; if (!folio) { - if (data_race(si->flags & SWP_SYNCHRONOUS_IO) && + if ((data_race(si->flags & (SWP_SYNCHRONOUS_IO | + SWP_READ_SYNCHRONOUS_IO))) && __swap_count(entry) == 1) { /* * Prevent parallel swapin from proceeding with diff --git a/mm/page_io.c b/mm/page_io.c index ff8c99ee3af7..98a00709e98c 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -499,7 +499,7 @@ static void swap_read_folio_bdev_async(struct folio *folio, void swap_read_folio(struct folio *folio, struct swap_iocb **plug) { struct swap_info_struct *sis = swp_swap_info(folio->swap); - bool synchronous = sis->flags & SWP_SYNCHRONOUS_IO; + bool synchronous = sis->flags & (SWP_SYNCHRONOUS_IO | SWP_READ_SYNCHRONOUS_IO); bool workingset = folio_test_workingset(folio); unsigned long pflags; bool in_thrashing; diff --git a/mm/swapfile.c b/mm/swapfile.c index 38bdc439651a..7b8feb235aab 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -3177,6 +3177,9 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) if (p->bdev && bdev_synchronous(p->bdev)) p->flags |= SWP_SYNCHRONOUS_IO; + if (p->bdev && bdev_read_synchronous(p->bdev)) + p->flags |= SWP_READ_SYNCHRONOUS_IO; + if (p->bdev && bdev_nonrot(p->bdev)) { int cpu, i; unsigned long ci, nr_cluster;