diff mbox

xen: use native disk xenbus protocol if possible

Message ID 1466162096-4934-1-git-send-email-jgross@suse.com
State New
Headers show

Commit Message

Jürgen Groß June 17, 2016, 11:14 a.m. UTC
The qdisk implementation is using the native xenbus protocol only in
case of no protocol specified at all. As using the explicit 32- or
64-bit protocol is slower than the native one due to copying requests
not by memcpy but element for element, this is not optimal.

Correct this by using the native protocol in case word sizes of
frontend and backend match.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 hw/block/xen_disk.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

Comments

Jürgen Groß June 27, 2016, 10:54 a.m. UTC | #1
On 17/06/16 13:14, Juergen Gross wrote:
> The qdisk implementation is using the native xenbus protocol only in
> case of no protocol specified at all. As using the explicit 32- or
> 64-bit protocol is slower than the native one due to copying requests
> not by memcpy but element for element, this is not optimal.
> 
> Correct this by using the native protocol in case word sizes of
> frontend and backend match.

Ping?

> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
> ---
>  hw/block/xen_disk.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c
> index 2862b59..0961fcb 100644
> --- a/hw/block/xen_disk.c
> +++ b/hw/block/xen_disk.c
> @@ -976,14 +976,14 @@ static int blk_connect(struct XenDevice *xendev)
>          blkdev->feature_persistent = !!pers;
>      }
>  
> -    blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
> -    if (blkdev->xendev.protocol) {
> -        if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_32) == 0) {
> -            blkdev->protocol = BLKIF_PROTOCOL_X86_32;
> -        }
> -        if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_64) == 0) {
> -            blkdev->protocol = BLKIF_PROTOCOL_X86_64;
> -        }
> +    if (!blkdev->xendev.protocol) {
> +        blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
> +    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_NATIVE) == 0) {
> +        blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
> +    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_32) == 0) {
> +        blkdev->protocol = BLKIF_PROTOCOL_X86_32;
> +    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_64) == 0) {
> +        blkdev->protocol = BLKIF_PROTOCOL_X86_64;
>      }
>  
>      blkdev->sring = xengnttab_map_grant_ref(blkdev->xendev.gnttabdev,
>
Anthony PERARD June 29, 2016, 3:20 p.m. UTC | #2
On Fri, Jun 17, 2016 at 01:14:56PM +0200, Juergen Gross wrote:
> The qdisk implementation is using the native xenbus protocol only in
> case of no protocol specified at all. As using the explicit 32- or
> 64-bit protocol is slower than the native one due to copying requests
> not by memcpy but element for element, this is not optimal.
> 
> Correct this by using the native protocol in case word sizes of
> frontend and backend match.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
> ---
>  hw/block/xen_disk.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c
> index 2862b59..0961fcb 100644
> --- a/hw/block/xen_disk.c
> +++ b/hw/block/xen_disk.c
> @@ -976,14 +976,14 @@ static int blk_connect(struct XenDevice *xendev)
>          blkdev->feature_persistent = !!pers;
>      }
>  
> -    blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
> -    if (blkdev->xendev.protocol) {
> -        if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_32) == 0) {
> -            blkdev->protocol = BLKIF_PROTOCOL_X86_32;
> -        }
> -        if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_64) == 0) {
> -            blkdev->protocol = BLKIF_PROTOCOL_X86_64;
> -        }
> +    if (!blkdev->xendev.protocol) {
> +        blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
> +    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_NATIVE) == 0) {
> +        blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
> +    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_32) == 0) {
> +        blkdev->protocol = BLKIF_PROTOCOL_X86_32;
> +    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_64) == 0) {
> +        blkdev->protocol = BLKIF_PROTOCOL_X86_64;

There is one difference with the previous code, in case the protocol is
specified, but it not x86_32 or x86_64, then no blkdev->protocol is
selected (then no ring is initialized). Could you re-add this case?
Jürgen Groß June 29, 2016, 3:38 p.m. UTC | #3
On 29/06/16 17:20, Anthony PERARD wrote:
> On Fri, Jun 17, 2016 at 01:14:56PM +0200, Juergen Gross wrote:
>> The qdisk implementation is using the native xenbus protocol only in
>> case of no protocol specified at all. As using the explicit 32- or
>> 64-bit protocol is slower than the native one due to copying requests
>> not by memcpy but element for element, this is not optimal.
>>
>> Correct this by using the native protocol in case word sizes of
>> frontend and backend match.
>>
>> Signed-off-by: Juergen Gross <jgross@suse.com>
>> ---
>>  hw/block/xen_disk.c | 16 ++++++++--------
>>  1 file changed, 8 insertions(+), 8 deletions(-)
>>
>> diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c
>> index 2862b59..0961fcb 100644
>> --- a/hw/block/xen_disk.c
>> +++ b/hw/block/xen_disk.c
>> @@ -976,14 +976,14 @@ static int blk_connect(struct XenDevice *xendev)
>>          blkdev->feature_persistent = !!pers;
>>      }
>>  
>> -    blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
>> -    if (blkdev->xendev.protocol) {
>> -        if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_32) == 0) {
>> -            blkdev->protocol = BLKIF_PROTOCOL_X86_32;
>> -        }
>> -        if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_64) == 0) {
>> -            blkdev->protocol = BLKIF_PROTOCOL_X86_64;
>> -        }
>> +    if (!blkdev->xendev.protocol) {
>> +        blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
>> +    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_NATIVE) == 0) {
>> +        blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
>> +    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_32) == 0) {
>> +        blkdev->protocol = BLKIF_PROTOCOL_X86_32;
>> +    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_64) == 0) {
>> +        blkdev->protocol = BLKIF_PROTOCOL_X86_64;
> 
> There is one difference with the previous code, in case the protocol is
> specified, but it not x86_32 or x86_64, then no blkdev->protocol is
> selected (then no ring is initialized). Could you re-add this case?

Aah, of course!

Thanks,

Juergen
diff mbox

Patch

diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c
index 2862b59..0961fcb 100644
--- a/hw/block/xen_disk.c
+++ b/hw/block/xen_disk.c
@@ -976,14 +976,14 @@  static int blk_connect(struct XenDevice *xendev)
         blkdev->feature_persistent = !!pers;
     }
 
-    blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
-    if (blkdev->xendev.protocol) {
-        if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_32) == 0) {
-            blkdev->protocol = BLKIF_PROTOCOL_X86_32;
-        }
-        if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_64) == 0) {
-            blkdev->protocol = BLKIF_PROTOCOL_X86_64;
-        }
+    if (!blkdev->xendev.protocol) {
+        blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
+    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_NATIVE) == 0) {
+        blkdev->protocol = BLKIF_PROTOCOL_NATIVE;
+    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_32) == 0) {
+        blkdev->protocol = BLKIF_PROTOCOL_X86_32;
+    } else if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_64) == 0) {
+        blkdev->protocol = BLKIF_PROTOCOL_X86_64;
     }
 
     blkdev->sring = xengnttab_map_grant_ref(blkdev->xendev.gnttabdev,