[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 1/7] xen: vNUMA support for guests.
>>> On 14.11.13 at 04:26, Elena Ufimtseva <ufimtseva@xxxxxxxxx> wrote: > + case XEN_DOMCTL_setvnumainfo: > + { > + unsigned int i = 0, dist_size; > + uint nr_vnodes; "unsigned int" or "uint" consistently please (preferably the former). Also the initializer for "i" seems pointless. > + ret = -EFAULT; > + > + /* Already set? */ > + if ( d->vnuma.nr_vnodes > 0 ) > + return 0; This surely needs to be some -E (or else how would the caller know that the function didn't do what was asked for). > + > + nr_vnodes = op->u.vnuma.nr_vnodes; > + > + if ( nr_vnodes == 0 ) > + return ret; > + if ( nr_vnodes * nr_vnodes > UINT_MAX ) > + return ret; Neither of these are -EFAULT (and I'm pretty certain I commented on the need to use suitable error indicators before). Further, the last check is insufficient: The product can appear to be smaller than UINT_MAX due to truncation. You really need to compare one of the values to the quotient of UINT_MAX and the other. > + /* Everything is good, lets set the number of vnodes */ > + d->vnuma.nr_vnodes = nr_vnodes; > + ret = 0; > +err_dom: Labels indented by one space please (to make diff's -p option not pick them up as context for a hunk). > + if ( ret != 0 ) > + { > + d->vnuma.nr_vnodes = 0; Now that you (properly) set the field only once everything else was successful, this seems unnecessary. > + case XENMEM_get_vnuma_info: > + { > + vnuma_topology_info_t mtopology; > + struct domain *d; > + > + rc = -EFAULT; > + if ( copy_from_guest(&mtopology, arg, 1) ) > + return -EFAULT; > + if ( (d = rcu_lock_domain_by_any_id(mtopology.domid)) == NULL ) > + return -ESRCH; > + > + if ( (d->vnuma.nr_vnodes == 0) || (d->vnuma.nr_vnodes > > d->max_vcpus) ) > + return EOPNOTSUPP; -EOPNOTSUPP. And you need to "goto vnumaout" here. > + > + if ( __copy_to_guest(mtopology.vmemrange, > + d->vnuma.vmemrange, > + d->vnuma.nr_vnodes) != 0 ) > + goto vnumaout; > + if ( __copy_to_guest(mtopology.vdistance, > + d->vnuma.vdistance, > + d->vnuma.nr_vnodes * d->vnuma.nr_vnodes) != > 0 ) > + goto vnumaout; > + if ( __copy_to_guest(mtopology.vcpu_to_vnode, > + d->vnuma.vcpu_to_vnode, > + d->max_vcpus) != 0 ) > + goto vnumaout; You can't use __copy_* without previously having validated the passed in address range (or you risk corrupting hypervisor memory). > + > + if ( __copy_to_guest(mtopology.nr_vnodes, &d->vnuma.nr_vnodes, 1) != > 0 ) I think you could use __copy_field_to_guest() here. > --- a/xen/include/public/memory.h > +++ b/xen/include/public/memory.h > @@ -459,6 +459,14 @@ DEFINE_XEN_GUEST_HANDLE(xen_mem_sharing_op_t); > * The zero value is appropiate. > */ > > +/* > + * XENMEM_get_vnuma_info used by caller to retrieve > + * vNUMA topology constructed for particular domain. > + * > + * The data exchanged is presented by vnuma_topology_info. > + */ > +#define XENMEM_get_vnuma_info 25 > + > #endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ Isn't that call supposed to be used by guests? If so, it must not sit in a hypervisor-and-tools-only section. > --- /dev/null > +++ b/xen/include/public/vnuma.h > @@ -0,0 +1,44 @@ > +#ifndef _XEN_PUBLIC_VNUMA_H > +#define _XEN_PUBLIC_VNUMA_H > +#include "memory.h" This seems backwards - if anything, I'd expect memory.h to include vnuma.h (if we need a new header here at all). > +#include "xen.h" > + > +/* > + * Following structures are used to represent vNUMA > + * topology to guest if requested. > + */ > + > +/* > + * Memory ranges can be used to define > + * vNUMA memory node boundaries by the > + * linked list. As of now, only one range > + * per domain is suported. > + */ > + > +struct vmemrange { > + uint64_t start, end; > + struct vmemrange *next; ISTR having commented on this before: No pointers in public headers. Only guest handles are permitted here. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |