| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 1/7] xen/vnuma: subop hypercall and vnuma topology structures.
 >>> On 27.08.13 at 09:54, Elena Ufimtseva <ufimtseva@xxxxxxxxx> wrote:
> Defines XENMEM subop hypercall for PV vNUMA enabled guests and provides
> vNUMA topology information from per-domain vnuma topology build info.
> TODO:
> subop XENMEM hypercall is subject to change to sysctl subop.
That would mean it's intended to be used by the tool stack only. I
thought that the balloon driver (and perhaps other code) are also
intended to be consumers.
> @@ -732,7 +733,94 @@ long do_memory_op(unsigned long cmd, 
> XEN_GUEST_HANDLE_PARAM(void) arg)
>          rcu_unlock_domain(d);
>  
>          break;
> -
> +    case XENMEM_get_vnuma_info:
> +    {
> +        int i;
> +        struct vnuma_topology_info mtopology;
> +        struct vnuma_topology_info touser_topo;
> +        struct domain *d;
> +        unsigned int max_pages;
> +        vnuma_memblk_t *vblks;
> +        XEN_GUEST_HANDLE(int) vdistance;
> +        XEN_GUEST_HANDLE_PARAM(int) vdist_param;
> +        XEN_GUEST_HANDLE(vnuma_memblk_t) buf;
> +        XEN_GUEST_HANDLE_PARAM(vnuma_memblk_t) buf_param;
> +        XEN_GUEST_HANDLE(int) vcpu_to_vnode;
> +        XEN_GUEST_HANDLE_PARAM(int) vmap_param;
> +
> +        rc = -1;
You absolutely need to use proper -E... values when returnin
hypercall status.
> +        if ( guest_handle_is_null(arg) )
> +            return rc;
> +        if( copy_from_guest(&mtopology, arg, 1) )
> +        {
> +            gdprintk(XENLOG_INFO, "Cannot get copy_from_guest..\n");
> +            return -EFAULT;
> +        }
> +        gdprintk(XENLOG_INFO, "Domain id is %d\n",mtopology.domid);
I appreciate that you need such for debugging, but this should be
removed before posting patches.
> +        if ( (d = rcu_lock_domain_by_any_id(mtopology.domid)) == NULL )
> +        {
> +            gdprintk(XENLOG_INFO, "Numa: Could not get domain id.\n");
> +            return -ESRCH;
> +        }
> +        rcu_unlock_domain(d);
> +        touser_topo.nr_vnodes = d->vnuma.nr_vnodes;
Mis-ordered: First you want to use d, then rcu-unlock it.
> +        rc = copy_to_guest(arg, &touser_topo, 1);
> +        if ( rc )
> +        {
> +            gdprintk(XENLOG_INFO, "Bad news, could not copy to guest NUMA 
> info\n");
> +            return -EFAULT;
> +        }
> +        max_pages = d->max_pages;
> +        if ( touser_topo.nr_vnodes == 0 || touser_topo.nr_vnodes > 
> d->max_vcpus )
> +        {
> +            gdprintk(XENLOG_INFO, "vNUMA: Error in block creation - vnodes 
> %d, vcpus %d \n", touser_topo.nr_vnodes, d->max_vcpus);
> +            return -EFAULT;
> +        }
> +        vblks = (vnuma_memblk_t *)xmalloc_array(struct vnuma_memblk, 
> touser_topo.nr_vnodes);
> +        if ( vblks == NULL )
> +        {
> +            gdprintk(XENLOG_INFO, "vNUMA: Could not get memory for 
> memblocks\n");
> +            return -1;
> +        }
> +        buf_param = guest_handle_cast(mtopology.vnuma_memblks, 
> vnuma_memblk_t);
By giving the structure field a proper type you should be able to
avoid the use of guest_handle_cast() here and below.
> +        buf = guest_handle_from_param(buf_param, vnuma_memblk_t);
> +        for ( i = 0; i < touser_topo.nr_vnodes; i++ )
> +        {
> +                gdprintk(XENLOG_INFO, "vmemblk[%d] start %#lx end %#lx\n", 
> i, d->vnuma.vnuma_memblks[i].start, d->vnuma.vnuma_memblks[i].end);
Actually, I'm going to give up here (for this file) - the not cleaned up
code is obfuscating the real meat of the code too much for
reasonable reviewing.
> --- a/xen/include/public/memory.h
> +++ b/xen/include/public/memory.h
> @@ -453,6 +453,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_mem_sharing_op_t);
>   * Caller must be privileged or the hypercall fails.
>   */
>  #define XENMEM_claim_pages                  24
> +#define XENMEM_get_vnuma_info               25
>  
>  /*
>   * XENMEM_claim_pages flags - the are no flags at this time.
Misplaced - don't put this in the middle of another logical section.
> --- /dev/null
> +++ b/xen/include/public/vnuma.h
> @@ -0,0 +1,12 @@
> +#ifndef __XEN_PUBLIC_VNUMA_H
> +#define __XEN_PUBLIC_VNUMA_H
> +
> +#include "xen.h"
> +
> +struct vnuma_memblk {
> +              uint64_t start, end;
> +};
> +typedef struct vnuma_memblk vnuma_memblk_t;
> +DEFINE_XEN_GUEST_HANDLE(vnuma_memblk_t);
> +
> +#endif
Unmotivated new file. Plus the type isn't used elsewhere in the
public interface.
> @@ -89,4 +90,12 @@ extern unsigned int xen_processor_pmbits;
>  
>  extern bool_t opt_dom0_vcpus_pin;
>  
> +struct domain_vnuma_info {
> +    uint16_t nr_vnodes;
> +    int *vdistance;
> +    vnuma_memblk_t *vnuma_memblks;
> +    int *vcpu_to_vnode;
> +    int *vnode_to_pnode;
Can any of the "int" fields reasonably be negative? If not, they
ought to be "unsigned int".
> --- /dev/null
> +++ b/xen/include/xen/vnuma.h
> @@ -0,0 +1,27 @@
> +#ifndef _VNUMA_H
> +#define _VNUMA_H
> +#include <public/vnuma.h>
> +
> +/* DEFINE_XEN_GUEST_HANDLE(vnuma_memblk_t); */
> +
> +struct vnuma_topology_info {
> +    domid_t domid;
> +    uint16_t nr_vnodes;
> +    XEN_GUEST_HANDLE_64(vnuma_memblk_t) vnuma_memblks;
> +    XEN_GUEST_HANDLE_64(int) vdistance;
> +    XEN_GUEST_HANDLE_64(int) vcpu_to_vnode;
> +    XEN_GUEST_HANDLE_64(int) vnode_to_pnode;
> +};
> +typedef struct vnuma_topology_info vnuma_topology_info_t;
> +DEFINE_XEN_GUEST_HANDLE(vnuma_topology_info_t);
At least up to here it seems like this is part of the intended public
interface, and hence ought to go into public/memory.h.
> +#define __vnode_distance_offset(_dom, _i, _j) \
> +        ( ((_j)*((_dom)->vnuma.nr_vnodes)) + (_i) )
Missing blanks around *.
> +
> +#define __vnode_distance(_dom, _i, _j) \
> +        ( (_dom)->vnuma.vdistance[__vnode_distance_offset((_dom), (_i), 
> (_j))] )
> +
> +#define __vnode_distance_set(_dom, _i, _j, _v) \
> +        do { __vnode_distance((_dom), (_i), (_j)) = (_v); } while(0)
Proper parenthesization is clearly necessary, but there are clearly
some that are reducing legibility of the code without having any
useful purpose.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
 
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |