All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Campbell <ian.campbell@citrix.com>
To: Wei Liu <wei.liu2@citrix.com>
Cc: Dario Faggioli <dario.faggioli@citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	Elena Ufimtseva <ufimtseva@gmail.com>,
	xen-devel@lists.xen.org
Subject: Re: [PATCH v6 06/23] libxc: allocate memory with vNUMA information for PV guest
Date: Mon, 2 Mar 2015 15:36:50 +0000	[thread overview]
Message-ID: <1425310610.21151.90.camel@citrix.com> (raw)
In-Reply-To: <1424966166-2388-7-git-send-email-wei.liu2@citrix.com>

On Thu, 2015-02-26 at 15:55 +0000, Wei Liu wrote:
> From libxc's point of view, it only needs to know vnode to pnode mapping
> and size of each vnode to allocate memory accordingly. Add these fields
> to xc_dom structure.
> 
> The caller might not pass in vNUMA information. In that case, a dummy
> layout is generated for the convenience of libxc's allocation code. The
> upper layer (libxl etc) still sees the domain has no vNUMA
> configuration.
> 
> Note that for this patch on PV x86 guest can have multiple regions of
> ram allocated.
> 
> Signed-off-by: Wei Liu <wei.liu2@citrix.com>

Acked-by: Ian Campbell <ian.campbell@citrix.com>

