On Mon, 26 Nov 2007 10:17:41 -0500 Daniel Veillard wrote:
On Mon, Nov 26, 2007 at 11:12:29AM +0900, Saori Fukuta wrote:
> I want to change the cpu pinning for inactive domain on RHEL-5.1.
> So, I just add the xenXMDomainPinVcpu to xm_internal.c.
> We will be allowed to change "cpus" parameter in configuration file
> with "vcpupin" command by this patch, like "setmem" or
"setvcpus".
>
thanks for looking at this, I think this could be fixed but
there is just a couple of things i feel a bit uneasy with the patch:
- they work with arrays allocated on the stack of fixed
dimention (and rather big), i would rather see a dynamic
allocation of the array to a more reasonnable size and
growing them dynamically
Yeah, that may be rather big, thanks for the comment.
I changed the code to allocate the memory dynamically.
+ /* allocate memory for mapstr */
+ alloc_sz = (maplen * 32);
+ mapstr = malloc(alloc_sz);
+ if (mapstr == NULL)
+ return (-1);
+ memset(mapstr, 0, alloc_sz);
This is why I set (maplen * 32) as size for malloc.
- the limited of maplen is 8
- the maxmam cpu value is 2-digit and need to insert a comma for
each cpu (i.e. 0,1,2,....,64), so the maximal length will be 192
- as a result, the size we need is around 32 for each maplen
- the repeted use of strcat on each cpu pinning found makes
it a quadratic algorithm though it could really be linear
if one kept a pointer to the current end of the buffer
I'm not exactly sure what to do, but you may be concerned about
overflowing the actual space, right ? If so, how about this one ?
+ if (cpumap[i] & (1 << j)) {
+ len = snprintf(mapstr, alloc_sz, "%s%d,", mapstr, (8 * i) +
j);
+ if (len >= alloc_sz)
+ goto cleanup;
+ }
- the ranges variable is defined in the middle of the function,
this may look notmal in C++ but this is against the conventions
in libvirt C code.
Yes, it makes a lot of sense.
I reworked with your comment. Could you check it ?
Regards,
Saori Fukuta