All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: Julien Grall <Julien.Grall@arm.com>
To: Stefano Stabellini <sstabellini@kernel.org>,
	"xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>
Cc: Stefano Stabellini <stefanos@xilinx.com>, nd <nd@arm.com>
Subject: Re: [PATCH 5/6] xen/arm: map reserved-memory regions as normal memory in dom0
Date: Tue, 26 Feb 2019 23:45:34 +0000	[thread overview]
Message-ID: <96e6defa-5c7b-81e2-a85e-f02884f339fb@arm.com> (raw)
In-Reply-To: <1551222427-21749-5-git-send-email-sstabellini@kernel.org>

Hi Stefano,

On 26/02/2019 23:07, Stefano Stabellini wrote:
> reserved-memory regions should be mapped as normal memory. At the
> moment, they get remapped as device memory in dom0 because Xen doesn't
> know any better. Add an explicit check for it.

You probably use an outdated change (> 2 years ago). In recent Xen, Dom0 
MMIO are mapped use p2m_mmio_direct_c. This main difference with 
p2m_ram_rw is the shareability attribute (inner vs outer).

This will also have the advantage to not impair with the rest of Xen.

But I don't think this would be enough. Per [1], reserved-memory region 
is used to carve memory from /memory node. So those regions should be 
described in /memory of the Dom0 DT as well.

> 
> However, reserved-memory regions are allowed to overlap partially or
> completely with memory nodes. In these cases, the overlapping memory is
> reserved-memory and should be handled accordingly.

Do you mind providing your source? If you look at the description in 
Linux bindings, it is clearly they will always overlap with /memory.

[...]

> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index 80f0028..74c4707 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -470,10 +470,52 @@ static void __init init_pdx(void)
>       }
>   }
>   
> +static void __init check_reserved_memory(paddr_t *bank_start, paddr_t *bank_size)
> +{
> +    paddr_t bank_end = *bank_start + *bank_size;
> +    struct meminfo mem = bootinfo.mem;
> +    int i;
> +
> +    for ( i = 0; i < bootinfo.reserved_mem.nr_banks; i++ )
> +    {
> +        struct membank rbank = bootinfo.reserved_mem.bank[i];
> +
> +        if ( *bank_start < rbank.start && bank_end <= rbank.start )
> +            continue;
> +
> +        if ( *bank_start >= (rbank.start + rbank.size) )
> +            continue;
> +
> +        /* memory bank overlaps with reserved memory region */
> +        if ( rbank.start > *bank_start )
> +        {
> +            bank_end = rbank.start;
> +            if ( *bank_start + *bank_size > rbank.start + rbank.size )
> +            {
> +                mem.bank[mem.nr_banks].start = rbank.start + rbank.size;
> +                mem.bank[mem.nr_banks].size = *bank_start + *bank_size -
> +                    mem.bank[mem.nr_banks].start;
> +                mem.nr_banks++;
> +            }
> +        }
> +        else if ( rbank.start + rbank.size > *bank_start)
> +        {
> +           if (rbank.start + rbank.size < bank_end )
> +               *bank_start = rbank.start + rbank.size;
> +           else
> +               *bank_start = bank_end;
> +        }
> +
> +        *bank_size = bank_end - *bank_start;
> +    }
> +}

reserved-memory nodes is more nothing more than an extension of an old 
DT binding for reserved memory. We handle them in a few places (see 
consider_modules and dt_unreserved_region). So mostly likely you want to 
extend what we already have.

This would avoid most (if not) all the changes below.