> Cc: Ian Jackson <ian.jackson@eu.citrix.com>
> Cc: Dario Faggioli <dario.faggioli@citrix.com>
> Cc: Elena Ufimtseva <ufimtseva@gmail.com>
> ---
> Changes in v6:
> 1. Ditch XC_VNUMA_NO_NODE and use XEN_NUMA_NO_NODE.
> 2. Update comment in xc_dom.h.
> 
> Changes in v5:
> 1. Ditch xc_vnuma_info.
> 
> Changes in v4:
> 1. Pack fields into a struct.
> 2. Use "page" as unit.
> 3. __FUNCTION__ -> __func__.
> 4. Don't print total_pages.
> 5. Improve comment.
> 
> Changes in v3:
> 1. Rewrite commit log.
> 2. Shorten some error messages.
> ---
>  tools/libxc/include/xc_dom.h |  12 ++++-
>  tools/libxc/xc_dom_x86.c     | 101 +++++++++++++++++++++++++++++++++++++------
>  2 files changed, 97 insertions(+), 16 deletions(-)
> 
> diff --git a/tools/libxc/include/xc_dom.h b/tools/libxc/include/xc_dom.h
> index 6b8ddf4..a7d059a 100644
> --- a/tools/libxc/include/xc_dom.h
> +++ b/tools/libxc/include/xc_dom.h
> @@ -119,8 +119,10 @@ struct xc_dom_image {
>  
>      /* physical memory
>       *
> -     * An x86 PV guest has a single contiguous block of physical RAM,
> -     * consisting of total_pages starting at rambase_pfn.
> +     * An x86 PV guest has one or more blocks of physical RAM,
> +     * consisting of total_pages starting at rambase_pfn. The start
> +     * address and size of each block is controlled by vNUMA
> +     * structures.
>       *
>       * An ARM guest has GUEST_RAM_BANKS regions of RAM, with
>       * rambank_size[i] pages in each. The lowest RAM address
> @@ -168,6 +170,12 @@ struct xc_dom_image {
>      struct xc_dom_loader *kernel_loader;
>      void *private_loader;
>  
> +    /* vNUMA information */
> +    xen_vmemrange_t *vmemranges;
> +    unsigned int nr_vmemranges;
> +    unsigned int *vnode_to_pnode;
> +    unsigned int nr_vnodes;
> +
>      /* kernel loader */
>      struct xc_dom_arch *arch_hooks;
>      /* allocate up to virt_alloc_end */
> diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c
> index bea54f2..268d4db 100644
> --- a/tools/libxc/xc_dom_x86.c
> +++ b/tools/libxc/xc_dom_x86.c
> @@ -760,7 +760,8 @@ static int x86_shadow(xc_interface *xch, domid_t domid)
>  int arch_setup_meminit(struct xc_dom_image *dom)
>  {
>      int rc;
> -    xen_pfn_t pfn, allocsz, i, j, mfn;
> +    xen_pfn_t pfn, allocsz, mfn, total, pfn_base;
> +    int i, j;
>  
>      rc = x86_compat(dom->xch, dom->guest_domid, dom->guest_type);
>      if ( rc )
> @@ -811,26 +812,98 @@ int arch_setup_meminit(struct xc_dom_image *dom)
>              if ( rc )
>                  return rc;
>          }
> -        /* setup initial p2m */
> -        dom->p2m_size = dom->total_pages;
> +
> +        /* Setup dummy vNUMA information if it's not provided. Note
> +         * that this is a valid state if libxl doesn't provide any
> +         * vNUMA information.
> +         *
> +         * The dummy values make libxc allocate all pages from
> +         * arbitrary physical nodes. This is the expected behaviour if
> +         * no vNUMA configuration is provided to libxc.
> +         *
> +         * Note that the following hunk is just for the convenience of
> +         * allocation code. No defaulting happens in libxc.
> +         */
> +        if ( dom->nr_vmemranges == 0 )
> +        {
> +            dom->nr_vmemranges = 1;
> +            dom->vmemranges = xc_dom_malloc(dom, sizeof(*dom->vmemranges));
> +            dom->vmemranges[0].start = 0;
> +            dom->vmemranges[0].end   = dom->total_pages << PAGE_SHIFT;
> +            dom->vmemranges[0].flags = 0;
> +            dom->vmemranges[0].nid   = 0;
> +
> +            dom->nr_vnodes = 1;
> +            dom->vnode_to_pnode = xc_dom_malloc(dom,
> +                                      sizeof(*dom->vnode_to_pnode));
> +            dom->vnode_to_pnode[0] = XEN_NUMA_NO_NODE;
> +        }
> +
> +        total = dom->p2m_size = 0;
> +        for ( i = 0; i < dom->nr_vmemranges; i++ )
> +        {
> +            total += ((dom->vmemranges[i].end - dom->vmemranges[i].start)
> +                      >> PAGE_SHIFT);
> +            dom->p2m_size =
> +                dom->p2m_size > (dom->vmemranges[i].end >> PAGE_SHIFT) ?
> +                dom->p2m_size : (dom->vmemranges[i].end >> PAGE_SHIFT);
> +        }
> +        if ( total != dom->total_pages )
> +        {
> +            xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> +                         "%s: vNUMA page count mismatch (0x%"PRIpfn" != 0x%"PRIpfn")\n",
> +                         __func__, total, dom->total_pages);
> +            return -EINVAL;
> +        }
> +
>          dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) *
>                                        dom->p2m_size);
>          if ( dom->p2m_host == NULL )
>              return -EINVAL;
> -        for ( pfn = 0; pfn < dom->total_pages; pfn++ )
> -            dom->p2m_host[pfn] = pfn;
> +        for ( pfn = 0; pfn < dom->p2m_size; pfn++ )
> +            dom->p2m_host[pfn] = INVALID_P2M_ENTRY;
>  
>          /* allocate guest memory */
> -        for ( i = rc = allocsz = 0;
> -              (i < dom->total_pages) && !rc;
> -              i += allocsz )
> +        for ( i = 0; i < dom->nr_vmemranges; i++ )
>          {
> -            allocsz = dom->total_pages - i;
> -            if ( allocsz > 1024*1024 )
> -                allocsz = 1024*1024;
> -            rc = xc_domain_populate_physmap_exact(
> -                dom->xch, dom->guest_domid, allocsz,
> -                0, 0, &dom->p2m_host[i]);
> +            unsigned int memflags;
> +            uint64_t pages;
> +            unsigned int pnode = dom->vnode_to_pnode[dom->vmemranges[i].nid];
> +
> +            memflags = 0;
> +            if ( pnode != XEN_NUMA_NO_NODE )
> +                memflags |= XENMEMF_exact_node(pnode);
> +
> +            pages = (dom->vmemranges[i].end - dom->vmemranges[i].start)
> +                >> PAGE_SHIFT;
> +            pfn_base = dom->vmemranges[i].start >> PAGE_SHIFT;
> +
> +            for ( pfn = pfn_base; pfn < pfn_base+pages; pfn++ )
> +                dom->p2m_host[pfn] = pfn;
> +
> +            for ( j = 0; j < pages; j += allocsz )
> +            {
> +                allocsz = pages - j;
> +                if ( allocsz > 1024*1024 )
> +                    allocsz = 1024*1024;
> +
> +                rc = xc_domain_populate_physmap_exact(dom->xch,
> +                         dom->guest_domid, allocsz, 0, memflags,
> +                         &dom->p2m_host[pfn_base+j]);
> +
> +                if ( rc )
> +                {
> +                    if ( pnode != XEN_NUMA_NO_NODE )
> +                        xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> +                                     "%s: failed to allocate 0x%"PRIx64" pages (v=%d, p=%d)\n",
> +                                     __func__, pages, i, pnode);
> +                    else
> +                        xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> +                                     "%s: failed to allocate 0x%"PRIx64" pages\n",
> +                                     __func__, pages);
> +                    return rc;
> +                }
> +            }
>          }
>  
>          /* Ensure no unclaimed pages are left unused.

  reply	other threads:[~2015-03-02 15:36 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-26 15:55 [PATCH v6 00/23] Virtual NUMA for PV and HVM Wei Liu
2015-02-26 15:55 ` [PATCH v6 01/23] xen: factor out construct_memop_from_reservation Wei Liu
2015-02-27 10:57   ` Andrew Cooper
2015-02-26 15:55 ` [PATCH v6 02/23] xen: move NUMA_NO_NODE to public memory.h as XEN_NUMA_NO_NODE Wei Liu
2015-02-27 11:38   ` Andrew Cooper
2015-02-27 16:42   ` Jan Beulich
2015-02-27 16:51     ` Wei Liu
2015-02-27 16:52       ` Andrew Cooper
2015-03-02  7:04         ` Jan Beulich
2015-03-02 15:30           ` Ian Campbell
2015-03-02 15:38             ` Wei Liu
2015-03-02 15:51               ` Jan Beulich
2015-03-02 16:08                 ` Wei Liu
2015-03-02 16:27                   ` Jan Beulich
2015-03-02 16:39                     ` Wei Liu
2015-03-02 16:50                       ` Jan Beulich
2015-03-02 17:00                         ` Wei Liu
2015-03-03  7:44                           ` Jan Beulich
2015-03-03 11:08                             ` Wei Liu
2015-03-02 17:01                         ` Andrew Cooper
2015-03-02 17:26                           ` Jan Beulich
2015-03-02 17:34                             ` David Vrabel
2015-03-02 17:43                               ` Andrew Cooper
2015-03-02 17:48                                 ` David Vrabel
2015-03-02 17:52                                   ` Ian Campbell
2015-03-02 18:19                                     ` Andrew Cooper
2015-03-03  3:42                                       ` Dario Faggioli
2015-03-03  8:55                                         ` Jan Beulich
2015-03-04 12:51                                           ` Dario Faggioli
2015-03-03  7:56                                       ` Jan Beulich
2015-03-03  7:36                               ` Jan Beulich
2015-02-26 15:55 ` [PATCH v6 03/23] xen: make two memory hypercalls vNUMA-aware Wei Liu
2015-02-27 16:59   ` Jan Beulich
2015-02-27 17:03     ` Wei Liu
2015-02-26 15:55 ` [PATCH v6 04/23] libxc: duplicate snippet to allocate p2m_host array Wei Liu
2015-03-02 15:26   ` Ian Campbell
2015-03-02 15:33     ` Wei Liu
2015-03-02 16:18       ` Ian Campbell
2015-03-02 16:45         ` Konrad Rzeszutek Wilk
2015-03-02 16:46     ` Konrad Rzeszutek Wilk
2015-02-26 15:55 ` [PATCH v6 05/23] libxc: add p2m_size to xc_dom_image Wei Liu
2015-03-02 15:28   ` Ian Campbell
2015-02-26 15:55 ` [PATCH v6 06/23] libxc: allocate memory with vNUMA information for PV guest Wei Liu
2015-03-02 15:36   ` Ian Campbell [this message]
2015-02-26 15:55 ` [PATCH v6 07/23] libxl: introduce vNUMA types Wei Liu
2015-02-26 15:55 ` [PATCH v6 08/23] libxl: add vmemrange to libxl__domain_build_state Wei Liu
2015-02-26 15:55 ` [PATCH v6 09/23] libxl: introduce libxl__vnuma_config_check Wei Liu
2015-03-02 15:34   ` Ian Campbell
2015-03-02 15:50     ` Wei Liu
2015-03-03  3:52     ` Dario Faggioli
2015-02-26 15:55 ` [PATCH v6 10/23] libxl: x86: factor out e820_host_sanitize Wei Liu
2015-02-26 15:55 ` [PATCH v6 11/23] libxl: functions to build vmemranges for PV guest Wei Liu
2015-02-26 16:39   ` Dario Faggioli
2015-03-02 15:41   ` Ian Campbell
2015-03-02 17:52     ` Wei Liu
2015-02-26 15:55 ` [PATCH v6 12/23] libxl: build, check and pass vNUMA info to Xen " Wei Liu
2015-02-26 15:55 ` [PATCH v6 13/23] libxc: indentation change to xc_hvm_build_x86.c Wei Liu
2015-02-26 15:55 ` [PATCH v6 14/23] libxc: allocate memory with vNUMA information for HVM guest Wei Liu
2015-03-02 15:43   ` Ian Campbell
2015-02-26 15:55 ` [PATCH v6 15/23] libxl: build, check and pass vNUMA info to Xen " Wei Liu
2015-03-02 15:44   ` Ian Campbell
2015-02-26 15:55 ` [PATCH v6 16/23] libxl: disallow memory relocation when vNUMA is enabled Wei Liu
2015-03-02 15:46   ` Ian Campbell
2015-02-26 15:56 ` [PATCH v6 17/23] libxl: define LIBXL_HAVE_VNUMA Wei Liu
2015-02-27 13:46   ` Dario Faggioli
2015-02-26 15:56 ` [PATCH v6 18/23] libxlu: rework internal representation of setting Wei Liu
2015-02-26 15:56 ` [PATCH v6 19/23] libxlu: nested list support Wei Liu
2015-02-26 15:56 ` [PATCH v6 20/23] libxlu: record line and column number when parsing values Wei Liu
2015-03-06 11:36   ` Ian Jackson
2015-03-06 12:03     ` Wei Liu
2015-03-06 14:30       ` Ian Jackson
2015-03-06 16:11         ` Wei Liu
2015-03-06 16:57           ` Wei Liu
2015-02-26 15:56 ` [PATCH v6 21/23] libxlu: introduce new APIs Wei Liu
2015-03-06 11:40   ` Ian Jackson
2015-02-26 15:56 ` [PATCH v6 22/23] xl: introduce xcalloc Wei Liu
2015-03-02 15:51   ` Ian Campbell
2015-02-26 15:56 ` [PATCH v6 23/23] xl: vNUMA support Wei Liu
2015-02-27 16:17   ` Dario Faggioli
2015-03-02 15:59   ` Ian Campbell
2015-03-02 16:31     ` Wei Liu

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=1425310610.21151.90.camel@citrix.com \
    --to=ian.campbell@citrix.com \
    --cc=dario.faggioli@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=ufimtseva@gmail.com \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.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.