On Fri, Apr 29, 2022 at 08:45:35AM -0700, Yury Norov wrote: > On Fri, Apr 29, 2022 at 03:59:25PM +0300, Andy Shevchenko wrote: > > On Thu, Apr 28, 2022 at 01:51:13PM -0700, Yury Norov wrote: > > > Manipulating 64-bit arrays with bitmap functions is potentially dangerous > > > because on 32-bit BE machines the order of halfwords doesn't match. > > > Another issue is that compiler may throw a warning about out-of-boundary > > > access. > > > > > > This patch adds bitmap_{from,to}_arr64 functions in addition to existing > > > bitmap_{from,to}_arr32. > > > > ... > > > > > + bitmap_copy_clear_tail((unsigned long *) (bitmap), \ > > > + (const unsigned long *) (buf), (nbits)) > > > > Drop spaces after castings. Besides that it might be placed on a single line. > > > > ... > > OK > > > > > > + bitmap_copy_clear_tail((unsigned long *) (buf), \ > > > + (const unsigned long *) (bitmap), (nbits)) > > > > Ditto. > > > > ... > > > > > +void bitmap_to_arr64(u64 *buf, const unsigned long *bitmap, unsigned int nbits) > > > +{ > > > + const unsigned long *end = bitmap + BITS_TO_LONGS(nbits); > > > + > > > + while (bitmap < end) { > > > + *buf = *bitmap++; > > > + if (bitmap < end) > > > + *buf |= (u64)(*bitmap++) << 32; > > > + buf++; > > > + } > > > > > > + /* Clear tail bits in last element of array beyond nbits. */ > > > + if (nbits % 64) > > > + buf[-1] &= GENMASK_ULL(nbits, 0); > > > > Hmm... if nbits is > 0 and < 64, wouldn't be this problematic, since > > end == bitmap? Or did I miss something? > > BITS_TO_LONGS(0) == 0 > BITS_TO_LONGS(1..32) == 1 > BITS_TO_LONGS(33..64) == 2 > > The only potential problem with buf[-1] is nbits == 0, but fortunately > (0 % 64) == 0, and it doesn't happen. > > Thanks, > Yury Are there any other concerns? If no, I'll fix formatting and append it to bitmap-for-next. Thanks, Yury