|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 6/9] libxl: get and set soft affinity
On Wed, 2014-05-28 at 01:42 +0100, Dario Faggioli wrote:
> Make space for two new cpumap-s, one in vcpu_info (for getting
> soft affinity) and build_info (for setting it) and amend the
> API for setting vCPU affinity.
>
> libxl_set_vcpuaffinity() now takes two cpumaps, one for hard
> and one for soft affinity (LIBXL_API_VERSION is exploited to
> retain source level backword compatibility). Either of the
> two cpumap can be NULL, in which case, only the affinity
> corresponding to the non-NULL cpumap will be affected.
>
> Getting soft affinity happens indirectly, via `xl vcpu-list'
> (as it is already for hard affinity).
>
> This commit also introduces some logic to check whether the
> affinity which will be used by Xen to schedule the vCPU(s)
> does actually match with the cpumaps provided. In fact, we
> want to allow every possible combination of hard and soft
> affinity to be set, but we warn the user upon particularly
> weird situations (e.g., hard and soft being disjoint sets
> of pCPUs).
>
> This is the first change breaking the libxl ABI, so it bumps
> the MAJOR.
>
> Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx>
> Reviewed-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
> ---
> Changes from v4:
> * get rid of inline stubs inside the LIBXL_API_VERSION_XXX
> block and just use define, as suggested during review
> * adapt to the new xc interface;
> * avoid leaking cpumap_soft in libxl_list_vcpu on error, as
> requested during review;
> * fix bogous `return 0' in libxl_set_vcpuaffinity, as
> requested during review;
> * clarify the comment for LIBXL_HAVE_SOFT_AFFINITY, as
> suggested during review;
> * renamed libxl_bitmap_valid() to libxl_bitmap_bit_valid(),
> as suggested uring review.
>
> Changes from v3:
> * only introduce one LIBXL_HAVE_ symbol for soft affinity,
> as requested during review;
> * use LIBXL_API_VERSION instead of having multiple version
> of the same function, as suggested during review;
> * use libxl_get_nr_cpus() rather than libxl_get_cputopology(),
> as suggested during review;
> * use LOGE() instead of LIBXL__LOG_ERRNO(), as requested
> during review;
> * kill the flags and use just one _set_vcpuaffinity()
> function with two cpumaps, allowing either of them to
> be NULL, as suggested during review;
> * avoid overflowing the bitmaps in libxl_bitmap_equal(),
> as suggested during review.
>
> Changes from v2:
> * interface completely redesigned, as discussed during
> review.
> ---
> tools/libxl/libxl.c | 85
> ++++++++++++++++++++++++++++++++++++++-----
> tools/libxl/libxl.h | 26 ++++++++++++-
> tools/libxl/libxl_create.c | 6 +++
> tools/libxl/libxl_dom.c | 3 +-
> tools/libxl/libxl_types.idl | 4 +-
> tools/libxl/libxl_utils.h | 25 ++++++++++++-
> tools/libxl/xl_cmdimpl.c | 6 +--
> 7 files changed, 137 insertions(+), 18 deletions(-)
>
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index ec79645..309cc6f 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -4587,6 +4590,12 @@ libxl_vcpuinfo *libxl_list_vcpu(libxl_ctx *ctx,
> uint32_t domid,
> LOGE(ERROR, "getting vcpu affinity");
> goto err;
> }
> + if (xc_vcpu_getaffinity(ctx->xch, domid, *nr_vcpus_out, NULL,
> + ptr->cpumap_soft.map,
> + XEN_VCPUAFFINITY_SOFT) == -1) {
Can't this be combined with the call right before it which fetches the
hard aff'ty?
> + LOGE(ERROR, "getting vcpu affinity");
> + goto err;
> + }
> ptr->vcpuid = *nr_vcpus_out;
> ptr->cpu = vcpuinfo.cpu;
> ptr->online = !!vcpuinfo.online;
> int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid,
> - libxl_bitmap *cpumap)
> + const libxl_bitmap *cpumap_hard,
> + const libxl_bitmap *cpumap_soft)
> {
> - if (xc_vcpu_setaffinity(ctx->xch, domid, vcpuid, cpumap->map, NULL,
> - XEN_VCPUAFFINITY_HARD)) {
> - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "setting vcpu affinity");
> - return ERROR_FAIL;
> + GC_INIT(ctx);
> + libxl_bitmap cpumap;
> + int nr_cpus = 0, rc;
> +
> + if (!cpumap_hard && !cpumap_soft)
> + return ERROR_INVAL;
> +
> + nr_cpus = libxl_get_online_cpus(ctx);
> + if (nr_cpus < 0)
> + return nr_cpus;
> +
> + rc = libxl_cpu_bitmap_alloc(ctx, &cpumap, 0);
> + if (rc)
> + return rc;
> +
> + if (cpumap_hard) {
> + libxl_bitmap_copy(ctx, &cpumap, cpumap_hard);
> +
> + if (xc_vcpu_setaffinity(ctx->xch, domid, vcpuid, cpumap.map, NULL,
> + XEN_VCPUAFFINITY_HARD)) {
Again can't the soft and hard calls be combined?
> + LOGE(ERROR, "setting vcpu hard affinity");
> + rc = ERROR_FAIL;
> + goto out;
> + }
> +
> + if (!libxl_bitmap_equal(cpumap_hard, &cpumap, nr_cpus))
nr_cpus wasn't needed for the bitmap alloc or the bitmap copy, can we
not avoid it here too?
> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
> index d015cf4..49a01a7 100644
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -193,6 +193,12 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
> libxl_bitmap_set_any(&b_info->cpumap);
> }
>
> + if (!b_info->cpumap_soft.size) {
> + if (libxl_cpu_bitmap_alloc(CTX, &b_info->cpumap_soft, 0))
> + return ERROR_FAIL;
> + libxl_bitmap_set_any(&b_info->cpumap_soft);
Could we not treat .size == 0 as being "any", indicating no need to do
anything later on?
> diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h
> index e37fb89..4d743c9 100644
> --- a/tools/libxl/libxl_utils.h
> +++ b/tools/libxl/libxl_utils.h
> @@ -90,7 +90,7 @@ static inline void libxl_bitmap_set_none(libxl_bitmap
> *bitmap)
> {
> memset(bitmap->map, 0, bitmap->size);
> }
> -static inline int libxl_bitmap_cpu_valid(libxl_bitmap *bitmap, int bit)
> +static inline int libxl_bitmap_bit_valid(const libxl_bitmap *bitmap, int bit)
> {
> return bit >= 0 && bit < (bitmap->size * 8);
> }
> @@ -98,6 +98,29 @@ static inline int libxl_bitmap_cpu_valid(libxl_bitmap
> *bitmap, int bit)
> #define libxl_for_each_set_bit(v, m) for (v = 0; v < (m).size * 8; v++) \
> if (libxl_bitmap_test(&(m), v))
>
> +static inline int libxl_bitmap_equal(const libxl_bitmap *ba,
> + const libxl_bitmap *bb,
> + int nr_bits)
> +{
> + int i;
> +
> + /* Only check nr_bits (all bits if <= 0) */
> + nr_bits = (nr_bits <= 0) ? ba->size * 8 : nr_bits;
if (nr_bits <= 0)
nr_bits = ba->size * 8;
I'm not sure <= 0 is useful in this interface, just == would do. nr_bits
could be unsigned too I guess.
> + for (i = 0; i < nr_bits; i++) {
> + /* If overflowing one of the bitmaps, we call them different */
Could this not be checked a priori by looking at ba->size and bb->size
up front rather than every time round the loop?
> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
> index 5195914..fa5ab8e 100644
> --- a/tools/libxl/xl_cmdimpl.c
> +++ b/tools/libxl/xl_cmdimpl.c
> @@ -2269,7 +2269,7 @@ start:
> } else {
> libxl_bitmap_set_any(&vcpu_cpumap);
> }
> - if (libxl_set_vcpuaffinity(ctx, domid, i, &vcpu_cpumap)) {
> + if (libxl_set_vcpuaffinity(ctx, domid, i, &vcpu_cpumap, NULL)) {
> fprintf(stderr, "setting affinity failed on vcpu `%d'.\n",
> i);
> libxl_bitmap_dispose(&vcpu_cpumap);
> free(vcpu_to_pcpu);
> @@ -4700,7 +4700,7 @@ static int vcpupin(uint32_t domid, const char *vcpu,
> char *cpu)
> }
>
> if (vcpuid != -1) {
> - if (libxl_set_vcpuaffinity(ctx, domid, vcpuid, &cpumap) == -1) {
> + if (libxl_set_vcpuaffinity(ctx, domid, vcpuid, &cpumap, NULL)) {
Are you deliberately changing the error handling here? (and in the next
hunk)
Ian.
> fprintf(stderr, "Could not set affinity for vcpu `%u'.\n",
> vcpuid);
> goto out;
> }
> @@ -4712,7 +4712,7 @@ static int vcpupin(uint32_t domid, const char *vcpu,
> char *cpu)
> }
> for (i = 0; i < nb_vcpu; i++) {
> if (libxl_set_vcpuaffinity(ctx, domid, vcpuinfo[i].vcpuid,
> - &cpumap) == -1) {
> + &cpumap, NULL)) {
> fprintf(stderr, "libxl_set_vcpuaffinity failed"
> " on vcpu `%u'.\n", vcpuinfo[i].vcpuid);
> }
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |