Hi Tristan,
Sorry for the delay, I didn't have as much spare time last week at
OLS as I was hoping. A few comments on this patch below. Thanks,
Alex
On Tue, 2006-07-18 at 11:03 +0200, Tristan Gingold wrote:
> +
> +#define BITS_PER_LONG (sizeof(unsigned long) * 8)
> +#define BITMAP_SIZE ((max_pfn + BITS_PER_LONG - 1) / 8)
Looks like this is just borrowed from the x86 flavors, but I'm not
sure it makes sense. It appears we're rounding BITMAP_SIZE up, but why
not round it up to an even multiple of longs? Would something like this
work better:
(((max_pfn + (BITS_PER_LONG - 1)) & ~(BITS_PER_LONG - 1)) / 8)
> + /* Dirtied pages won't be saved.
> + slightly wasteful to peek the whole array evey time,
> + but this is fast enough for the moment. */
> + if (!last_iter) {
> + /* FIXME!! */
> + for (i = 0; i < BITMAP_SIZE; i += PAGE_SIZE)
> + to_send[i] = 0;
This zero'ing loop is repeated in several places, but it doesn't make
sense to me. BITMAP_SIZE is in bytes, to_send is an unsigned long
pointer, and the PAGE_SIZE increment seems rather random. Looks like it
should segfault and only very sparsely zero the bitmap array. Am I
missing the point?
> +
> free (page_array);
> -
> + free (to_send);
> + free (to_skip);
Shouldn't we check for NULL before free'ing?
if (to_send)
free(to_send);
etc...
> +
> + atomic64_set (&d->arch.shadow_fault_count, 0);
> + atomic64_set (&d->arch.shadow_dirty_count, 0);
> +
> + d->arch.shadow_bitmap_size = (d->max_pages + 63) &
> ~63;
63 may be an obvious value, but I prefer the (BITS_PER_LONG - 1)
usage in the userspace tools. Magic numbers are bad.
> +
> + if ( sc->pages > d->arch.shadow_bitmap_size )
> + sc->pages = d->arch.shadow_bitmap_size;
> +
> +#define chunk (8*1024) /* Transfer and clear in 1kB chunks for L1
> cache. */
Please move this #define out of the function and rename it to
something in all caps so it's easy to recognize as a macro.
> + for ( i = 0; i < sc->pages; i += chunk )
> + {
> + int bytes = ((((sc->pages - i) > chunk) ?
> + chunk : (sc->pages - i)) + 7) /
> 8;
> +
> + if ( copy_to_guest_offset(
> + sc->dirty_bitmap,
> + i/(8*sizeof(unsigned long)),
> + d->arch.shadow_bitmap
> +(i/(8*sizeof(unsigned long))),
BITS_PER_LONG would seem to be a useful simplification here.
> +
> + if ( sc->pages > d->arch.shadow_bitmap_size )
> + sc->pages = d->arch.shadow_bitmap_size;
> +
> + if ( copy_to_guest(sc->dirty_bitmap,
> + d->arch.shadow_bitmap,
> + (((sc->pages+7)/8)+sizeof(unsigned
> long)-1) /
> + sizeof(unsigned long)) )
A comment might be in order for the calculations going on in this
last parameter.
>
> + /* Bitmap of shadow dirty bits.
> + Set iff shadow mode is enabled. */
> + u64 *shadow_bitmap;
> + /* Length (in byte) of shadow bitmap. */
> + unsigned long shadow_bitmap_size;
The usage of shadow_bitmap_size seems to be in bits. Is this comment
correct?
--
Alex Williamson HP Open Source & Linux Org.
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|