diff mbox

[RFC,10/23] xen/biomerge: WORKAROUND always says the biovec are not mergeable

Message ID 1431622863-28575-11-git-send-email-julien.grall@citrix.com (mailing list archive)
State New, archived
Headers show

Commit Message

Julien Grall May 14, 2015, 5 p.m. UTC
When Linux is using 64K page granularity, every page will be slipt in
multiple non-contiguous 4K MFN.

I'm not sure how to handle efficiently the check to know whether we can
merge 2 biovec with a such case. So for now, always says that biovec are
not mergeable.

Signed-off-by: Julien Grall <julien.grall@citrix.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: David Vrabel <david.vrabel@citrix.com>
---
 drivers/xen/biomerge.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Boris Ostrovsky May 15, 2015, 3:54 p.m. UTC | #1
On 05/14/2015 01:00 PM, Julien Grall wrote:
> When Linux is using 64K page granularity, every page will be slipt in
> multiple non-contiguous 4K MFN.
>
> I'm not sure how to handle efficiently the check to know whether we can
> merge 2 biovec with a such case. So for now, always says that biovec are
> not mergeable.
>
> Signed-off-by: Julien Grall <julien.grall@citrix.com>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> Cc: David Vrabel <david.vrabel@citrix.com>
> ---
>   drivers/xen/biomerge.c | 3 +++
>   1 file changed, 3 insertions(+)
>
> diff --git a/drivers/xen/biomerge.c b/drivers/xen/biomerge.c
> index 0edb91c..20387c2 100644
> --- a/drivers/xen/biomerge.c
> +++ b/drivers/xen/biomerge.c
> @@ -9,6 +9,9 @@ bool xen_biovec_phys_mergeable(const struct bio_vec *vec1,
>   	unsigned long mfn1 = pfn_to_mfn(page_to_pfn(vec1->bv_page));
>   	unsigned long mfn2 = pfn_to_mfn(page_to_pfn(vec2->bv_page));
>   
> +	/* TODO: Implement it correctly */
> +	return 0;
> +
>   	return __BIOVEC_PHYS_MERGEABLE(vec1, vec2) &&
>   		((mfn1 == mfn2) || ((mfn1+1) == mfn2));
>   }


I think this is a bit too blunt.  Perhaps check first whether page sizes 
are different in the hypervisor and the guest?

(And I am not sure we need __BIOVEC_PHYS_MERGEABLE() test here as it is 
already checked by BIOVEC_PHYS_MERGEABLE() which appears to be the only 
user of xen_biovec_phys_mergeable())


-boris
Julien Grall May 19, 2015, 2:16 p.m. UTC | #2
Hi Boris,

On 15/05/15 16:54, Boris Ostrovsky wrote:
> On 05/14/2015 01:00 PM, Julien Grall wrote:
>> When Linux is using 64K page granularity, every page will be slipt in
>> multiple non-contiguous 4K MFN.
>>
>> I'm not sure how to handle efficiently the check to know whether we can
>> merge 2 biovec with a such case. So for now, always says that biovec are
>> not mergeable.
>>
>> Signed-off-by: Julien Grall <julien.grall@citrix.com>
>> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
>> Cc: David Vrabel <david.vrabel@citrix.com>
>> ---
>>   drivers/xen/biomerge.c | 3 +++
>>   1 file changed, 3 insertions(+)
>>
>> diff --git a/drivers/xen/biomerge.c b/drivers/xen/biomerge.c
>> index 0edb91c..20387c2 100644
>> --- a/drivers/xen/biomerge.c
>> +++ b/drivers/xen/biomerge.c
>> @@ -9,6 +9,9 @@ bool xen_biovec_phys_mergeable(const struct bio_vec
>> *vec1,
>>       unsigned long mfn1 = pfn_to_mfn(page_to_pfn(vec1->bv_page));
>>       unsigned long mfn2 = pfn_to_mfn(page_to_pfn(vec2->bv_page));
>>   +    /* TODO: Implement it correctly */
>> +    return 0;
>> +
>>       return __BIOVEC_PHYS_MERGEABLE(vec1, vec2) &&
>>           ((mfn1 == mfn2) || ((mfn1+1) == mfn2));
>>   }
> 
> 
> I think this is a bit too blunt.  Perhaps check first whether page sizes
> are different in the hypervisor and the guest?

Sounds good.

> 
> (And I am not sure we need __BIOVEC_PHYS_MERGEABLE() test here as it is
> already checked by BIOVEC_PHYS_MERGEABLE() which appears to be the only
> user of xen_biovec_phys_mergeable())

I can send a patch to drop __BIOVEC_PHYS_MERGEABLE.

Regards,
diff mbox

Patch

diff --git a/drivers/xen/biomerge.c b/drivers/xen/biomerge.c
index 0edb91c..20387c2 100644
--- a/drivers/xen/biomerge.c
+++ b/drivers/xen/biomerge.c
@@ -9,6 +9,9 @@  bool xen_biovec_phys_mergeable(const struct bio_vec *vec1,
 	unsigned long mfn1 = pfn_to_mfn(page_to_pfn(vec1->bv_page));
 	unsigned long mfn2 = pfn_to_mfn(page_to_pfn(vec2->bv_page));
 
+	/* TODO: Implement it correctly */
+	return 0;
+
 	return __BIOVEC_PHYS_MERGEABLE(vec1, vec2) &&
 		((mfn1 == mfn2) || ((mfn1+1) == mfn2));
 }