On Thu, Aug 12, 2021 at 10:41:44AM +0200, Hanna Reitz wrote: > As we have attempted before > (https://lists.gnu.org/archive/html/qemu-devel/2019-01/msg06451.html, > "file-posix: Cache lseek result for data regions"; > https://lists.nongnu.org/archive/html/qemu-block/2021-02/msg00934.html, > "file-posix: Cache next hole"), this patch seeks to reduce the number of > SEEK_DATA/HOLE operations the file-posix driver has to perform. The > main difference is that this time it is implemented as part of the > general block layer code. >
> We only use the cache for nodes without children (i.e. protocol nodes), > because that is where the problem is: Drivers that rely on block-status > implementations outside of qemu (e.g. SEEK_DATA/HOLE). > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/307 > Signed-off-by: Hanna Reitz <hre...@redhat.com> > --- > +++ b/block.c > +/** > + * Check whether [offset, offset + bytes) overlaps with the cached > + * block-status data region. > + * > + * If so, and @pnum is not NULL, set *pnum to `bsc.data_end - offset`, > + * which is what bdrv_bsc_is_data()'s interface needs. > + * Otherwise, *pnum is not touched. Why duplicate this comment,... > + */ > +static bool bdrv_bsc_range_overlaps_locked(BlockDriverState *bs, > + int64_t offset, int64_t bytes, > + int64_t *pnum) > +{ > + BdrvBlockStatusCache *bsc = qatomic_rcu_read(&bs->block_status_cache); > + bool overlaps; > + > + overlaps = > + qatomic_read(&bsc->valid) && > + ranges_overlap(offset, bytes, bsc->data_start, > + bsc->data_end - bsc->data_start); > + > + if (overlaps && pnum) { > + *pnum = bsc->data_end - offset; > + } > + > + return overlaps; > +} > + > +/** > + * See block_int.h for this function's documentation. > + */ > +bool bdrv_bsc_is_data(BlockDriverState *bs, int64_t offset, int64_t *pnum) > +{ > + RCU_READ_LOCK_GUARD(); > + > + return bdrv_bsc_range_overlaps_locked(bs, offset, 1, pnum); > +} > + > +/** > + * See block_int.h for this function's documentation. ...but not these? But that's minor. Reviewed-by: Eric Blake <ebl...@redhat.com> -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org