All of lore.kernel.org
 help / color / mirror / Atom feed
From: George Dunlap <george.dunlap@eu.citrix.com>
To: Elena Ufimtseva <ufimtseva@gmail.com>
Cc: keir@xen.org, stefano.stabellini@eu.citrix.com, msw@linux.com,
	dario.faggioli@citrix.com, lccycc123@gmail.com,
	xen-devel@lists.xen.org, JBeulich@suse.com
Subject: Re: [PATCH 2/7] libxc: Plumb Xen with vNUMA topology for domain.
Date: Thu, 14 Nov 2013 22:56:59 +0000	[thread overview]
Message-ID: <5285553B.2090809@eu.citrix.com> (raw)
In-Reply-To: <1381963226-7843-1-git-send-email-ufimtseva@gmail.com>

On 10/16/2013 11:40 PM, Elena Ufimtseva wrote:
> Per-domain vNUMA topology initialization.
> domctl hypercall is used to set vNUMA topology
> per domU during domain build time.
>
> Signed-off-by: Elena Ufimtseva <ufimtseva@gmail.com>
>
> ---
> Changes since RFC v2:
> - copy vNUMA topology information in hypercall in one go;
> ---
>   tools/libxc/xc_dom.h    |    9 ++++++++
>   tools/libxc/xc_domain.c |   59 +++++++++++++++++++++++++++++++++++++++++++++++
>   tools/libxc/xenctrl.h   |    9 ++++++++
>   3 files changed, 77 insertions(+)
>
> diff --git a/tools/libxc/xc_dom.h b/tools/libxc/xc_dom.h
> index 86e23ee..a271b7c 100644
> --- a/tools/libxc/xc_dom.h
> +++ b/tools/libxc/xc_dom.h
> @@ -114,6 +114,15 @@ struct xc_dom_image {
>       struct xc_dom_phys *phys_pages;
>       int realmodearea_log;
>
> +    /*
> +     * vNUMA topology and memory allocation structure.
> +     * Defines the way to allocate memory on per NUMA
> +     * physical nodes that is defined by vnode_to_pnode.
> +     */
> +    uint16_t nr_vnodes;
> +    uint64_t *vnuma_memszs;
> +    unsigned int *vnode_to_pnode;

This isn't really used in this patch -- I think this should probably be 
put in the next patch.

> +
>       /* malloc memory pool */
>       struct xc_dom_mem *memblocks;
>
> diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
> index 2cea6e3..6cab681 100644
> --- a/tools/libxc/xc_domain.c
> +++ b/tools/libxc/xc_domain.c
> @@ -1777,6 +1777,65 @@ int xc_domain_set_max_evtchn(xc_interface *xch, uint32_t domid,
>       return do_domctl(xch, &domctl);
>   }
>
> +/* Plumbs Xen with vNUMA topology */
> +int xc_domain_setvnodes(xc_interface *xch,
> +                        uint32_t domid,
> +                        uint16_t nr_vnodes,
> +                        uint16_t nr_vcpus,
> +                        vnuma_memblk_t *vmemblks,
> +                        unsigned int *vdistance,
> +                        unsigned int *vcpu_to_vnode,
> +                        unsigned int *vnode_to_pnode)
> +{
> +    int rc;
> +    DECLARE_DOMCTL;
> +    DECLARE_HYPERCALL_BOUNCE(vmemblks, sizeof(*vmemblks) * nr_vnodes,
> +                                    XC_HYPERCALL_BUFFER_BOUNCE_BOTH);
> +    DECLARE_HYPERCALL_BOUNCE(vdistance, sizeof(*vdistance) *
> +                                    nr_vnodes * nr_vnodes,
> +                                    XC_HYPERCALL_BUFFER_BOUNCE_BOTH);
> +    DECLARE_HYPERCALL_BOUNCE(vcpu_to_vnode, sizeof(*vcpu_to_vnode) * nr_vcpus,
> +                                    XC_HYPERCALL_BUFFER_BOUNCE_BOTH);
> +    DECLARE_HYPERCALL_BOUNCE(vnode_to_pnode, sizeof(*vnode_to_pnode) *
> +                                    nr_vnodes,
> +                                    XC_HYPERCALL_BUFFER_BOUNCE_BOTH);
> +
> +    if ( vdistance == NULL || vcpu_to_vnode == NULL ||
> +         vmemblks == NULL || vnode_to_pnode == NULL )
> +    {
> +            PERROR("Incorrect parameters for XEN_DOMCTL_setvnumainfo\n");
> +            return -EINVAL;
> +    }
> +
> +    rc = -EINVAL;
> +
> +    if (xc_hypercall_bounce_pre(xch, vmemblks)      ||
> +        xc_hypercall_bounce_pre(xch, vdistance)     ||
> +        xc_hypercall_bounce_pre(xch, vcpu_to_vnode) ||
> +        xc_hypercall_bounce_pre(xch, vnode_to_pnode))
> +    {
> +        PERROR("Could not bounce buffer for xc_domain_setvnodes");
> +        return rc;

As Dario said, this should be setting errno and returning -1.

(A bit of a weird convention, but it's as old as Unix, and not worth 
breaking at this point.)

Other than that it looks fine to me; but I'm not up on the details of 
bounce buffers and what not enough to give a proper reviewed-by.

  -George

> +    }
> +
> +    set_xen_guest_handle(domctl.u.vnuma.vnuma_memblks, vmemblks);
> +    set_xen_guest_handle(domctl.u.vnuma.vdistance, vdistance);
> +    set_xen_guest_handle(domctl.u.vnuma.vcpu_to_vnode, vcpu_to_vnode);
> +    set_xen_guest_handle(domctl.u.vnuma.vnode_to_pnode, vnode_to_pnode);
> +
> +    domctl.cmd = XEN_DOMCTL_setvnumainfo;
> +    domctl.domain = (domid_t)domid;
> +    domctl.u.vnuma.nr_vnodes = nr_vnodes;
> +    rc = do_domctl(xch, &domctl);
> +
> +    xc_hypercall_bounce_post(xch, vmemblks);
> +    xc_hypercall_bounce_post(xch, vdistance);
> +    xc_hypercall_bounce_post(xch, vcpu_to_vnode);
> +    xc_hypercall_bounce_post(xch, vnode_to_pnode);
> +
> +    return rc;
> +}
> +
>   /*
>    * Local variables:
>    * mode: C
> diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h
> index 8cf3f3b..3dbd035 100644
> --- a/tools/libxc/xenctrl.h
> +++ b/tools/libxc/xenctrl.h
> @@ -1108,6 +1108,15 @@ int xc_domain_set_memmap_limit(xc_interface *xch,
>                                  uint32_t domid,
>                                  unsigned long map_limitkb);
>
> +int xc_domain_setvnodes(xc_interface *xch,
> +                        uint32_t domid,
> +                        uint16_t nr_vnodes,
> +                        uint16_t nr_vcpus,
> +                        vnuma_memblk_t *vmemareas,
> +                        unsigned int *vdistance,
> +                        unsigned int *vcpu_to_vnode,
> +                        unsigned int *vnode_to_pnode);
> +
>   #if defined(__i386__) || defined(__x86_64__)
>   /*
>    * PC BIOS standard E820 types and structure.
>

      reply	other threads:[~2013-11-14 22:56 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-16 22:40 [PATCH 2/7] libxc: Plumb Xen with vNUMA topology for domain Elena Ufimtseva
2013-11-14 22:56 ` George Dunlap [this message]

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=5285553B.2090809@eu.citrix.com \
    --to=george.dunlap@eu.citrix.com \
    --cc=JBeulich@suse.com \
    --cc=dario.faggioli@citrix.com \
    --cc=keir@xen.org \
    --cc=lccycc123@gmail.com \
    --cc=msw@linux.com \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=ufimtseva@gmail.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.