[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 4/7] bitmap: move to/from xenctl_bitmap conversion helpers
On 07/08/2020 12:33, Jan Beulich wrote: > --- a/xen/common/bitmap.c > +++ b/xen/common/bitmap.c > @@ -384,3 +386,87 @@ void bitmap_byte_to_long(unsigned long * > } > > #endif > + > +int bitmap_to_xenctl_bitmap(struct xenctl_bitmap *xenctl_bitmap, > + const unsigned long *bitmap, unsigned int nbits) > +{ > + unsigned int guest_bytes, copy_bytes, i; > + uint8_t zero = 0; > + int err = 0; > + uint8_t *bytemap = xmalloc_array(uint8_t, (nbits + 7) / 8); > + > + if ( !bytemap ) > + return -ENOMEM; > + > + guest_bytes = (xenctl_bitmap->nr_bits + 7) / 8; > + copy_bytes = min_t(unsigned int, guest_bytes, (nbits + 7) / 8); > + > + bitmap_long_to_byte(bytemap, bitmap, nbits); > + > + if ( copy_bytes != 0 ) > + if ( copy_to_guest(xenctl_bitmap->bitmap, bytemap, copy_bytes) ) > + err = -EFAULT; > + > + for ( i = copy_bytes; !err && i < guest_bytes; i++ ) > + if ( copy_to_guest_offset(xenctl_bitmap->bitmap, i, &zero, 1) ) > + err = -EFAULT; > + > + xfree(bytemap); > + > + return err; > +} > + > +int xenctl_bitmap_to_bitmap(unsigned long *bitmap, > + const struct xenctl_bitmap *xenctl_bitmap, > + unsigned int nbits) > +{ > + unsigned int guest_bytes, copy_bytes; > + int err = 0; > + uint8_t *bytemap = xzalloc_array(uint8_t, (nbits + 7) / 8); > + > + if ( !bytemap ) > + return -ENOMEM; > + > + guest_bytes = (xenctl_bitmap->nr_bits + 7) / 8; > + copy_bytes = min_t(unsigned int, guest_bytes, (nbits + 7) / 8); > + > + if ( copy_bytes != 0 ) > + { > + if ( copy_from_guest(bytemap, xenctl_bitmap->bitmap, copy_bytes) ) > + err = -EFAULT; > + if ( (xenctl_bitmap->nr_bits & 7) && (guest_bytes == copy_bytes) ) > + bytemap[guest_bytes-1] &= ~(0xff << (xenctl_bitmap->nr_bits & > 7)); > + } > + > + if ( !err ) > + bitmap_byte_to_long(bitmap, bytemap, nbits); > + > + xfree(bytemap); > + > + return err; > +} > + > +int cpumask_to_xenctl_bitmap(struct xenctl_bitmap *xenctl_cpumap, > + const cpumask_t *cpumask) > +{ > + return bitmap_to_xenctl_bitmap(xenctl_cpumap, cpumask_bits(cpumask), > + nr_cpu_ids); > +} > + > +int xenctl_bitmap_to_cpumask(cpumask_var_t *cpumask, > + const struct xenctl_bitmap *xenctl_cpumap) > +{ > + int err = 0; > + > + if ( alloc_cpumask_var(cpumask) ) { At a minimum, please fix this style during the move. However, the more I look at this code, the more concerned I get. There is absolutely no need to allocate(/doubly allocate) memory or double/triple bounce buffer the data. All that is necessary is some careful handling of the copy length, and trailing zeroing. The cpumask variants should be trivial static inline wrapper. The fact that they're not suggests an API error. In reality, these are just data-shuffling helpers, and would probably live better in a guest-access.c if we had a suitable one to hand, but I guess bitmap.c will have to do for now. ~Andrew
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |