On 09/17/10 11:00, Ian Campbell wrote:
On Fri, 2010-09-17 at 06:51 +0100, Juergen Gross wrote:
Signed-off-by: juergen.gross@xxxxxxxxxxxxxx
To be able to support arbitrary numbers of physical cpus it was
necessary to
include the size of cpumaps in the xc-interfaces for cpu pools.
These were:
definition of xc_cpupoolinfo_t
xc_cpupool_getinfo()
xc_cpupool_freeinfo()
diff -r d978675f3d53 tools/libxc/xc_cpupool.c
--- a/tools/libxc/xc_cpupool.c Thu Sep 16 18:29:26 2010 +0100
+++ b/tools/libxc/xc_cpupool.c Fri Sep 17 07:42:30 2010 +0200
@@ -34,6 +34,20 @@ static int do_sysctl_save(xc_interface *
return ret;
}
+static int get_cpumap_size(xc_interface *xch)
+{
+ static int cpumap_size = 0;
+ xc_physinfo_t physinfo;
+
+ if ( cpumap_size )
+ return cpumap_size;
+
+ if ( !xc_physinfo(xch,&physinfo) )
+ cpumap_size = (physinfo.max_cpu_id + 8) / 8;
The + 8 / 8 thing still jumps out at me every time I look at it. Perhaps
the intention would be clearer if written as:
int nr_cpus = physinfo.max_cpu_id + 1;
cpumap_size = (nr+cpus + 7) / 8;
I modified it to make it more clear.
If xc_physinfo fails (which seems like a reasonably fatal type of error)
then this function returns 0 but the caller does not seem to check for
this case.
Okay, test added.
+xc_cpupoolinfo_t *xc_cpupool_getinfo(xc_interface *xch,
+ uint32_t poolid)
{
[...]
+ local_size = get_cpumap_size(xch);
+ cpumap_size = (local_size + 7) / 8;
local_size has already been rounded up in get_cpumap_size. Do we really
need to do it again?
I've made it more clear that this is rounding to uint64.
+ size = sizeof(xc_cpupoolinfo_t) + cpumap_size * 8 + local_size;
Why do we need both "cpumap_size * 8" and local_size additional bytes
here? Both contain the number of bytes necessary to contain a cpumap
bitmask and in fact I suspect they are both equal at this point (see
point about rounding above).
The hypervisor returns a cpumask based on bytes, the tools use uint64-based
cpumasks. In practice this is equivalent as long as multiple of 8 bytes are
written by the hypervisor and the system is running little endian.
I prefer a clean interface mapping here.
Juergen
--
Juergen Gross Principal Developer Operating Systems
TSP ES&S SWE OS6 Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions e-mail: juergen.gross@xxxxxxxxxxxxxx
Domagkstr. 28 Internet: ts.fujitsu.com
D-80807 Muenchen Company details: ts.fujitsu.com/imprint.html
cpupool-tools-cpumask.patch
Description: Text Data
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|