Message ID | 20230109144701.83021-1-yishaih@nvidia.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp2201143wrt; Mon, 9 Jan 2023 06:58:37 -0800 (PST) X-Google-Smtp-Source: AMrXdXuKQa0rwkbdXWGWuIjg2wWvA9KJ7fKpp6sVfAV+WizozQYvgK8V2X2XkxCIC+PZh7xMSrSu X-Received: by 2002:a17:902:9695:b0:193:3314:540d with SMTP id n21-20020a170902969500b001933314540dmr3368926plp.51.1673276317148; Mon, 09 Jan 2023 06:58:37 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1673276317; cv=pass; d=google.com; s=arc-20160816; b=LLxXS9tWyJIrCwYHNco3CE5Hd3eL6GMjwynBPgAbgS0qLnhcCx8DieT0euDhYw8jOe 6aRzTLNXwBLc/fmHhbataDsyuWIYH1ZYHru0Ssaz3VYJUp1MEFNMWG71dC5WWrt974Rp Wy0jvvNM1IvOuiC5cYE78nQlDxQzRbMNWXTX4lH0plHRpUP9y+sUXjwkhKjRSphg7vav zlxx07bpbVbDc3TcTqBRszH0TJV3H4ZesoRQ6GYylYvzTdvN3WePJgzYNhvdErXhWSJ7 EphMrhrNkNmtK+Y5frsWndxgKKK6AP8NhEhcNZKCXnt3YCKZBUWL1trwWa52sZkam8Xd wVmQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=jbdZuSp73u/h7tOKBD3doKfJsV6a4vr5Yt0pui6hGgU=; b=UJarPidZjdKA2qGxvC+5T+4RATRZ46oIylLVplGWOduPViClZUF/EqmDxYarAzNdS6 XqtvdLykvoEDAIGIgz6EyR1hduVv7DESYsSy383hGAGD6hRdk52Iq5IsjGn1sZ2IWLJY wtvCaVfJpBGnRl3cHYNnfdSH93cA4HavC/7qSKQHL+LQyZyZ93fFnJ9/g0nm5rD9OkKI Z5YCHeOomb9XKNhAl1MmfEpBdqcTDVfpMBLwW0wmPB8Qw/NrtQuaZ13F56GEs48bKIfz 0/aOCwVizDilALc3KbNxsfozGwJCiQxFrF1M6S+51Iq5E0XnbralMh5CeT3P0Qp5Nuxb B8hg== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@Nvidia.com header.s=selector2 header.b=sh78pmE9; arc=pass (i=1 spf=pass spfdomain=nvidia.com dmarc=pass fromdomain=nvidia.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=nvidia.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z15-20020a1709028f8f00b00189239e6a29si8611664plo.95.2023.01.09.06.58.24; Mon, 09 Jan 2023 06:58:37 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@Nvidia.com header.s=selector2 header.b=sh78pmE9; arc=pass (i=1 spf=pass spfdomain=nvidia.com dmarc=pass fromdomain=nvidia.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=nvidia.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235107AbjAIOvr (ORCPT <rfc822;274620705z@gmail.com> + 99 others); Mon, 9 Jan 2023 09:51:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41316 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234937AbjAIOvX (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Mon, 9 Jan 2023 09:51:23 -0500 Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on2073.outbound.protection.outlook.com [40.107.96.73]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 04DE832180; Mon, 9 Jan 2023 06:48:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fbnnXR/MBAdNCly/STVR9eQ7xwKtsQpwXFU8U1fcVbqn5Qy3mEfIVwFgmcqhdDZsyPnlRn1Z83NMFqMF0copPTtX8hmKv+u52izcNbolgLmi2v6dVtMaKgZSguFdMAn29gZUY7ZSNnRUCwF0NSaGMppvflquylWHs7bYqqlT9OFRKVhAwv/CyI3Zi2fABkjJMKW778bKXHFlA4STmAomR/icmOp3YvLkpGe/R2m9CAj/PtQFBMuCs4wDKnluEOkCra9K7TNASStgHWtEMHBZqf0oLPApEZlRc0OhLojjVmtf40Q8j+aMc8BW00CfTxkxy+sfqvl2PK6/znc0hCgWJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=jbdZuSp73u/h7tOKBD3doKfJsV6a4vr5Yt0pui6hGgU=; b=LPSo8rJikAk8eDcNTGFKt/oRD+Un4srt+un6RZQGxQLaKMjUQEQKneZChsZIDVPeXAhUiFsg3XeITyPpCdGt2leWuOERdbrF63/9zMg0WXy1q1OS+DmttFW3ehYIrnqCqR3NJrutlghhQGyukl8lIAuTL2l0kJCqtLQdUpMJg/impLGewkkFlM8sAqq8yrpBHr2GkHrK9E9KnShnKsrL7IhsiZ1ETfdivNEeYBiTEHPYj3Kx+MqlsCVP5pVq6BC11ZOzAGktoZ3afrR/Jllgtc66ePnWnNITPWiQtV+pmrejzJy7GjYm3kgmthGlxfTGFNqd39d+3Az39GjOsvr06w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.233) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jbdZuSp73u/h7tOKBD3doKfJsV6a4vr5Yt0pui6hGgU=; b=sh78pmE9c35LFn6TV10c3kNu3w33E1PA3AIRD9WMuROrVSLrp6inqI9vF2qyXeEPudikhk+tFyeEVYX4Gt5MxpXJz5tytjvSDXVcHmaB4TuF22wQh3ZvB/JtyookcdjFU5sRgwCNoADFiBcLy6/fAD4FYcyECYp461paPfC4qL3TKeNA9pqWUMI8Hca6J4i0LVm3ROkdvFuIKK62f9KDfLYGhvyoKnDSs8Ynh9iFLoBQSizOq/175WOv4r5QW/V8c3Zn0xUUsAbW9aB8MsaqNAU9mdctUtmEPp4WFeNxb43gBFb6V2vI/nlCcq693FxKkL0Hn6fSJxKp3CrY/Urhhw== Received: from BN8PR15CA0068.namprd15.prod.outlook.com (2603:10b6:408:80::45) by MN2PR12MB4096.namprd12.prod.outlook.com (2603:10b6:208:1dc::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.18; Mon, 9 Jan 2023 14:48:08 +0000 Received: from BN8NAM11FT093.eop-nam11.prod.protection.outlook.com (2603:10b6:408:80:cafe::51) by BN8PR15CA0068.outlook.office365.com (2603:10b6:408:80::45) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.18 via Frontend Transport; Mon, 9 Jan 2023 14:48:08 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.233) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.233 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.233; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.233) by BN8NAM11FT093.mail.protection.outlook.com (10.13.177.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.18 via Frontend Transport; Mon, 9 Jan 2023 14:48:07 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by mail.nvidia.com (10.127.129.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.36; Mon, 9 Jan 2023 06:47:59 -0800 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail201.nvidia.com (10.126.190.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.36; Mon, 9 Jan 2023 06:47:59 -0800 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server id 15.2.986.36 via Frontend Transport; Mon, 9 Jan 2023 06:47:56 -0800 From: Yishai Hadas <yishaih@nvidia.com> To: <linux-kernel@vger.kernel.org>, <linux-block@vger.kernel.org>, <linux-mm@kvack.org>, <jgg@nvidia.com>, <axboe@kernel.dk>, <logang@deltatee.com> CC: <hch@lst.de>, <alex.williamson@redhat.com>, <yishaih@nvidia.com>, <leonro@nvidia.com>, <maorg@nvidia.com> Subject: [PATCH] lib/scatterlist: Fix to calculate the last_pg properly Date: Mon, 9 Jan 2023 16:47:01 +0200 Message-ID: <20230109144701.83021-1-yishaih@nvidia.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN8NAM11FT093:EE_|MN2PR12MB4096:EE_ X-MS-Office365-Filtering-Correlation-Id: 4c011757-627f-4d61-a566-08daf25085aa X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: r6GZHzmUOv47X0B/zH3IjwQhaYzgYpxC9PFiq+vxqAyYAgIEaeuuc0VOPOP8Kas5hjLjTywzy4KM8txEqyjqfhB3r5OwPhMJk3kiwAyTTPpDZb3RKAA2vJ+9jPFeaIr0q/ERqkYEr6yuxV/1Ht1ECNEU7yJicu+uPuhRSkcq+FJnbb9IP6b9l0FE66+vzef3ClN1sjv+mXgu+REiQ/O/NCWmUtsDNSx7Ch0EGRUZNCQDD9x1lLi1G5YzcrdGgzXyUt5P2Ox7gdBsxlBqsBjTZE9jHpJYCTcfx8lhi8V9dieLARkVcKG2riJpYXCPkHVlThMZ+w20RKVTGb9EodynyzLctMdW84IjWBNwCoFspxkswcyhKSYK686vfHBC2iv4nzTQ9C8DoT0JRwTRZgGqJtsjP7L0eoWSP7+PCk8+pTytnWhQjTFUpJHPgR8txJQycGTLQL2NcxlV/pG4M42i4trlePHxLvqS5PAVzNUdXN8comt5cNz3nvL9h8SM3ZQRMd7XbKslr+ZLpFQV8hiB5uL9jXgI5A+3Oss3nemGXnaazc9AyEWMgeI0Zbmojc9XHToCxZooWgy3UvcDPUCKVaULGoFTI7nN0OyIY5ZoDmt+FQ5lT8BrNqAsyjmTDztWI4WMl+/GF3qqwXPZMqkw+qSmKJGA0t4G1JYQN6yF+R1Cq8KjFi+dgig3sph8pex69NpjS3acdhx+sIOUapYRBJ6b3DWacO6vHjVKgfIS6xo= X-Forefront-Antispam-Report: CIP:216.228.118.233;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge2.nvidia.com;CAT:NONE;SFS:(13230022)(4636009)(136003)(396003)(376002)(346002)(39860400002)(451199015)(36840700001)(40470700004)(46966006)(1076003)(316002)(5660300002)(40480700001)(26005)(7696005)(186003)(478600001)(2616005)(40460700003)(426003)(47076005)(41300700001)(110136005)(70206006)(336012)(54906003)(4326008)(8676002)(70586007)(82310400005)(8936002)(83380400001)(86362001)(36756003)(6666004)(107886003)(36860700001)(82740400003)(356005)(2906002)(7636003)(2101003);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Jan 2023 14:48:07.8174 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4c011757-627f-4d61-a566-08daf25085aa X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.233];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT093.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB4096 X-Spam-Status: No, score=-1.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FORGED_SPF_HELO, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754557387067979672?= X-GMAIL-MSGID: =?utf-8?q?1754557387067979672?= |
Series |
lib/scatterlist: Fix to calculate the last_pg properly
|
|
Commit Message
Yishai Hadas
Jan. 9, 2023, 2:47 p.m. UTC
The last_pg is wrong, it is actually the first page of the last
scatterlist element. To get the last page of the last scatterlist
element we have to add prv->length. So it is checking mergability
against the wrong page, Further, a SG element is not guaranteed to end
on a page boundary, so we have to check the sub page location also for
merge eligibility.
Fix the above by checking physical contiguity, compute the actual last
page and then call pages_are_mergable().
Fixes: 1567b49d1a40 ("lib/scatterlist: add check when merging zone device pages")
Reported-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
---
lib/scatterlist.c | 27 +++++++++++++++++----------
1 file changed, 17 insertions(+), 10 deletions(-)
Comments
On 2023-01-09 07:47, Yishai Hadas wrote: > The last_pg is wrong, it is actually the first page of the last > scatterlist element. To get the last page of the last scatterlist > element we have to add prv->length. So it is checking mergability > against the wrong page, Further, a SG element is not guaranteed to end > on a page boundary, so we have to check the sub page location also for > merge eligibility. > > Fix the above by checking physical contiguity, compute the actual last > page and then call pages_are_mergable(). > > Fixes: 1567b49d1a40 ("lib/scatterlist: add check when merging zone device pages") > Reported-by: Jason Gunthorpe <jgg@nvidia.com> > Signed-off-by: Yishai Hadas <yishaih@nvidia.com> Looks right by my eye, thanks. Reviewed-by: Logan Gunthorpe <logang@deltatee.com> Logan
On 1/9/23 7:47 AM, Yishai Hadas wrote: > The last_pg is wrong, it is actually the first page of the last > scatterlist element. To get the last page of the last scatterlist > element we have to add prv->length. So it is checking mergability > against the wrong page, Further, a SG element is not guaranteed to end > on a page boundary, so we have to check the sub page location also for > merge eligibility. > > Fix the above by checking physical contiguity, compute the actual last > page and then call pages_are_mergable(). Reviewed-by: Jens Axboe <axboe@kernel.dk> Andrew, can you pick this one up?
On Mon, Jan 09, 2023 at 04:47:01PM +0200, Yishai Hadas wrote: > if (sgt_append->prv) { > + unsigned long paddr = > + (page_to_pfn(sg_page(sgt_append->prv)) * PAGE_SIZE + 1. page_to_pfn() * PAGE_SIZE is spelled page_to_phys() 2. physical addresses have type phys_addr_t. Oh, wait, paddr isn't a physical address, it's a pfn because you divide by PAGE_SIZE at the end. But you will get truncation on 32-bit, because page_to_pfn() has type unsigned long. Anyway, this shouldn't be called paddr. Maybe last_pfn or something? > + sgt_append->prv->offset + sgt_append->prv->length) / > + PAGE_SIZE;
On 10/01/2023 7:08, Matthew Wilcox wrote: > On Mon, Jan 09, 2023 at 04:47:01PM +0200, Yishai Hadas wrote: >> if (sgt_append->prv) { >> + unsigned long paddr = >> + (page_to_pfn(sg_page(sgt_append->prv)) * PAGE_SIZE + > 1. page_to_pfn() * PAGE_SIZE is spelled page_to_phys() > > 2. physical addresses have type phys_addr_t. Oh, wait, paddr isn't a > physical address, it's a pfn because you divide by PAGE_SIZE at the end. > But you will get truncation on 32-bit, because page_to_pfn() has type > unsigned long. Anyway, this shouldn't be called paddr. Maybe last_pfn > or something? > >> + sgt_append->prv->offset + sgt_append->prv->length) / >> + PAGE_SIZE; In this area of the patch I just reverted to what we had in 6.1 [1] where we were good. I can send V1 and replace the 'paddr' to be called 'last_pfn' if it's really needed. Alternatively, we can stay with this patch version unless you can see here any real issue. What do you suggest ? [1] https://elixir.bootlin.com/linux/v6.1.4/source/lib/scatterlist.c#L462 Yishai
On Tue, Jan 10, 2023 at 10:01:53AM +0200, Yishai Hadas wrote: > On 10/01/2023 7:08, Matthew Wilcox wrote: > > On Mon, Jan 09, 2023 at 04:47:01PM +0200, Yishai Hadas wrote: > > > if (sgt_append->prv) { > > > + unsigned long paddr = > > > + (page_to_pfn(sg_page(sgt_append->prv)) * PAGE_SIZE + > > 1. page_to_pfn() * PAGE_SIZE is spelled page_to_phys() > > > > 2. physical addresses have type phys_addr_t. Oh, wait, paddr isn't a > > physical address, it's a pfn because you divide by PAGE_SIZE at the end. > > But you will get truncation on 32-bit, because page_to_pfn() has type > > unsigned long. Anyway, this shouldn't be called paddr. Maybe last_pfn > > or something? > > > > > + sgt_append->prv->offset + sgt_append->prv->length) / > > > + PAGE_SIZE; > > In this area of the patch I just reverted to what we had in 6.1 [1] where we > were good. > > I can send V1 and replace the 'paddr' to be called 'last_pfn' if it's really > needed. Please change it as Matthew describes so it is clearer Jason
On 10/01/2023 15:53, Jason Gunthorpe wrote: > On Tue, Jan 10, 2023 at 10:01:53AM +0200, Yishai Hadas wrote: >> On 10/01/2023 7:08, Matthew Wilcox wrote: >>> On Mon, Jan 09, 2023 at 04:47:01PM +0200, Yishai Hadas wrote: >>>> if (sgt_append->prv) { >>>> + unsigned long paddr = >>>> + (page_to_pfn(sg_page(sgt_append->prv)) * PAGE_SIZE + >>> 1. page_to_pfn() * PAGE_SIZE is spelled page_to_phys() >>> >>> 2. physical addresses have type phys_addr_t. Oh, wait, paddr isn't a >>> physical address, it's a pfn because you divide by PAGE_SIZE at the end. >>> But you will get truncation on 32-bit, because page_to_pfn() has type >>> unsigned long. Anyway, this shouldn't be called paddr. Maybe last_pfn >>> or something? >>> >>>> + sgt_append->prv->offset + sgt_append->prv->length) / >>>> + PAGE_SIZE; >> In this area of the patch I just reverted to what we had in 6.1 [1] where we >> were good. >> >> I can send V1 and replace the 'paddr' to be called 'last_pfn' if it's really >> needed. > Please change it as Matthew describes so it is clearer > > Jason OK Once cleaning the code and renaming to 'last_pfn', could also see that we had to use below '- 1' instead of '- PAGE_SIZE'. The expected diff compared to V0 can be seen below. Will repeat some testing and send V1 once be ready. +++ b/lib/scatterlist.c @@ -470,18 +470,16 @@ int sg_alloc_append_table_from_pages(struct sg_append_table *sgt_append, return -EOPNOTSUPP; if (sgt_append->prv) { - unsigned long paddr = - (page_to_pfn(sg_page(sgt_append->prv)) * PAGE_SIZE + - sgt_append->prv->offset + sgt_append->prv->length) / - PAGE_SIZE; + unsigned long last_pfn = (page_to_phys(sg_page(sgt_append->prv)) + + sgt_append->prv->offset + sgt_append->prv->length) / PAGE_SIZE; if (WARN_ON(offset)) return -EINVAL; /* Merge contiguous pages into the last SG */ prv_len = sgt_append->prv->length; - if (page_to_pfn(pages[0]) == paddr) { - last_pg = pfn_to_page(paddr - PAGE_SIZE); + if (page_to_pfn(pages[0]) == last_pfn) { + last_pg = pfn_to_page(last_pfn - 1); while (n_pages && pages_are_mergeable(pages[0], last_pg)) { if (sgt_append->prv->length + PAGE_SIZE > max_segment) break; Yishai
On Mon, 9 Jan 2023 20:18:39 -0700 Jens Axboe <axboe@kernel.dk> wrote: > On 1/9/23 7:47 AM, Yishai Hadas wrote: > > The last_pg is wrong, it is actually the first page of the last > > scatterlist element. To get the last page of the last scatterlist > > element we have to add prv->length. So it is checking mergability > > against the wrong page, Further, a SG element is not guaranteed to end > > on a page boundary, so we have to check the sub page location also for > > merge eligibility. > > > > Fix the above by checking physical contiguity, compute the actual last > > page and then call pages_are_mergable(). > > Reviewed-by: Jens Axboe <axboe@kernel.dk> > > Andrew, can you pick this one up? This patch is against Yishai's CommitDate: Thu Jan 5 16:01:05 2023 -0400 lib/scatterlist: Fix to merge contiguous pages into the last SG properly which is in -next, apparently via a tree of Jason's. So I'll assume that Jason will handleit?
On Tue, Jan 10, 2023 at 04:03:47PM -0800, Andrew Morton wrote: > On Mon, 9 Jan 2023 20:18:39 -0700 Jens Axboe <axboe@kernel.dk> wrote: > > > On 1/9/23 7:47 AM, Yishai Hadas wrote: > > > The last_pg is wrong, it is actually the first page of the last > > > scatterlist element. To get the last page of the last scatterlist > > > element we have to add prv->length. So it is checking mergability > > > against the wrong page, Further, a SG element is not guaranteed to end > > > on a page boundary, so we have to check the sub page location also for > > > merge eligibility. > > > > > > Fix the above by checking physical contiguity, compute the actual last > > > page and then call pages_are_mergable(). > > > > Reviewed-by: Jens Axboe <axboe@kernel.dk> > > > > Andrew, can you pick this one up? > > This patch is against Yishai's > > CommitDate: Thu Jan 5 16:01:05 2023 -0400 > > lib/scatterlist: Fix to merge contiguous pages into the last SG properly > > > which is in -next, apparently via a tree of Jason's. So I'll assume > that Jason will handleit? It is in v6.2-rc3 already, but sure I will take this too Jason
diff --git a/lib/scatterlist.c b/lib/scatterlist.c index f72aa50c6654..2377917893e7 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -470,22 +470,29 @@ int sg_alloc_append_table_from_pages(struct sg_append_table *sgt_append, return -EOPNOTSUPP; if (sgt_append->prv) { + unsigned long paddr = + (page_to_pfn(sg_page(sgt_append->prv)) * PAGE_SIZE + + sgt_append->prv->offset + sgt_append->prv->length) / + PAGE_SIZE; + if (WARN_ON(offset)) return -EINVAL; /* Merge contiguous pages into the last SG */ prv_len = sgt_append->prv->length; - last_pg = sg_page(sgt_append->prv); - while (n_pages && pages_are_mergeable(pages[0], last_pg)) { - if (sgt_append->prv->length + PAGE_SIZE > max_segment) - break; - sgt_append->prv->length += PAGE_SIZE; - last_pg = pages[0]; - pages++; - n_pages--; + if (page_to_pfn(pages[0]) == paddr) { + last_pg = pfn_to_page(paddr - PAGE_SIZE); + while (n_pages && pages_are_mergeable(pages[0], last_pg)) { + if (sgt_append->prv->length + PAGE_SIZE > max_segment) + break; + sgt_append->prv->length += PAGE_SIZE; + last_pg = pages[0]; + pages++; + n_pages--; + } + if (!n_pages) + goto out; } - if (!n_pages) - goto out; } /* compute number of contiguous chunks */