1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun #include <linux/bio.h> 3*4882a593Smuzhiyun #include <linux/export.h> 4*4882a593Smuzhiyun #include <xen/xen.h> 5*4882a593Smuzhiyun #include <xen/page.h> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun /* check if @page can be merged with 'vec1' */ xen_biovec_phys_mergeable(const struct bio_vec * vec1,const struct page * page)8*4882a593Smuzhiyunbool xen_biovec_phys_mergeable(const struct bio_vec *vec1, 9*4882a593Smuzhiyun const struct page *page) 10*4882a593Smuzhiyun { 11*4882a593Smuzhiyun #if XEN_PAGE_SIZE == PAGE_SIZE 12*4882a593Smuzhiyun unsigned long bfn1 = pfn_to_bfn(page_to_pfn(vec1->bv_page)); 13*4882a593Smuzhiyun unsigned long bfn2 = pfn_to_bfn(page_to_pfn(page)); 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun return bfn1 + PFN_DOWN(vec1->bv_offset + vec1->bv_len) == bfn2; 16*4882a593Smuzhiyun #else 17*4882a593Smuzhiyun /* 18*4882a593Smuzhiyun * XXX: Add support for merging bio_vec when using different page 19*4882a593Smuzhiyun * size in Xen and Linux. 20*4882a593Smuzhiyun */ 21*4882a593Smuzhiyun return false; 22*4882a593Smuzhiyun #endif 23*4882a593Smuzhiyun } 24