Message ID | 20240115211516.635852-3-ankita@nvidia.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel+bounces-26496-ouuuleilei=gmail.com@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:693c:2614:b0:101:6a76:bbe3 with SMTP id mm20csp1949645dyc; Mon, 15 Jan 2024 13:17:05 -0800 (PST) X-Google-Smtp-Source: AGHT+IGGugCVHgscEV/Xc91upKUvbOrebCwj0pmtbPytiOg0XSpZeFs4ahh7OnZx4B1KMm43ZENi X-Received: by 2002:a17:90a:be16:b0:28b:f0b8:8528 with SMTP id a22-20020a17090abe1600b0028bf0b88528mr11235551pjs.45.1705353425311; Mon, 15 Jan 2024 13:17:05 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705353425; cv=pass; d=google.com; s=arc-20160816; b=IlFCC4n9zrhc4oA2kw3BPtq8HS2K4gfibUxJ3Tb2YDBQADPcsMfW0GAHRUVrs2UiGv BTcvEEYqpWZM5x2CmLPO7LQhePvBpQcpFlUftEggFmVE4424pUbA817st7Rzb9R4U6Ri gYY+P9TftIWwKo90gEz+8/uYsMxS1KHVYTnAnPieu7/qtkwa0CCadtSI+RXvygav9sTy tyseNmErBPf+H3M+hk4dZmuQAQtkeq621PFxriLfKzDhCmt/XUoFIZKeZP47TIp3tyhv 4RM8cK3gRYqCbwO1nmk/mkSB1UHYAtllu3hZwj4FqXkiXYqiWEz5oVcC2nMTcaulM4Bv fNLw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=YBXigad1j16HA0qtnl6WIqZKuEx8RaTrjlqP4/uEuqI=; fh=okAJpS8zt093FWCMH7QblaenZCNhv8qEmAYRg8XtHs8=; b=hFfsmYeWCEA0k8n++T/rnyOXh6n1faEnA75UeFyY/9zjDioTIedc6sLftbrSworwju rdauncbkY+4Qt/94eRP8FjQ01oeUmPQJT1USsdEMdChGKV/hy0jD0R2MkJjVLwRLB8m4 oiihRLUcWUx/0yfG+fgIEuPF25yfPYTx7I4kdw/mdJc+iMDVzOqsBW26cFHSwpCADqPr PeuIrkRFnc0JaL2SlUe3zpog7gvrLdL1pWxZD+6+0sIpRuDc1Rxu9XuJ/vV0P7NB+oRy PLNFRFzQDXErsnbgBQo+88cbASdSUwSwP+d7zoIZ3+J7oZ0SLJzxIWOFf9i8DaeFRAzs ZaQg== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@Nvidia.com header.s=selector2 header.b=tNQh7mdk; arc=pass (i=1 spf=pass spfdomain=nvidia.com dmarc=pass fromdomain=nvidia.com); spf=pass (google.com: domain of linux-kernel+bounces-26496-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-26496-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=nvidia.com Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [147.75.48.161]) by mx.google.com with ESMTPS id ds1-20020a17090b08c100b0028bc0991858si12040012pjb.165.2024.01.15.13.17.04 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Jan 2024 13:17:05 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-26496-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) client-ip=147.75.48.161; Authentication-Results: mx.google.com; dkim=pass header.i=@Nvidia.com header.s=selector2 header.b=tNQh7mdk; arc=pass (i=1 spf=pass spfdomain=nvidia.com dmarc=pass fromdomain=nvidia.com); spf=pass (google.com: domain of linux-kernel+bounces-26496-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-26496-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=nvidia.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 7DC40B2200F for <ouuuleilei@gmail.com>; Mon, 15 Jan 2024 21:16:56 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5995B1B812; Mon, 15 Jan 2024 21:15:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="tNQh7mdk" Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2040.outbound.protection.outlook.com [40.107.236.40]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 01D361B5AA; Mon, 15 Jan 2024 21:15:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=E6BJHrR9kLm1+IwEzN2OlFltf8P8QxMi3C4B/L7F32HslpdVFR1FdBPCUzlMHvpog1gh01fw6FpfOAWd+aVWZ+bUtCDpUfcrm7HCCcUiM/6JlJeWcF7YiT1zgW+jg5OlFYNTRfeUYwqHgjASCW5E06xkd4coghrzRAQRaLLeHwH+iGJYl8+GNbjs0fdyvcaa5X8hQCY+lx59cqU8sAfOeTAHsz7PzhgzMBKKoaW2cmxQxQ22v59QXoPzOYcwYbu/B6Sri1z2qEEBSe9wciUFgmFiLDnyqvMZl3QaJdxOzZ+Jw+gyRqKkqELf3MXfVH44uewtV47DXuOwXmF5Qnma7w== 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=YBXigad1j16HA0qtnl6WIqZKuEx8RaTrjlqP4/uEuqI=; b=IstpIIIEv632iQrwEvK6pj4/VFHA7N1DmhqyBzQjf/pSD3Cx4NFiZW+8fBhEHOwdUZlP7EEqIIEQNxUL47yR5Jt3JkhB5pQCz0ZxO9f7+Y6IiFRvmooDeWavERZBZuc9SzK0mfmb5AF44MopfoEzOgqXxqcp8b9q3Cd2A4qS6pedizF5Z1RHjb7ylCe47wza1WpVMeY0feMjSnHEALSORkNIWJdAlkBR+I7joF3XHUPhG7EOW7ZvrkJhCZO6a81dH7VeRB9vrJdKZfsT+1Iq0BtOITb3HMm7XcH13AiZikCUnc+7wZF1iHdJCqpRBSClKrqypHdP35NIAIYJTlpnAQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=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 (0) 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=YBXigad1j16HA0qtnl6WIqZKuEx8RaTrjlqP4/uEuqI=; b=tNQh7mdkHYMsvGSWzyfoRWzX+rwmrf0gj67X+rC7UqKj7Bb/KSdBpLb9I6n330HXFH6j3ZOMk8+FeG+v+xPSoy7otRQB1hmh6owBA6Qro5q5w4zJ72zrtZnpIMafU4TQj0vOP0aaqqPdW5S+YzaUWZ8w5HuAb9BIGMFvoqTEzN6rIF2crVyAuiLyrNTqt5ogNyxZenTxtUtTsyePtFDg0EOhENEoGI/ep8ZJytg8usMesnhtB2V9VmoWvleX/TX5eqgmBrPE53AYpOLPHzDo+L2dMEAF/vy2YqDi9Q1u8nJJIMfVzFr+OMV3qj1esJv659Yg3tgCBUSXM+O6LWIyUw== Received: from PH8PR07CA0025.namprd07.prod.outlook.com (2603:10b6:510:2cf::13) by DM6PR12MB5520.namprd12.prod.outlook.com (2603:10b6:5:208::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7181.23; Mon, 15 Jan 2024 21:15:39 +0000 Received: from SN1PEPF0002BA4D.namprd03.prod.outlook.com (2603:10b6:510:2cf:cafe::67) by PH8PR07CA0025.outlook.office365.com (2603:10b6:510:2cf::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7181.26 via Frontend Transport; Mon, 15 Jan 2024 21:15:39 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) 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.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by SN1PEPF0002BA4D.mail.protection.outlook.com (10.167.242.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.16 via Frontend Transport; Mon, 15 Jan 2024 21:15:38 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Mon, 15 Jan 2024 13:15:19 -0800 Received: from rnnvmail201.nvidia.com (10.129.68.8) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Mon, 15 Jan 2024 13:15:18 -0800 Received: from localhost.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41 via Frontend Transport; Mon, 15 Jan 2024 13:15:18 -0800 From: <ankita@nvidia.com> To: <ankita@nvidia.com>, <jgg@nvidia.com>, <alex.williamson@redhat.com>, <yishaih@nvidia.com>, <shameerali.kolothum.thodi@huawei.com>, <kevin.tian@intel.com>, <eric.auger@redhat.com>, <brett.creeley@amd.com>, <horms@kernel.org> CC: <aniketa@nvidia.com>, <cjia@nvidia.com>, <kwankhede@nvidia.com>, <targupta@nvidia.com>, <vsethi@nvidia.com>, <acurrid@nvidia.com>, <apopple@nvidia.com>, <jhubbard@nvidia.com>, <danw@nvidia.com>, <anuaggarwal@nvidia.com>, <mochs@nvidia.com>, <kvm@vger.kernel.org>, <linux-kernel@vger.kernel.org> Subject: [PATCH v16 2/3] vfio/pci: implement range_intesect_range to determine range overlap Date: Mon, 15 Jan 2024 21:15:15 +0000 Message-ID: <20240115211516.635852-3-ankita@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240115211516.635852-1-ankita@nvidia.com> References: <20240115211516.635852-1-ankita@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: <linux-kernel.vger.kernel.org> List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org> List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF0002BA4D:EE_|DM6PR12MB5520:EE_ X-MS-Office365-Filtering-Correlation-Id: 90f5d222-8c0e-416c-40a9-08dc160f1fa8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: d4fM4B3MvKqHbRaTcfq1h2bqLRmqabqLnJp4i6BPq59cyi2tLqaUqjCSBnSMtai4tRSDafHVkE5zVGkg3n8fFhjU2IM0xH2K70Rnco00FmXWY5HQJK1lP7KA/kaaJ24/+vZNXywnGW/MlpvlNGaK6klZbpHcZQRpHI6QoZys9aiJ5vRpai1t8eSz7EGpUOVHaNPpjUZY2XI8AcuV3Svu11sCIX9lzkn4efxZ49zpXlBHICOln15bLox+w+FX5YJidhxcE7Exz1R+tHKfBpHHaij8RkEbN567p7VJsUBlck7D3EyxEK4IzhnKyuZzStJaU1JpvfzZWh6m6ub9tF2E8pnEAjY1aorA9RaurBKqYM4KdKtuzkw8f+77ajt2UwCYnFvKHAFD0f9/pZE4Y37zfeNLZnzJxfsxIMi2ifWKuEVWGbhsuOa5rrrgSlHbnR+cQWMSQERhQ+WyEvWlyi+w1VmZdDlyzPy/v3RlcK2r+kaz1UAIzcN9lEYG4dEgh1hKQc5C1Vu7rLI2LQzw37dEHEvZ5rRb0053v58wbW0UjzO51x2OlU9qXkT5j7HOCP3vWDF6Xx2nMrji2ID2/rwA2Ef+vb3JshmmHJlMG8B4zRhYLHddjVi+PnU8UE7HLW3emyRShMFUvJvtcPVU82VmBhe+m8HDRz5bTaz28v2SNvCQaj8pYMUI07KTK9nL44IrV0kckxO9Jrdoenu19BFrER3aZss9LEpKAQMPQjZXRZ2DLl13S5XH1EOdR3mCxZajlAiIwiWPOao1qhdctqmq4vK2RrDYhS10WxnYFgeRA4M= X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230031)(4636009)(346002)(396003)(136003)(376002)(39860400002)(230922051799003)(1800799012)(82310400011)(451199024)(64100799003)(186009)(46966006)(40470700004)(36840700001)(54906003)(8936002)(316002)(110136005)(8676002)(966005)(5660300002)(478600001)(7696005)(2906002)(40460700003)(6666004)(40480700001)(2876002)(70586007)(2616005)(26005)(36756003)(1076003)(47076005)(336012)(426003)(83380400001)(4326008)(70206006)(36860700001)(41300700001)(82740400003)(356005)(7636003)(86362001);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Jan 2024 21:15:38.9802 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 90f5d222-8c0e-416c-40a9-08dc160f1fa8 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF0002BA4D.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB5520 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788192673381815137 X-GMAIL-MSGID: 1788192673381815137 |
Series |
vfio/nvgrace-gpu: Add vfio pci variant module for grace hopper
|
|
Commit Message
Ankit Agrawal
Jan. 15, 2024, 9:15 p.m. UTC
From: Ankit Agrawal <ankita@nvidia.com> Add a helper function to determine an overlap between two ranges. If an overlap, the function returns the overlapping offset and size. The VFIO PCI variant driver emulates the PCI config space BAR offset registers. These offset may be accessed for read/write with a variety of lengths including sub-word sizes from sub-word offsets. The driver makes use of this helper function to read/write the targeted part of the emulated register. This is replicated from Yishai's work in https://lore.kernel.org/all/20231207102820.74820-10-yishaih@nvidia.com Signed-off-by: Ankit Agrawal <ankita@nvidia.com> Tested-by: Ankit Agrawal <ankita@nvidia.com> --- drivers/vfio/pci/vfio_pci_config.c | 28 ++++++++++++++++++++++++++++ include/linux/vfio_pci_core.h | 6 ++++++ 2 files changed, 34 insertions(+)
Comments
On Mon, 15 Jan, 2024 21:15:15 +0000 <ankita@nvidia.com> wrote: > From: Ankit Agrawal <ankita@nvidia.com> > > Add a helper function to determine an overlap between two ranges. > If an overlap, the function returns the overlapping offset and size. > > The VFIO PCI variant driver emulates the PCI config space BAR offset > registers. These offset may be accessed for read/write with a variety > of lengths including sub-word sizes from sub-word offsets. The driver > makes use of this helper function to read/write the targeted part of > the emulated register. > > This is replicated from Yishai's work in > https://lore.kernel.org/all/20231207102820.74820-10-yishaih@nvidia.com > > Signed-off-by: Ankit Agrawal <ankita@nvidia.com> > Tested-by: Ankit Agrawal <ankita@nvidia.com> > --- > drivers/vfio/pci/vfio_pci_config.c | 28 ++++++++++++++++++++++++++++ > include/linux/vfio_pci_core.h | 6 ++++++ > 2 files changed, 34 insertions(+) > > diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c > index 7e2e62ab0869..b77c96fbc4b2 100644 > --- a/drivers/vfio/pci/vfio_pci_config.c > +++ b/drivers/vfio/pci/vfio_pci_config.c > @@ -1966,3 +1966,31 @@ ssize_t vfio_pci_config_rw(struct vfio_pci_core_device *vdev, char __user *buf, > > return done; > } > + > +bool range_intersect_range(loff_t range1_start, size_t count1, > + loff_t range2_start, size_t count2, > + loff_t *start_offset, > + size_t *intersect_count, > + size_t *register_offset) > +{ > + if (range1_start <= range2_start && > + range1_start + count1 > range2_start) { > + *start_offset = range2_start - range1_start; > + *intersect_count = min_t(size_t, count2, > + range1_start + count1 - range2_start); > + *register_offset = 0; > + return true; > + } > + > + if (range1_start > range2_start && > + range1_start < range2_start + count2) { > + *start_offset = 0; > + *intersect_count = min_t(size_t, count1, > + range2_start + count2 - range1_start); > + *register_offset = range1_start - range2_start; > + return true; > + } > + > + return false; > +} > +EXPORT_SYMBOL_GPL(range_intersect_range); If this function is being exported, shouldn't the function name follow the pattern of having the vfio_pci_core_* prefix like the rest of the symbols exported in this file. Something like vfio_pci_core_range_intersect_range? -- Thanks, Rahul Rameshbabu
>> +} >> +EXPORT_SYMBOL_GPL(range_intersect_range); > > If this function is being exported, shouldn't the function name follow > the pattern of having the vfio_pci_core_* prefix like the rest of the > symbols exported in this file. Something like > vfio_pci_core_range_intersect_range? Yes, that would be apt. Will make the change.
On Mon, 15 Jan 2024 21:15:15 +0000 <ankita@nvidia.com> wrote: > From: Ankit Agrawal <ankita@nvidia.com> > > Add a helper function to determine an overlap between two ranges. > If an overlap, the function returns the overlapping offset and size. > > The VFIO PCI variant driver emulates the PCI config space BAR offset > registers. These offset may be accessed for read/write with a variety > of lengths including sub-word sizes from sub-word offsets. The driver > makes use of this helper function to read/write the targeted part of > the emulated register. > > This is replicated from Yishai's work in > https://lore.kernel.org/all/20231207102820.74820-10-yishaih@nvidia.com The virtio-vfio-net changes have been accepted, so this will need to be rebased on the vfio next branch or v6.8-rc1 when Linus comes back online to process the pull request. The revised patch should consolidate so that virtio-vfio-pci also uses the new shared function. As noted by Rahul, the name should be updated to align with the vfio-pci-core namespace. Kerneldoc would also be a nice addition since this is a somewhat complicated helper. Thanks, Alex > Signed-off-by: Ankit Agrawal <ankita@nvidia.com> > Tested-by: Ankit Agrawal <ankita@nvidia.com> > --- > drivers/vfio/pci/vfio_pci_config.c | 28 ++++++++++++++++++++++++++++ > include/linux/vfio_pci_core.h | 6 ++++++ > 2 files changed, 34 insertions(+) > > diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c > index 7e2e62ab0869..b77c96fbc4b2 100644 > --- a/drivers/vfio/pci/vfio_pci_config.c > +++ b/drivers/vfio/pci/vfio_pci_config.c > @@ -1966,3 +1966,31 @@ ssize_t vfio_pci_config_rw(struct vfio_pci_core_device *vdev, char __user *buf, > > return done; > } > + > +bool range_intersect_range(loff_t range1_start, size_t count1, > + loff_t range2_start, size_t count2, > + loff_t *start_offset, > + size_t *intersect_count, > + size_t *register_offset) > +{ > + if (range1_start <= range2_start && > + range1_start + count1 > range2_start) { > + *start_offset = range2_start - range1_start; > + *intersect_count = min_t(size_t, count2, > + range1_start + count1 - range2_start); > + *register_offset = 0; > + return true; > + } > + > + if (range1_start > range2_start && > + range1_start < range2_start + count2) { > + *start_offset = 0; > + *intersect_count = min_t(size_t, count1, > + range2_start + count2 - range1_start); > + *register_offset = range1_start - range2_start; > + return true; > + } > + > + return false; > +} > +EXPORT_SYMBOL_GPL(range_intersect_range); > diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h > index d478e6f1be02..8a11047ac6c9 100644 > --- a/include/linux/vfio_pci_core.h > +++ b/include/linux/vfio_pci_core.h > @@ -133,4 +133,10 @@ ssize_t vfio_pci_core_do_io_rw(struct vfio_pci_core_device *vdev, bool test_mem, > void __iomem *io, char __user *buf, > loff_t off, size_t count, size_t x_start, > size_t x_end, bool iswrite); > + > +bool range_intersect_range(loff_t range1_start, size_t count1, > + loff_t range2_start, size_t count2, > + loff_t *start_offset, > + size_t *intersect_count, > + size_t *register_offset); > #endif /* VFIO_PCI_CORE_H */
>> Add a helper function to determine an overlap between two ranges. >> If an overlap, the function returns the overlapping offset and size. >> >> The VFIO PCI variant driver emulates the PCI config space BAR offset >> registers. These offset may be accessed for read/write with a variety >> of lengths including sub-word sizes from sub-word offsets. The driver >> makes use of this helper function to read/write the targeted part of >> the emulated register. >> >> This is replicated from Yishai's work in >> https://lore.kernel.org/all/20231207102820.74820-10-yishaih@nvidia.com > > The virtio-vfio-net changes have been accepted, so this will need to be > rebased on the vfio next branch or v6.8-rc1 when Linus comes back > online to process the pull request. The revised patch should > consolidate so that virtio-vfio-pci also uses the new shared function. Thanks for pointing that out. I'll rebase it with v6.8-rc1. > As noted by Rahul, the name should be updated to align with the > vfio-pci-core namespace. Kerneldoc would also be a nice addition since > this is a somewhat complicated helper. Thanks, Ack.
diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c index 7e2e62ab0869..b77c96fbc4b2 100644 --- a/drivers/vfio/pci/vfio_pci_config.c +++ b/drivers/vfio/pci/vfio_pci_config.c @@ -1966,3 +1966,31 @@ ssize_t vfio_pci_config_rw(struct vfio_pci_core_device *vdev, char __user *buf, return done; } + +bool range_intersect_range(loff_t range1_start, size_t count1, + loff_t range2_start, size_t count2, + loff_t *start_offset, + size_t *intersect_count, + size_t *register_offset) +{ + if (range1_start <= range2_start && + range1_start + count1 > range2_start) { + *start_offset = range2_start - range1_start; + *intersect_count = min_t(size_t, count2, + range1_start + count1 - range2_start); + *register_offset = 0; + return true; + } + + if (range1_start > range2_start && + range1_start < range2_start + count2) { + *start_offset = 0; + *intersect_count = min_t(size_t, count1, + range2_start + count2 - range1_start); + *register_offset = range1_start - range2_start; + return true; + } + + return false; +} +EXPORT_SYMBOL_GPL(range_intersect_range); diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h index d478e6f1be02..8a11047ac6c9 100644 --- a/include/linux/vfio_pci_core.h +++ b/include/linux/vfio_pci_core.h @@ -133,4 +133,10 @@ ssize_t vfio_pci_core_do_io_rw(struct vfio_pci_core_device *vdev, bool test_mem, void __iomem *io, char __user *buf, loff_t off, size_t count, size_t x_start, size_t x_end, bool iswrite); + +bool range_intersect_range(loff_t range1_start, size_t count1, + loff_t range2_start, size_t count2, + loff_t *start_offset, + size_t *intersect_count, + size_t *register_offset); #endif /* VFIO_PCI_CORE_H */