> +
>   #ifdef CONFIG_ARM_32
>   static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
>   {
> -    paddr_t ram_start, ram_end, ram_size;
> +    paddr_t ram_start = ~0;
> +    paddr_t ram_end = 0;
> +    paddr_t ram_size = 0;
>       paddr_t s, e;
>       unsigned long ram_pages;
>       unsigned long heap_pages, xenheap_pages, domheap_pages;
> @@ -487,18 +529,19 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
>   
>       init_pdx();
>   
> -    ram_start = bootinfo.mem.bank[0].start;
> -    ram_size  = bootinfo.mem.bank[0].size;
> -    ram_end   = ram_start + ram_size;
> -
> -    for ( i = 1; i < bootinfo.mem.nr_banks; i++ )
> +    for ( i = 0; i < bootinfo.mem.nr_banks; i++ )
>       {
> -        paddr_t bank_start = bootinfo.mem.bank[i].start;
> -        paddr_t bank_size = bootinfo.mem.bank[i].size;
> -        paddr_t bank_end = bank_start + bank_size;
> +        paddr_t bank_end;
>   
> -        ram_size  = ram_size + bank_size;
> -        ram_start = min(ram_start,bank_start);
> +        check_reserved_memory(&bootinfo.mem.bank[i].start,
> +                              &bootinfo.mem.bank[i].size);
> +
> +        if ( !bootinfo.mem.bank[i].size )
> +            continue;
> +
> +        bank_end = bootinfo.mem.bank[i].start + bootinfo.mem.bank[i].size;
> +        ram_size  = ram_size + bootinfo.mem.bank[i].size;
> +        ram_start = min(ram_start, bootinfo.mem.bank[i].start);
>           ram_end   = max(ram_end,bank_end);
>       }
>   
> @@ -570,6 +613,9 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
>           paddr_t bank_start = bootinfo.mem.bank[i].start;
>           paddr_t bank_end = bank_start + bootinfo.mem.bank[i].size;
>   
> +        if ( !bootinfo.mem.bank[i].size )
> +            continue;
> +
>           s = bank_start;
>           while ( s < bank_end )
>           {
> @@ -627,11 +673,21 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
>       total_pages = 0;
>       for ( bank = 0 ; bank < bootinfo.mem.nr_banks; bank++ )
>       {
> -        paddr_t bank_start = bootinfo.mem.bank[bank].start;
> -        paddr_t bank_size = bootinfo.mem.bank[bank].size;
> -        paddr_t bank_end = bank_start + bank_size;
> +        paddr_t bank_start;
> +        paddr_t bank_size;
> +        paddr_t bank_end;
>           paddr_t s, e;
>   
> +        check_reserved_memory(&bootinfo.mem.bank[bank].start,
> +                              &bootinfo.mem.bank[bank].size);
> +
> +        bank_start = bootinfo.mem.bank[bank].start;
> +        bank_size = bootinfo.mem.bank[bank].size;
> +        bank_end = bank_start + bank_size;
> +
> +        if ( !bank_size )
> +            continue;
> +
>           ram_size = ram_size + bank_size;
>           ram_start = min(ram_start,bank_start);
>           ram_end = max(ram_end,bank_end);
> 

[1] 
https://www.kernel.org/doc/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt

-- 
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  reply	other threads:[~2019-02-26 23:45 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-26 23:06 [PATCH 0/6] iomem cacheability Stefano Stabellini
2019-02-26 23:07 ` [PATCH 1/6] xen: extend XEN_DOMCTL_memory_mapping to handle cacheability Stefano Stabellini
2019-02-26 23:18   ` Julien Grall
2019-04-20  0:02     ` Stefano Stabellini
2019-04-20  0:02       ` [Xen-devel] " Stefano Stabellini
2019-04-21 17:32       ` Julien Grall
2019-04-21 17:32         ` [Xen-devel] " Julien Grall
2019-04-22 21:59         ` Stefano Stabellini
2019-04-22 21:59           ` [Xen-devel] " Stefano Stabellini
2019-04-24 10:42           ` Julien Grall
2019-04-24 10:42             ` [Xen-devel] " Julien Grall
2019-02-27 10:34   ` Jan Beulich
2019-04-17 21:12     ` Stefano Stabellini
2019-04-17 21:12       ` [Xen-devel] " Stefano Stabellini
2019-04-17 21:25       ` Julien Grall
2019-04-17 21:25         ` [Xen-devel] " Julien Grall
2019-04-17 21:55         ` Stefano Stabellini
2019-04-17 21:55           ` [Xen-devel] " Stefano Stabellini
2019-04-25 10:41       ` Jan Beulich
2019-04-25 10:41         ` [Xen-devel] " Jan Beulich
2019-04-25 22:31         ` Stefano Stabellini
2019-04-25 22:31           ` [Xen-devel] " Stefano Stabellini
2019-04-26  7:12           ` Jan Beulich
2019-04-26  7:12             ` [Xen-devel] " Jan Beulich
2019-02-27 19:28   ` Julien Grall
2019-04-19 23:20     ` Stefano Stabellini
2019-04-19 23:20       ` [Xen-devel] " Stefano Stabellini
2019-04-21 17:14       ` Julien Grall
2019-04-21 17:14         ` [Xen-devel] " Julien Grall
2019-04-22 17:33         ` Stefano Stabellini
2019-04-22 17:33           ` [Xen-devel] " Stefano Stabellini
2019-04-22 17:42           ` Julien Grall
2019-04-22 17:42             ` [Xen-devel] " Julien Grall
2019-02-27 21:02   ` Julien Grall
2019-02-26 23:07 ` [PATCH 2/6] libxc: xc_domain_memory_mapping, " Stefano Stabellini
2019-02-26 23:07 ` [PATCH 3/6] libxl/xl: add cacheability option to iomem Stefano Stabellini
2019-02-27 20:02   ` Julien Grall
2019-04-19 23:13     ` Stefano Stabellini
2019-04-19 23:13       ` [Xen-devel] " Stefano Stabellini
2019-02-26 23:07 ` [PATCH 4/6] xen/arm: keep track of reserved-memory regions Stefano Stabellini
2019-02-28 14:38   ` Julien Grall
2019-02-26 23:07 ` [PATCH 5/6] xen/arm: map reserved-memory regions as normal memory in dom0 Stefano Stabellini
2019-02-26 23:45   ` Julien Grall [this message]
2019-04-22 22:42     ` Stefano Stabellini
2019-04-22 22:42       ` [Xen-devel] " Stefano Stabellini
2019-04-23  8:09       ` Julien Grall
2019-04-23  8:09         ` [Xen-devel] " Julien Grall
2019-04-23 17:32         ` Stefano Stabellini
2019-04-23 17:32           ` [Xen-devel] " Stefano Stabellini
2019-04-23 18:37           ` Julien Grall
2019-04-23 18:37             ` [Xen-devel] " Julien Grall
2019-04-23 21:34             ` Stefano Stabellini
2019-04-23 21:34               ` [Xen-devel] " Stefano Stabellini
2019-02-26 23:07 ` [PATCH 6/6] xen/docs: how to map a page between dom0 and domU using iomem Stefano Stabellini
2019-03-03 17:20 ` [PATCH 0/6] iomem cacheability Amit Tomer
2019-03-05 21:22   ` Stefano Stabellini
2019-03-05 22:45     ` Julien Grall
2019-03-06 11:46       ` Amit Tomer
2019-03-06 22:42         ` Stefano Stabellini
2019-03-06 22:59           ` Julien Grall
2019-03-07  8:42             ` Amit Tomer
2019-03-07 10:04               ` Julien Grall
2019-03-07 21:24                 ` Stefano Stabellini
2019-03-08 10:10                   ` Amit Tomer
2019-03-08 16:37                     ` Julien Grall
2019-03-08 17:44                       ` Amit Tomer
2019-03-06 11:30     ` Amit Tomer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=96e6defa-5c7b-81e2-a85e-f02884f339fb@arm.com \
    --to=julien.grall@arm.com \
    --cc=nd@arm.com \
    --cc=sstabellini@kernel.org \
    --cc=stefanos@xilinx.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.