> > > diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c
> > > index 43cea3d818..4ec65a751a 100644
> > > --- a/hw/mem/cxl_type3.c
> > > +++ b/hw/mem/cxl_type3.c
> >
> > > +/*
> > > + * Check whether a DPA range [dpa, dpa + len) has been backed with DC
> > > extents.
> > > + * Used when validating read/write to dc regions
> > > + */
> > > +bool ct3_test_region_block_backed(CXLType3Dev *ct3d, uint64_t dpa,
> > > + uint64_t len)
> > > +{
> > > + CXLDCDRegion *region;
> > > + uint64_t nbits;
> > > + long nr;
> > > +
> > > + region = cxl_find_dc_region(ct3d, dpa, len);
> > > + if (!region) {
> > > + return false;
> > > + }
> > > +
> > > + nr = (dpa - region->base) / region->block_size;
> > > + nbits = DIV_ROUND_UP(len, region->block_size);
> > > + return find_next_zero_bit(region->blk_bitmap, nr + nbits, nr) == nr
> > > + nbits;
> > I'm not sure how this works... Is it taking a size or an end point?
> >
> > Linux equivalent takes size, so I'd expect
> >
> > return find_next_zero_bit(region->blk_bitmap, nbits, nr);
> > Perhaps a comment would avoid any future confusion on this.
> >
>
> My understanding is that the size is the size of the bitmap, which is
> also end of the range to check, not the length of the range to check.
>
> The function find_next_zero_bit(bitmap, size, offset) checks the bitmap range
> [offset, size) to find the next unset bit, for the above test, we want to
> check range [nr, nr + nbits), so the arguments passed to the function
> should be right.
>
> In the definition of the function, whenever offset >= size, it returns size
> because size is the end of the range, So if we pass nbits and nr
> to the function and nr >= nbits, which can be common, meaning
> (dpa-region_base)
> \> len, the function will always return true; that is not what we want.
>
> To sum up, the second parameter of the function should always be the end
> of the range to check, for our case, it is nr + nbits.
Ok. Thanks for the explanation. That sounds good to me
Jonathan
>
> Fan