On 10/21/22 10:41, Logan Gunthorpe wrote: > Consecutive zone device pages should not be merged into the same sgl > or bvec segment with other types of pages or if they belong to different > pgmaps. Otherwise getting the pgmap of a given segment is not possible > without scanning the entire segment. This helper returns true either if > both pages are not zone device pages or both pages are zone device > pages with the same pgmap. > > Factor out the check for page mergability into a pages_are_mergable() > helper and add a check with zone_device_pages_are_mergeable(). > > Signed-off-by: Logan Gunthorpe <logang@xxxxxxxxxxxx> > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > --- > lib/scatterlist.c | 25 +++++++++++++++---------- > 1 file changed, 15 insertions(+), 10 deletions(-) > > diff --git a/lib/scatterlist.c b/lib/scatterlist.c > index c8c3d675845c..a0ad2a7959b5 100644 > --- a/lib/scatterlist.c > +++ b/lib/scatterlist.c > @@ -410,6 +410,15 @@ static struct scatterlist *get_next_sg(struct sg_append_table *table, > return new_sg; > } > > +static bool pages_are_mergeable(struct page *a, struct page *b) > +{ > + if (page_to_pfn(a) != page_to_pfn(b) + 1) > + return false; > + if (!zone_device_pages_have_same_pgmap(a, b)) > + return false; > + return true; > +} > + not sure if it makes sense to make it inline ? either way, Reviewed-by: Chaitanya Kulkarni <kch@xxxxxxxxxx> -ck