|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 12/17] xen/libxc: sched: DOMCTL_*vcpuaffinity works with hard and soft affinity
>>> On 02.12.13 at 19:29, Dario Faggioli <dario.faggioli@xxxxxxxxxx> wrote:
> +static inline
> +int vcpuaffinity_params_invalid(const xen_domctl_vcpuaffinity_t *vcpuaff)
> +{
> + return vcpuaff->flags == 0 ||
> + (vcpuaff->flags & XEN_VCPUAFFINITY_HARD &&
> + guest_handle_is_null(vcpuaff->cpumap_hard.bitmap)) ||
> + (vcpuaff->flags & XEN_VCPUAFFINITY_SOFT &&
The binary &-s clearly want to be parenthesized.
> @@ -605,31 +615,112 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t)
> u_domctl)
> case XEN_DOMCTL_getvcpuaffinity:
> {
> struct vcpu *v;
> + xen_domctl_vcpuaffinity_t *vcpuaff = &op->u.vcpuaffinity;
>
> ret = -EINVAL;
> - if ( op->u.vcpuaffinity.vcpu >= d->max_vcpus )
> + if ( vcpuaff->vcpu >= d->max_vcpus )
> break;
>
> ret = -ESRCH;
> - if ( (v = d->vcpu[op->u.vcpuaffinity.vcpu]) == NULL )
> + if ( (v = d->vcpu[vcpuaff->vcpu]) == NULL )
> break;
>
> if ( op->cmd == XEN_DOMCTL_setvcpuaffinity )
> {
> - cpumask_var_t new_affinity;
> + cpumask_var_t new_affinity, old_affinity;
> + cpumask_t *online = cpupool_online_cpumask(v->domain->cpupool);;
> +
> + /*
> + * We want to be able to restore hard affinity if we are trying
> + * setting both and changing soft affinity (which happens later,
> + * when hard affinity has been succesfully chaged already) fails.
> + */
> + if ( !alloc_cpumask_var(&old_affinity) )
> + {
> + ret = -ENOMEM;
> + break;
> + }
> + cpumask_copy(old_affinity, v->cpu_hard_affinity);
>
> - ret = xenctl_bitmap_to_cpumask(
> - &new_affinity, &op->u.vcpuaffinity.cpumap);
> - if ( !ret )
> + if ( !alloc_cpumask_var(&new_affinity) )
> {
> - ret = vcpu_set_affinity(v, new_affinity);
> - free_cpumask_var(new_affinity);
> + free_cpumask_var(old_affinity);
> + ret = -ENOMEM;
> + break;
> }
> +
> + ret = -EINVAL;
> + if (vcpuaffinity_params_invalid(vcpuaff))
Coding style.
Further - can't this be done in the code shared between "get" and
"set"?
> + goto setvcpuaffinity_out;
> +
> + /*
> + * We both set a new affinity and report back to the caller what
> + * the scheduler will be effectively using.
> + */
> + if ( vcpuaff->flags & XEN_VCPUAFFINITY_HARD )
> + {
> + ret = xenctl_bitmap_to_bitmap(cpumask_bits(new_affinity),
> + &vcpuaff->cpumap_hard,
> + vcpuaff->cpumap_hard.nr_bits);
There's no code above range checking vcpuaff->cpumap_hard.nr_bits,
yet xenctl_bitmap_to_bitmap() uses the passed in value to write into
the array pointed to by the first argument. Why is this not
xenctl_bitmap_to_cpumask() in the first place?
> + if ( !ret )
> + ret = vcpu_set_hard_affinity(v, new_affinity);
> + if ( ret )
> + goto setvcpuaffinity_out;
> +
> + /*
> + * For hard affinity, what we return is the intersection of
> + * cpupool's online mask and the new hard affinity.
> + */
> + cpumask_and(new_affinity, online, v->cpu_hard_affinity);
> + ret = cpumask_to_xenctl_bitmap(&vcpuaff->cpumap_hard,
> + new_affinity);
So what you return back here ...
> + }
> + if ( vcpuaff->flags & XEN_VCPUAFFINITY_SOFT )
> + {
> + ret = xenctl_bitmap_to_bitmap(cpumask_bits(new_affinity),
> + &vcpuaff->cpumap_soft,
> + vcpuaff->cpumap_soft.nr_bits);
> + if ( !ret)
> + ret = vcpu_set_soft_affinity(v, new_affinity);
> + if ( ret )
> + {
> + /*
> + * Since we're returning error, the caller expects
> nothing
> + * happened, so we rollback the changes to hard affinity
> + * (if any).
> + */
> + if ( vcpuaff->flags & XEN_VCPUAFFINITY_HARD )
> + vcpu_set_hard_affinity(v, old_affinity);
> + goto setvcpuaffinity_out;
> + }
> +
> + /*
> + * For soft affinity, we return the intersection between the
> + * new soft affinity, the cpupool's online map and the (new)
> + * hard affinity.
> + */
> + cpumask_and(new_affinity, new_affinity, online);
> + cpumask_and(new_affinity, new_affinity,
> v->cpu_hard_affinity);
> + ret = cpumask_to_xenctl_bitmap(&vcpuaff->cpumap_soft,
> + new_affinity);
... and here differs from ...
> + }
> +
> + setvcpuaffinity_out:
> + free_cpumask_var(new_affinity);
> + free_cpumask_var(old_affinity);
> }
> else
> {
> - ret = cpumask_to_xenctl_bitmap(
> - &op->u.vcpuaffinity.cpumap, v->cpu_hard_affinity);
> + ret = -EINVAL;
> + if (vcpuaffinity_params_invalid(vcpuaff))
> + break;
> +
> + if ( vcpuaff->flags & XEN_VCPUAFFINITY_HARD )
> + ret = cpumask_to_xenctl_bitmap(&vcpuaff->cpumap_hard,
> + v->cpu_hard_affinity);
> + if ( vcpuaff->flags & XEN_VCPUAFFINITY_SOFT )
> + ret = cpumask_to_xenctl_bitmap(&vcpuaff->cpumap_soft,
> + v->cpu_soft_affinity);
... the simple "get". Why? And if really intended, this should be
mentioned in the public header.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |