On 03/03/15 14:38, Jan Beulich wrote: > As we get ready to use the information set for a domain here we should > make sure it is actually valid: Both vNode and pNode numbers should be > in range. Do a little bit of other cleanup so the code ends up looking > reasonably consistent in style. > > Along with this goes that we don't need an array of unsigned int to > store the pNode number - a nodeid_t one (a quarter the size) suffices. > > Signed-off-by: Jan Beulich <jbeul...@suse.com>
Reviewed-by: Andrew Cooper <andrew.coop...@citrix.com> > > --- a/xen/common/domctl.c > +++ b/xen/common/domctl.c > @@ -344,7 +344,7 @@ static struct vnuma_info *vnuma_alloc(un > > vnuma->vdistance = xmalloc_array(unsigned int, nr_vnodes * nr_vnodes); > vnuma->vcpu_to_vnode = xmalloc_array(unsigned int, nr_vcpus); > - vnuma->vnode_to_pnode = xmalloc_array(unsigned int, nr_vnodes); > + vnuma->vnode_to_pnode = xmalloc_array(nodeid_t, nr_vnodes); > vnuma->vmemrange = xmalloc_array(xen_vmemrange_t, nr_ranges); > > if ( vnuma->vdistance == NULL || vnuma->vmemrange == NULL || > @@ -382,30 +382,40 @@ static struct vnuma_info *vnuma_init(con > nr_vnodes * nr_vnodes) ) > goto vnuma_fail; > > + if ( copy_from_guest(info->vmemrange, uinfo->vmemrange, > + uinfo->nr_vmemranges) ) > + goto vnuma_fail; > + > if ( copy_from_guest(info->vcpu_to_vnode, uinfo->vcpu_to_vnode, > d->max_vcpus) ) > goto vnuma_fail; > > - if ( copy_from_guest(info->vnode_to_pnode, uinfo->vnode_to_pnode, > - nr_vnodes) ) > - goto vnuma_fail; > + ret = -E2BIG; > + for ( i = 0; i < d->max_vcpus; ++i ) > + if ( info->vcpu_to_vnode[i] >= nr_vnodes ) > + goto vnuma_fail; > > - if (copy_from_guest(info->vmemrange, uinfo->vmemrange, > - uinfo->nr_vmemranges)) > - goto vnuma_fail; > + for ( i = 0; i < nr_vnodes; ++i ) > + { > + unsigned int pnode; > + > + ret = -EFAULT; > + if ( copy_from_guest_offset(&pnode, uinfo->vnode_to_pnode, i, 1) ) > + goto vnuma_fail; > + ret = -E2BIG; > + if ( pnode >= MAX_NUMNODES ) > + goto vnuma_fail; > + info->vnode_to_pnode[i] = pnode; > + } > > info->nr_vnodes = nr_vnodes; > info->nr_vmemranges = uinfo->nr_vmemranges; > > /* Check that vmemranges flags are zero. */ > + ret = -EINVAL; > for ( i = 0; i < info->nr_vmemranges; i++ ) > - { > if ( info->vmemrange[i].flags != 0 ) > - { > - ret = -EINVAL; > goto vnuma_fail; > - } > - } > > return info; > > --- a/xen/include/xen/domain.h > +++ b/xen/include/xen/domain.h > @@ -4,6 +4,7 @@ > > #include <public/xen.h> > #include <asm/domain.h> > +#include <asm/numa.h> > > typedef union { > struct vcpu_guest_context *nat; > @@ -99,7 +100,7 @@ struct vnuma_info { > unsigned int nr_vmemranges; > unsigned int *vdistance; > unsigned int *vcpu_to_vnode; > - unsigned int *vnode_to_pnode; > + nodeid_t *vnode_to_pnode; > struct xen_vmemrange *vmemrange; > }; > > > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel
_______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel