[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/2] make ioremap_attr() common


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Thu, 2 Apr 2026 14:15:19 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=Wc8pq1IrTylV6Ip5xEgF/nhMeWw+c6NQxoQbG71vexY=; b=uhd6tV5uEFUeBCKr3BOOb9Gbhg9uA+7DwoT4jJOvFCW1vlsyl9vKhgiaLg+KknIbpEwYkYcDYs3gh1DCCPhyBl/4zJYZvo4QBEvmc2xW2hVKJKSCyzenbWhRMRwd5RjOdrgE2grg5BjA4eE19xHl6H6FRnB7ZQvnf+QaykP8IcmJrlN7b4PnPhQFsjZljG46RY1vQuu4ji5Mdqqa5v//5c4ARpJbKEoI8s5yhPUYfYplq7DUkmEfmlqvnXHVZ8S1K9s+jc1mJKgxPdOYIo0unzhe/3+jE414akwQaDyZVv69uocOpjN9l1Hv51kJyupgG7NCCsWmEYo/pkvZKnD4lA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IRe/2umaq4cy/0gVEXELik8ipLp3RL/fEoteoYi18NWQH63RpXaXMax8s5NTlnDnJpd8JZCOeuPU+gjbsFzS8raUZbkhp1Y2nhg+UF6XeK2OiPlNZIrFPmGN6x2POLHr5HMoG3aOkjtFfMIcOwzzqWZp6Ouy89ONsAodJrawzauajepYSea+FB/B/3iAX/7X4kFLDuwuwnIPpDqh1CRzx5PCgq3ReAR0g4qq6gpMVTo8bOfCa9mfheYkU32K9B3s98BT3mTYqdENVupHztJ8xTPtJe09Dk3msxWUxzrZQXYV2uVyAI7gzxNtI+RRNuMzysdSAelPw25P8YnxvVmTYA==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Alistair Francis <alistair.francis@xxxxxxx>, Connor Davis <connojdavis@xxxxxxxxx>, Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx>, Timothy Pearson <tpearson@xxxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Thu, 02 Apr 2026 12:15:38 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Thu, Feb 19, 2026 at 04:51:54PM +0100, Jan Beulich wrote:
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -6166,41 +6166,15 @@ void *__init arch_vmap_virt_end(void)
>      return fix_to_virt(__end_of_fixed_addresses);
>  }
>  
> -void __iomem *ioremap(paddr_t pa, size_t len)
> +void __iomem *x86_ioremap_attr(paddr_t pa, size_t len, pte_attr_t attr)
>  {
> -    mfn_t mfn = _mfn(PFN_DOWN(pa));
> -    void *va;
> -
> -    WARN_ON(page_is_ram_type(mfn_x(mfn), RAM_TYPE_CONVENTIONAL));
> +    WARN_ON(page_is_ram_type(PFN_DOWN(pa), RAM_TYPE_CONVENTIONAL));
>  
>      /* The low first Mb is always mapped. */
> -    if ( !((pa + len - 1) >> 20) )
> -        va = __va(pa);
> -    else
> -    {
> -        unsigned int offs = pa & (PAGE_SIZE - 1);
> -        unsigned int nr = PFN_UP(offs + len);
> -
> -        va = __vmap(&mfn, nr, 1, 1, PAGE_HYPERVISOR_UCMINUS, VMAP_DEFAULT);
> -        if ( va )
> -            va += offs;
> -    }
> -
> -    return (void __force __iomem *)va;
> -}
> -
> -void __iomem *__init ioremap_wc(paddr_t pa, size_t len)
> -{
> -    mfn_t mfn = _mfn(PFN_DOWN(pa));
> -    unsigned int offs = pa & (PAGE_SIZE - 1);
> -    unsigned int nr = PFN_UP(offs + len);
> -    void *va;
> -
> -    WARN_ON(page_is_ram_type(mfn_x(mfn), RAM_TYPE_CONVENTIONAL));
> -
> -    va = __vmap(&mfn, nr, 1, 1, PAGE_HYPERVISOR_WC, VMAP_DEFAULT);
> +    if ( !((pa + len - 1) >> 20) && attr == PAGE_HYPERVISOR_UCMINUS )
> +        return (void __force __iomem *)__va(pa);

Sorry, I'm possibly a bit lost: I see that on the bootstrap
page-tables we map the VGA hole (0xa0000-0xc0000) as UC-, but I'm not
seeing this being done to the directmap?

>  
> -    return (void __force __iomem *)(va ? va + offs : NULL);
> +    return NULL;
>  }
>  
>  int create_perdomain_mapping(struct domain *d, unsigned long va,
> --- a/xen/common/Makefile
> +++ b/xen/common/Makefile
> @@ -19,6 +19,7 @@ obj-$(CONFIG_GRANT_TABLE) += grant_table
>  obj-y += guestcopy.o
>  obj-y += gzip/
>  obj-$(CONFIG_HYPFS) += hypfs.o
> +obj-y += ioremap.o
>  obj-$(CONFIG_IOREQ_SERVER) += ioreq.o
>  obj-y += irq.o
>  obj-y += kernel.o
> --- /dev/null
> +++ b/xen/common/ioremap.c
> @@ -0,0 +1,42 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +
> +#include <xen/mm.h>
> +#include <xen/pfn.h>
> +#include <xen/vmap.h>
> +
> +#include <asm/io.h>
> +
> +void __iomem *ioremap_attr(paddr_t pa, size_t len, pte_attr_t attr)
> +{
> +    void __iomem *ptr = NULL;
> +    unsigned int offs = PAGE_OFFSET(pa);
> +
> +#ifdef arch_ioremap_attr
> +    ptr = arch_ioremap_attr(pa, len, attr);
> +    if ( PAGE_OFFSET(ptr) )
> +        return ptr;

IMO it's a bit confusing to deal with the offset addition detached
form here, I would rather do:

if ( ptr != NULL )
{
    ASSERT(PAGE_OFFSET(ptr) == offs);
    return PAGE_OFFSET(ptr) ? ptr : ptr + off;
}

And get rid of the !ptr check in the if below.  So that when
arch_ioremap_attr() succeeds it's all dealt with in the #ifdef
protected block.

> +#endif
> +
> +    if ( IS_ENABLED(CONFIG_HAS_VMAP) && !ptr )
> +    {
> +        mfn_t mfn = _mfn(PFN_DOWN(pa));
> +
> +        ptr = (void __force __iomem *)__vmap(&mfn, PFN_UP(offs + len), 1, 1,
> +                                             attr, VMAP_DEFAULT);
> +    }
> +
> +    if ( !ptr )
> +        return NULL;
> +
> +    return ptr + offs;

I would also join the NULL checking using a ternary operator:

return ptr ? ptr + off : NULL;

Thanks, Roger.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.