From mboxrd@z Thu Jan 1 00:00:00 1970 From: George Dunlap Subject: Re: [PATCH 02 of 11] libxl: abstract libxl_cpumap to just libxl_map Date: Thu, 31 May 2012 15:54:56 +0100 Message-ID: <4FC78640.3050408@eu.citrix.com> References: <82ac47424d0a8888d702.1338466267@Solace> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <82ac47424d0a8888d702.1338466267@Solace> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Dario Faggioli Cc: Andre Przywara , Ian Campbell , Stefano Stabellini , Juergen Gross , Ian Jackson , "xen-devel@lists.xen.org" List-Id: xen-devel@lists.xenproject.org On 31/05/12 13:11, Dario Faggioli wrote: > More specifically: > 1. introduces struct libxl_map; > 2. re-implement libxl_cpumap_* on top of struct libxl_map_*; > > No functional nor interface changes at all. > > This is in preparation of the introduction of NUMA nodes maps. > > Signed-off-by: Dario Faggioli Acked-by: George Dunlap > > diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h > --- a/tools/libxl/libxl.h > +++ b/tools/libxl/libxl.h > @@ -282,11 +282,17 @@ typedef uint32_t libxl_hwcap[8]; > > typedef uint64_t libxl_ev_user; > > -typedef struct { > +struct libxl_map { > uint32_t size; /* number of bytes in map */ > uint8_t *map; > -} libxl_cpumap; > -void libxl_cpumap_dispose(libxl_cpumap *map); > +}; > +void libxl_map_dispose(struct libxl_map *map); > + > +typedef struct libxl_map libxl_cpumap; > +static inline void libxl_cpumap_dispose(libxl_cpumap *cpumap) > +{ > + return libxl_map_dispose(cpumap); > +} > > typedef struct { > /* > diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c > --- a/tools/libxl/libxl_utils.c > +++ b/tools/libxl/libxl_utils.c > @@ -488,47 +488,53 @@ int libxl_mac_to_device_nic(libxl_ctx *c > return rc; > } > > +void libxl_map_dispose(struct libxl_map *map) > +{ > + free(map->map); > +} > + > +static int libxl_map_alloc(libxl_ctx *ctx, struct libxl_map *map, int n_elems) > +{ > + int sz; > + > + sz = (n_elems + 7) / 8; > + map->map = calloc(sz, sizeof(*map->map)); > + if (!map->map) > + return ERROR_NOMEM; > + map->size = sz; > + return 0; > +} > + > +int libxl_map_test(struct libxl_map *map, int elem) > +{ > + if (elem>= map->size * 8) > + return 0; > + return (map->map[elem / 8]& (1<< (elem& 7))) ? 1 : 0; > +} > + > +void libxl_map_set(struct libxl_map *map, int elem) > +{ > + if (elem>= map->size * 8) > + return; > + map->map[elem / 8] |= 1<< (elem& 7); > +} > + > +void libxl_map_reset(struct libxl_map *map, int elem) > +{ > + if (elem>= map->size * 8) > + return; > + map->map[elem / 8]&= ~(1<< (elem& 7)); > +} > + > int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap) > { > int max_cpus; > - int sz; > > max_cpus = libxl_get_max_cpus(ctx); > if (max_cpus == 0) > return ERROR_FAIL; > > - sz = (max_cpus + 7) / 8; > - cpumap->map = calloc(sz, sizeof(*cpumap->map)); > - if (!cpumap->map) > - return ERROR_NOMEM; > - cpumap->size = sz; > - return 0; > -} > - > -void libxl_cpumap_dispose(libxl_cpumap *map) > -{ > - free(map->map); > -} > - > -int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu) > -{ > - if (cpu>= cpumap->size * 8) > - return 0; > - return (cpumap->map[cpu / 8]& (1<< (cpu& 7))) ? 1 : 0; > -} > - > -void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu) > -{ > - if (cpu>= cpumap->size * 8) > - return; > - cpumap->map[cpu / 8] |= 1<< (cpu& 7); > -} > - > -void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu) > -{ > - if (cpu>= cpumap->size * 8) > - return; > - cpumap->map[cpu / 8]&= ~(1<< (cpu& 7)); > + return libxl_map_alloc(ctx, cpumap, max_cpus); > } > > int libxl_get_max_cpus(libxl_ctx *ctx) > diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h > --- a/tools/libxl/libxl_utils.h > +++ b/tools/libxl/libxl_utils.h > @@ -63,21 +63,46 @@ int libxl_devid_to_device_nic(libxl_ctx > int libxl_vdev_to_device_disk(libxl_ctx *ctx, uint32_t domid, const char *vdev, > libxl_device_disk *disk); > > +int libxl_map_test(struct libxl_map *map, int elem); > +void libxl_map_set(struct libxl_map *map, int elem); > +void libxl_map_reset(struct libxl_map *map, int elem); > +static inline void libxl_map_set_any(struct libxl_map *map) > +{ > + memset(map->map, -1, map->size); > +} > +static inline void libxl_map_set_none(struct libxl_map *map) > +{ > + memset(map->map, 0, map->size); > +} > +static inline int libxl_map_elem_valid(struct libxl_map *map, int elem) > +{ > + return elem>= 0&& elem< (map->size * 8); > +} > + > int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap); > -int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu); > -void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu); > -void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu); > +static inline int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu) > +{ > + return libxl_map_test(cpumap, cpu); > +} > +static inline void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu) > +{ > + libxl_map_set(cpumap, cpu); > { > - memset(cpumap->map, -1, cpumap->size); > + libxl_map_set_any(cpumap); > } > static inline void libxl_cpumap_set_none(libxl_cpumap *cpumap) > { > - memset(cpumap->map, 0, cpumap->size); > + libxl_map_set_none(cpumap); > } > static inline int libxl_cpumap_cpu_valid(libxl_cpumap *cpumap, int cpu) > { > - return cpu>= 0&& cpu< (cpumap->size * 8); > + return libxl_map_elem_valid(cpumap, cpu); > } > #define libxl_for_each_cpu(var, map) for (var = 0; var< (map).size * 8; var++) > #define libxl_for_each_set_cpu(v, m) for (v = 0; v< (m).size * 8; v++) \