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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8CF38C71136 for ; Fri, 13 Jun 2025 18:09:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 26F0C6B007B; Fri, 13 Jun 2025 14:09:51 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 21F506B0089; Fri, 13 Jun 2025 14:09:51 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0E7E56B008A; Fri, 13 Jun 2025 14:09:51 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id E4CE26B007B for ; Fri, 13 Jun 2025 14:09:50 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 7E5BC80EE5 for ; Fri, 13 Jun 2025 18:09:50 +0000 (UTC) X-FDA: 83551165740.01.1F1A916 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf06.hostedemail.com (Postfix) with ESMTP id CA70D180014 for ; Fri, 13 Jun 2025 18:09:47 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=DaG7HVkK; dmarc=pass (policy=quarantine) header.from=redhat.com; spf=pass (imf06.hostedemail.com: domain of david@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=david@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1749838188; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=xXcFgixY4ZARJd9iDzBe662fiHU31V0lsCiirwehN0A=; b=Z1TWToJJehxyoUtOzR0yJA+OG1d4sXweAx/znc3fkt1R2ggmAd7B4k0ApbUQycVlrrwcev +bn+LmtRuagEzeT0pupDfsynTHDYcZz4C/xrwG47Ie6S6BjBXQ7B/2+Rv8ATot97o6ythk m9Z9QFm+L9S9Y2X3Bw1HtPleUSoUq78= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1749838188; a=rsa-sha256; cv=none; b=bMcnaJi0x6dO5RJX57GGF3UScB8CWQ6gSDy47Hpg+2Clx+0MKs6/ZOE97SFUV9bRxVH7DT DYV8ogxIqOx/207dF5VPwRZUMlufriEMD7lgoTJ5zlsRSFJtXLbfUq0/TmzqeL9C6q4tP/ s9q2a7NivmKljg+XLeff7UfOezdSGVo= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=DaG7HVkK; dmarc=pass (policy=quarantine) header.from=redhat.com; spf=pass (imf06.hostedemail.com: domain of david@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=david@redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1749838187; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=xXcFgixY4ZARJd9iDzBe662fiHU31V0lsCiirwehN0A=; b=DaG7HVkKs1W6k6ZuCB+fEChkmhZQoJBHfanfEDYNpX6+sibjVtFdKaxlIVL5l0IPXfjKiq inP3XnEpKVmTPpUbX/TsGW7sM90xzoIlzE5ntiwETd+ktbh6q4qvBVUtB3OXctY4RbpVbw MYI1+xRjoeX5EK4w/w/kRu8ZiE0KSPY= Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-551-CdDztfrBM02oXBzR6PljMQ-1; Fri, 13 Jun 2025 14:09:45 -0400 X-MC-Unique: CdDztfrBM02oXBzR6PljMQ-1 X-Mimecast-MFC-AGG-ID: CdDztfrBM02oXBzR6PljMQ_1749838185 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-3a4eb9c80deso1155624f8f.0 for ; Fri, 13 Jun 2025 11:09:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749838184; x=1750442984; h=content-transfer-encoding:in-reply-to:organization:autocrypt :content-language:from:references:cc:to:subject:user-agent :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=xXcFgixY4ZARJd9iDzBe662fiHU31V0lsCiirwehN0A=; b=b9oPq7BzODvCptx3HhpUPv4hqQATuPK4961rJGn+AcNGU7vIfBzZQYIaW2DqqOP4ff fNXM/eVZ6DcxBTIiAm9U6GsIGyR+IT9BS6SvXU+Ku67H7WIjNTLU8Gi83UePz2EBEX03 jEnlK12ojwLpPM+5sgJpiR84T3rn7V9WTgyXbGmcV9f+dK7ubzxyApxQtUeNwGWsM/JF dwFKwQW525u8S3I6bX/aRc+249Ns+s2G0ShpvkdomM+WcozQeojyBGLf0wgB7uGIfADf Sygr6nNGjixeri8fiZKM0GJM1VYAENpJ4KaCC26xyuBG/MvvGucIoTqjUH3FZdhm5Ki5 A7hQ== X-Forwarded-Encrypted: i=1; AJvYcCVivDXn9xCXFgmYEHRmHr8IG1tCuvfNaPjvjMjtBX2XfYK5+5kM16yKBr0HF/zAgTDVa3fuFoHYtA==@kvack.org X-Gm-Message-State: AOJu0Yyypl+kDna4t6XSyAjAwzTYlJBQMXADHdRNJBM4QuLlhYwailyr /JEu7u6eFJfgS8Xqa7ETCqPx8B0BTJiMAGKwqcSFopvJkpOpxzfMrIf1AtAXQUpUS5DD8xq+ZKg 0RqZLazZQNMn5N+k1wUGuzu1Zml6yzYzgzdfT2Z/xWZf5DRIzIahd X-Gm-Gg: ASbGnctNzwuEuoqitnZY2r0KpKxmLyCVWylxqH5tTCNsYKkGLE0fDCa9+3P8uPAr6U6 lFb/ceBpgUYsINpM//v/ycj9757glp4DdjQZTeZvSz64GBBAuzL2GghsJcC2EHC7J1/AKd4CTmR bN5Bb3tdYS9fgb6KYdKQsPqBOmt29e4mF4cDzoeo+qN2abvIivt3S7716togqDOJ9yEK/+ostPM qj19MWOKAQXxrD0kZn0bu+6/YKltizKS/59DFnqc1PphGWN0njwQNWhdFvyHeA2qCgPgE3L5xdB IfbqZdP7WQS3j0dzogpzm6mdbyWPTZMEcEEbzgghkvJ2nbgO8VZeuWjroAZfLA/jl1jVWZnfXdE EeEAGj2RQE0Aqf9dmASatx0fGn+z9lPRmHGtVPEd+xvXCz92Ryg== X-Received: by 2002:a05:6000:2486:b0:3a4:ef30:a4c8 with SMTP id ffacd0b85a97d-3a572399103mr813380f8f.10.1749838184502; Fri, 13 Jun 2025 11:09:44 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEzERlz95am9fonq/srpc4ADnlYUlo09Tj6R4QtVRm3hJDLhOgIqByYURXlt/BU6Q/uO4KIjw== X-Received: by 2002:a05:6000:2486:b0:3a4:ef30:a4c8 with SMTP id ffacd0b85a97d-3a572399103mr813343f8f.10.1749838184028; Fri, 13 Jun 2025 11:09:44 -0700 (PDT) Received: from ?IPV6:2003:d8:2f1a:3700:2982:b5f7:a04e:4cb4? (p200300d82f1a37002982b5f7a04e4cb4.dip0.t-ipconnect.de. [2003:d8:2f1a:3700:2982:b5f7:a04e:4cb4]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4532e256b95sm60924015e9.30.2025.06.13.11.09.42 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 13 Jun 2025 11:09:43 -0700 (PDT) Message-ID: Date: Fri, 13 Jun 2025 20:09:41 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 5/5] vfio-pci: Best-effort huge pfnmaps with !MAP_FIXED mappings To: Peter Xu , linux-kernel@vger.kernel.org, linux-mm@kvack.org, kvm@vger.kernel.org Cc: Andrew Morton , Alex Williamson , Zi Yan , Jason Gunthorpe , Alex Mastro , Nico Pache References: <20250613134111.469884-1-peterx@redhat.com> <20250613134111.469884-6-peterx@redhat.com> From: David Hildenbrand Autocrypt: addr=david@redhat.com; keydata= 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 WNyWQQ== Organization: Red Hat In-Reply-To: <20250613134111.469884-6-peterx@redhat.com> X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 5uNCZDsGwvnYTVvAmcU7av1h5j133Nx8g2fCVravVyI_1749838185 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: CA70D180014 X-Stat-Signature: 7qhp416bj98k63wer9essbk47xcyr7hc X-Rspam-User: X-HE-Tag: 1749838187-40480 X-HE-Meta: U2FsdGVkX1+bmm2FmC23JCPa0DzCYU1SdOYDSfATFWKwbf8iDI8PfEJKJScp41tcMayllU//A1y+Dh6gRnR8sziPZK/ywHGS/t7IRZAi6ce8OXCpsV0nmIXSZKpneh67tkdqf8KerIeK6wt5wZLOziCsESc4k+leBHvYcuRG8wJbVpdroMHSfW6X5zHuP60jxAiOMgoxH86CtRQMvjRTrvJdXaWO/F2X8P6qRdPLsxzuBiWXElmrXj/d1QTwAk6GyOF8XHJIJT2/Q6ZD2Sge+sVrVZA4HSExLevsA9Ld0oduNZvhALdWXid6kpTdpWrtEqgyhdN2aXunb1lCglPnK5IAoY95aMTczOZlEKsOoHcIOnHgEtHYlqcpp291I6YHYJhDP4G1Yr8/PEmyMNbp2iwYxDkyY9eY/PRPnThxoJZcuCteEUTPAj9T+mXB8/21+kM4CljpXQ925SOfOOBS6o+Ogb36ecOyR5FAcJOqPWuieYU7dEuF4UxKHOKn2tkphtAy695fT/DYGAcKNDtHgBkBfcM25uOMEaU62zv0KGdoAIPNAzCAn4Ruf66mnmiScWsiKVgGo87q5ezaUxSsieJH21HtzwOUIDVD2xpFWRCBf3NOvR7y8q3RWs+RNIepRW5QAp8275gMAIbIKc9I1xL7ztzOt3rVAZQJSAezJCdK/IDI1t2XHoZkz84zcSrTCNg1tirdMZlRiJD1vreAkVjsQgHwNRFon+dz4mcaGpWIfns99zxQNlwanLiNhf5zZ5JT2eawD/R/GxQVo+4HUDo2AzoXBAeHk+e1sgFiUUyWqjyrlxiAuKkTleTQQ0n2nZWbZ46WPHIZrpTAovCrt2EY58aDa0K2jAfcDKAJ94TPK99IapzRiRUnVaa76uvcEwVJ7vJfxgehlqthhK5SH4akahNeF9iBdSgzpMftUMfduFXBxsfQuTyAVFRA3Latjs+e/mGdYOoSnPBQlAH XrfSjHBU qbPJS3a1vdzI5Q7uMvKf+2Xt40FypFzb3PPw1AgOGYgU/L3KtlFGkLyPRWTy5z2Yjm4mi/x49QbiTWje2K5I/cmUoaubeocCbUa3jtpf0y+CDtOVJtUrpZAdIpI53qconsB0BL4T7i06dnT9xRDMSHpl2TGgNd0FDkw0XDYMVz73sLTSCxuDP1uw263u09dhcJaLoBp34NPDCJnbl85S7tqiDK6578g0QbqFCLBD2eFCszzlswlSxjJGXYA1MXcnQFzxCU/mQWwaOcUk/DMYqr3GmgF187/BS5sk0fZu9mxH7g7rzHMmxYkjAQ1NQ4S2YLQE1FcP1yEp79DPnyPmQXgD+O2mPkJ2h+7MWMZjHlKRW3//pxt0m1xKqoKXxj2mRuZWXJMBuPh3WoUcdFwDqx9Dm+TLWH+dx61Wp105VISflGh5gQObPXhX7uJqQ5+YGIz7PF+cCT8AOloUru3eZlv1paTMJJEK63ffQb7Xf0Bh4F03yt0KfIy9JPMaMYDIgmx2lp5v+//nrXhxE2vG5KpHHQBGT7rSVTqnxQw9RSB0EgiJajnZj315pSTXaLWEaliMw59ic0/cwpgmc9I2eRl2zxii6Jq+dCx8jCq1q8KlWBLHr1CH6BdHKm+P3GiCV9hSD 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: List-Subscribe: List-Unsubscribe: On 13.06.25 15:41, Peter Xu wrote: > This patch enables best-effort mmap() for vfio-pci bars even without > MAP_FIXED, so as to utilize huge pfnmaps as much as possible. It should > also avoid userspace changes (switching to MAP_FIXED with pre-aligned VA > addresses) to start enabling huge pfnmaps on VFIO bars. > > Here the trick is making sure the MMIO PFNs will be aligned with the VAs > allocated from mmap() when !MAP_FIXED, so that whatever returned from > mmap(!MAP_FIXED) of vfio-pci MMIO regions will be automatically suitable > for huge pfnmaps as much as possible. > > To achieve that, a custom vfio_device's get_unmapped_area() for vfio-pci > devices is needed. > > Note that MMIO physical addresses should normally be guaranteed to be > always bar-size aligned, hence the bar offset can logically be directly > used to do the calculation. However to make it strict and clear (rather > than relying on spec details), we still try to fetch the bar's physical > addresses from pci_dev.resource[]. > > Signed-off-by: Alex Williamson There is likely a Co-developed-by: Alex Williamson missing? > Signed-off-by: Peter Xu > --- > drivers/vfio/pci/vfio_pci.c | 3 ++ > drivers/vfio/pci/vfio_pci_core.c | 65 ++++++++++++++++++++++++++++++++ > include/linux/vfio_pci_core.h | 6 +++ > 3 files changed, 74 insertions(+) > > diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c > index 5ba39f7623bb..d9ae6cdbea28 100644 > --- a/drivers/vfio/pci/vfio_pci.c > +++ b/drivers/vfio/pci/vfio_pci.c > @@ -144,6 +144,9 @@ static const struct vfio_device_ops vfio_pci_ops = { > .detach_ioas = vfio_iommufd_physical_detach_ioas, > .pasid_attach_ioas = vfio_iommufd_physical_pasid_attach_ioas, > .pasid_detach_ioas = vfio_iommufd_physical_pasid_detach_ioas, > +#ifdef CONFIG_ARCH_SUPPORTS_HUGE_PFNMAP > + .get_unmapped_area = vfio_pci_core_get_unmapped_area, > +#endif > }; > > static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) > diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c > index 6328c3a05bcd..835bc168f8b7 100644 > --- a/drivers/vfio/pci/vfio_pci_core.c > +++ b/drivers/vfio/pci/vfio_pci_core.c > @@ -1641,6 +1641,71 @@ static unsigned long vma_to_pfn(struct vm_area_struct *vma) > return (pci_resource_start(vdev->pdev, index) >> PAGE_SHIFT) + pgoff; > } > > +#ifdef CONFIG_ARCH_SUPPORTS_HUGE_PFNMAP > +/* > + * Hint function to provide mmap() virtual address candidate so as to be > + * able to map huge pfnmaps as much as possible. It is done by aligning > + * the VA to the PFN to be mapped in the specific bar. > + * > + * Note that this function does the minimum check on mmap() parameters to > + * make the PFN calculation valid only. The majority of mmap() sanity check > + * will be done later in mmap(). > + */ > +unsigned long vfio_pci_core_get_unmapped_area(struct vfio_device *device, > + struct file *file, > + unsigned long addr, > + unsigned long len, > + unsigned long pgoff, > + unsigned long flags) A very suboptimal way to indent this many parameters; just use two tabs at the beginning. > +{ > + struct vfio_pci_core_device *vdev = > + container_of(device, struct vfio_pci_core_device, vdev); > + struct pci_dev *pdev = vdev->pdev; > + unsigned long ret, phys_len, req_start, phys_addr; > + unsigned int index; > + > + index = pgoff >> (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT); Could do unsigned int index = pgoff >> (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT); at the very top. > + > + /* Currently, only bars 0-5 supports huge pfnmap */ > + if (index >= VFIO_PCI_ROM_REGION_INDEX) > + goto fallback; > + > + /* Bar offset */ > + req_start = (pgoff << PAGE_SHIFT) & ((1UL << VFIO_PCI_OFFSET_SHIFT) - 1); > + phys_len = PAGE_ALIGN(pci_resource_len(pdev, index)); > + > + /* > + * Make sure we at least can get a valid physical address to do the > + * math. If this happens, it will probably fail mmap() later.. > + */ > + if (req_start >= phys_len) > + goto fallback; > + > + phys_len = MIN(phys_len, len); > + /* Calculate the start of physical address to be mapped */ > + phys_addr = pci_resource_start(pdev, index) + req_start; > + > + /* Choose the alignment */ > + if (IS_ENABLED(CONFIG_ARCH_SUPPORTS_PUD_PFNMAP) && phys_len >= PUD_SIZE) { > + ret = mm_get_unmapped_area_aligned(file, addr, len, phys_addr, > + flags, PUD_SIZE, 0); > + if (ret) > + return ret; > + } > + > + if (phys_len >= PMD_SIZE) { > + ret = mm_get_unmapped_area_aligned(file, addr, len, phys_addr, > + flags, PMD_SIZE, 0); > + if (ret) > + return ret; Similar to Jason, I wonder if that logic should reside in the core, and we only indicate the maximum page table level we support. unsigned int order) > { > diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h > index fbb472dd99b3..e59699e01901 100644 > --- a/include/linux/vfio_pci_core.h > +++ b/include/linux/vfio_pci_core.h > @@ -119,6 +119,12 @@ ssize_t vfio_pci_core_read(struct vfio_device *core_vdev, char __user *buf, > size_t count, loff_t *ppos); > ssize_t vfio_pci_core_write(struct vfio_device *core_vdev, const char __user *buf, > size_t count, loff_t *ppos); > +unsigned long vfio_pci_core_get_unmapped_area(struct vfio_device *device, > + struct file *file, > + unsigned long addr, > + unsigned long len, > + unsigned long pgoff, > + unsigned long flags); Dito. -- Cheers, David / dhildenb