xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix
@ 2016-06-20  7:55 Juergen Gross
  2016-06-20  7:55 ` [PATCH v3 1/2] xen: fix style of hw/block/xen_blkif.h Juergen Gross
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Juergen Gross @ 2016-06-20  7:55 UTC (permalink / raw)
  To: qemu-devel, xen-devel; +Cc: anthony.perard, Juergen Gross, sstabellini, kraxel

In case the word size of the domU and qemu running the qdisk backend
differ BLKIF_OP_DISCARD will not work reliably, as the request
structure in the ring have different layouts for different word size.

Correct this by copying the request structure in case of different
word size element by element in the BLKIF_OP_DISCARD case, too.

Changes in V3:
- revert V2
- add patch 1 to use qemu coding style for hw/block/xen_blkif.h

Changes in V2:
- resync with Linux kernel version of hw/block/xen_blkif.h as
  suggested by Paul Durrant

Juergen Gross (2):
  xen: fix style of hw/block/xen_blkif.h
  xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix

 hw/block/xen_blkif.h | 167 ++++++++++++++++++++++++++++++---------------------
 1 file changed, 97 insertions(+), 70 deletions(-)

-- 
2.6.6

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v3 1/2] xen: fix style of hw/block/xen_blkif.h
  2016-06-20  7:55 [PATCH v3 0/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix Juergen Gross
@ 2016-06-20  7:55 ` Juergen Gross
  2016-06-20  9:48   ` Stefano Stabellini
  2016-06-20  7:55 ` [PATCH v3 2/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix Juergen Gross
  2016-06-20  9:53 ` [PATCH v3 0/2] " Stefano Stabellini
  2 siblings, 1 reply; 6+ messages in thread
From: Juergen Gross @ 2016-06-20  7:55 UTC (permalink / raw)
  To: qemu-devel, xen-devel; +Cc: anthony.perard, Juergen Gross, sstabellini, kraxel

Fix hw/block/xen_blkif.h to match qemu coding style.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 hw/block/xen_blkif.h | 151 +++++++++++++++++++++++++++------------------------
 1 file changed, 81 insertions(+), 70 deletions(-)

diff --git a/hw/block/xen_blkif.h b/hw/block/xen_blkif.h
index e3b133b..7ccf92e 100644
--- a/hw/block/xen_blkif.h
+++ b/hw/block/xen_blkif.h
@@ -5,31 +5,33 @@
 #include <xen/io/blkif.h>
 #include <xen/io/protocols.h>
 
-/* Not a real protocol.  Used to generate ring structs which contain
+/*
+ * Not a real protocol.  Used to generate ring structs which contain
  * the elements common to all protocols only.  This way we get a
  * compiler-checkable way to use common struct elements, so we can
- * avoid using switch(protocol) in a number of places.  */
+ * avoid using switch(protocol) in a number of places.
+ */
 struct blkif_common_request {
-	char dummy;
+    char dummy;
 };
 struct blkif_common_response {
-	char dummy;
+    char dummy;
 };
 
 /* i386 protocol version */
 #pragma pack(push, 4)
 struct blkif_x86_32_request {
-	uint8_t        operation;    /* BLKIF_OP_???                         */
-	uint8_t        nr_segments;  /* number of segments                   */
-	blkif_vdev_t   handle;       /* only for read/write requests         */
-	uint64_t       id;           /* private guest value, echoed in resp  */
-	blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
-	struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
+    uint8_t        operation;        /* BLKIF_OP_???                         */
+    uint8_t        nr_segments;      /* number of segments                   */
+    blkif_vdev_t   handle;           /* only for read/write requests         */
+    uint64_t       id;               /* private guest value, echoed in resp  */
+    blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
+    struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
 };
 struct blkif_x86_32_response {
-	uint64_t        id;              /* copied from request */
-	uint8_t         operation;       /* copied from request */
-	int16_t         status;          /* BLKIF_RSP_???       */
+    uint64_t        id;              /* copied from request */
+    uint8_t         operation;       /* copied from request */
+    int16_t         status;          /* BLKIF_RSP_???       */
 };
 typedef struct blkif_x86_32_request blkif_x86_32_request_t;
 typedef struct blkif_x86_32_response blkif_x86_32_response_t;
@@ -37,83 +39,92 @@ typedef struct blkif_x86_32_response blkif_x86_32_response_t;
 
 /* x86_64 protocol version */
 struct blkif_x86_64_request {
-	uint8_t        operation;    /* BLKIF_OP_???                         */
-	uint8_t        nr_segments;  /* number of segments                   */
-	blkif_vdev_t   handle;       /* only for read/write requests         */
-	uint64_t       __attribute__((__aligned__(8))) id;
-	blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
-	struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
+    uint8_t        operation;        /* BLKIF_OP_???                         */
+    uint8_t        nr_segments;      /* number of segments                   */
+    blkif_vdev_t   handle;           /* only for read/write requests         */
+    uint64_t       __attribute__((__aligned__(8))) id;
+    blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
+    struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
 };
 struct blkif_x86_64_response {
-	uint64_t       __attribute__((__aligned__(8))) id;
-	uint8_t         operation;       /* copied from request */
-	int16_t         status;          /* BLKIF_RSP_???       */
+    uint64_t       __attribute__((__aligned__(8))) id;
+    uint8_t         operation;       /* copied from request */
+    int16_t         status;          /* BLKIF_RSP_???       */
 };
 typedef struct blkif_x86_64_request blkif_x86_64_request_t;
 typedef struct blkif_x86_64_response blkif_x86_64_response_t;
 
-DEFINE_RING_TYPES(blkif_common, struct blkif_common_request, struct blkif_common_response);
-DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request, struct blkif_x86_32_response);
-DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request, struct blkif_x86_64_response);
+DEFINE_RING_TYPES(blkif_common, struct blkif_common_request,
+                  struct blkif_common_response);
+DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request,
+                  struct blkif_x86_32_response);
+DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request,
+                  struct blkif_x86_64_response);
 
 union blkif_back_rings {
-	blkif_back_ring_t        native;
-	blkif_common_back_ring_t common;
-        blkif_x86_32_back_ring_t x86_32_part;
-        blkif_x86_64_back_ring_t x86_64_part;
+    blkif_back_ring_t        native;
+    blkif_common_back_ring_t common;
+    blkif_x86_32_back_ring_t x86_32_part;
+    blkif_x86_64_back_ring_t x86_64_part;
 };
 typedef union blkif_back_rings blkif_back_rings_t;
 
 enum blkif_protocol {
-	BLKIF_PROTOCOL_NATIVE = 1,
-	BLKIF_PROTOCOL_X86_32 = 2,
-	BLKIF_PROTOCOL_X86_64 = 3,
+    BLKIF_PROTOCOL_NATIVE = 1,
+    BLKIF_PROTOCOL_X86_32 = 2,
+    BLKIF_PROTOCOL_X86_64 = 3,
 };
 
-static inline void blkif_get_x86_32_req(blkif_request_t *dst, blkif_x86_32_request_t *src)
+static inline void blkif_get_x86_32_req(blkif_request_t *dst,
+                                        blkif_x86_32_request_t *src)
 {
-	int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
+    int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
 
-	dst->operation = src->operation;
-	dst->nr_segments = src->nr_segments;
-	dst->handle = src->handle;
-	dst->id = src->id;
-	dst->sector_number = src->sector_number;
-	/* Prevent the compiler from using src->... instead. */
-	barrier();
-	if (dst->operation == BLKIF_OP_DISCARD) {
-		struct blkif_request_discard *s = (void *)src;
-		struct blkif_request_discard *d = (void *)dst;
-		d->nr_sectors = s->nr_sectors;
-		return;
-	}
-	if (n > dst->nr_segments)
-		n = dst->nr_segments;
-	for (i = 0; i < n; i++)
-		dst->seg[i] = src->seg[i];
+    dst->operation = src->operation;
+    dst->nr_segments = src->nr_segments;
+    dst->handle = src->handle;
+    dst->id = src->id;
+    dst->sector_number = src->sector_number;
+    /* Prevent the compiler from using src->... instead. */
+    barrier();
+    if (dst->operation == BLKIF_OP_DISCARD) {
+        struct blkif_request_discard *s = (void *)src;
+        struct blkif_request_discard *d = (void *)dst;
+        d->nr_sectors = s->nr_sectors;
+        return;
+    }
+    if (n > dst->nr_segments) {
+        n = dst->nr_segments;
+    }
+    for (i = 0; i < n; i++) {
+        dst->seg[i] = src->seg[i];
+    }
 }
 
-static inline void blkif_get_x86_64_req(blkif_request_t *dst, blkif_x86_64_request_t *src)
+static inline void blkif_get_x86_64_req(blkif_request_t *dst,
+                                        blkif_x86_64_request_t *src)
 {
-	int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
+    int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
 
-	dst->operation = src->operation;
-	dst->nr_segments = src->nr_segments;
-	dst->handle = src->handle;
-	dst->id = src->id;
-	dst->sector_number = src->sector_number;
-	/* Prevent the compiler from using src->... instead. */
-	barrier();
-	if (dst->operation == BLKIF_OP_DISCARD) {
-		struct blkif_request_discard *s = (void *)src;
-		struct blkif_request_discard *d = (void *)dst;
-		d->nr_sectors = s->nr_sectors;
-		return;
-	}
-	if (n > dst->nr_segments)
-		n = dst->nr_segments;
-	for (i = 0; i < n; i++)
-		dst->seg[i] = src->seg[i];
+    dst->operation = src->operation;
+    dst->nr_segments = src->nr_segments;
+    dst->handle = src->handle;
+    dst->id = src->id;
+    dst->sector_number = src->sector_number;
+    /* Prevent the compiler from using src->... instead. */
+    barrier();
+    if (dst->operation == BLKIF_OP_DISCARD) {
+        struct blkif_request_discard *s = (void *)src;
+        struct blkif_request_discard *d = (void *)dst;
+        d->nr_sectors = s->nr_sectors;
+        return;
+    }
+    if (n > dst->nr_segments) {
+        n = dst->nr_segments;
+    }
+    for (i = 0; i < n; i++) {
+        dst->seg[i] = src->seg[i];
+    }
 }
 
 #endif /* __XEN_BLKIF_H__ */
-- 
2.6.6

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v3 2/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix
  2016-06-20  7:55 [PATCH v3 0/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix Juergen Gross
  2016-06-20  7:55 ` [PATCH v3 1/2] xen: fix style of hw/block/xen_blkif.h Juergen Gross
@ 2016-06-20  7:55 ` Juergen Gross
  2016-06-20  9:52   ` Stefano Stabellini
  2016-06-20  9:53 ` [PATCH v3 0/2] " Stefano Stabellini
  2 siblings, 1 reply; 6+ messages in thread
From: Juergen Gross @ 2016-06-20  7:55 UTC (permalink / raw)
  To: qemu-devel, xen-devel; +Cc: anthony.perard, Juergen Gross, sstabellini, kraxel

In case the word size of the domU and qemu running the qdisk backend
differ BLKIF_OP_DISCARD will not work reliably, as the request
structure in the ring have different layouts for different word size.

Correct this by copying the request structure in case of different
word size element by element in the BLKIF_OP_DISCARD case, too.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 hw/block/xen_blkif.h | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/hw/block/xen_blkif.h b/hw/block/xen_blkif.h
index 7ccf92e..0738684 100644
--- a/hw/block/xen_blkif.h
+++ b/hw/block/xen_blkif.h
@@ -28,6 +28,14 @@ struct blkif_x86_32_request {
     blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
     struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
 };
+struct blkif_x86_32_request_discard {
+    uint8_t        operation;        /* BLKIF_OP_DISCARD                     */
+    uint8_t        flag;             /* nr_segments in request struct        */
+    blkif_vdev_t   handle;           /* only for read/write requests         */
+    uint64_t       id;               /* private guest value, echoed in resp  */
+    blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
+    uint64_t       nr_sectors;       /* # of contiguous sectors to discard   */
+};
 struct blkif_x86_32_response {
     uint64_t        id;              /* copied from request */
     uint8_t         operation;       /* copied from request */
@@ -46,6 +54,14 @@ struct blkif_x86_64_request {
     blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
     struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
 };
+struct blkif_x86_64_request_discard {
+    uint8_t        operation;        /* BLKIF_OP_DISCARD                     */
+    uint8_t        flag;             /* nr_segments in request struct        */
+    blkif_vdev_t   handle;           /* only for read/write requests         */
+    uint64_t       __attribute__((__aligned__(8))) id;
+    blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
+    uint64_t       nr_sectors;       /* # of contiguous sectors to discard   */
+};
 struct blkif_x86_64_response {
     uint64_t       __attribute__((__aligned__(8))) id;
     uint8_t         operation;       /* copied from request */
@@ -88,7 +104,7 @@ static inline void blkif_get_x86_32_req(blkif_request_t *dst,
     /* Prevent the compiler from using src->... instead. */
     barrier();
     if (dst->operation == BLKIF_OP_DISCARD) {
-        struct blkif_request_discard *s = (void *)src;
+        struct blkif_x86_32_request_discard *s = (void *)src;
         struct blkif_request_discard *d = (void *)dst;
         d->nr_sectors = s->nr_sectors;
         return;
@@ -114,7 +130,7 @@ static inline void blkif_get_x86_64_req(blkif_request_t *dst,
     /* Prevent the compiler from using src->... instead. */
     barrier();
     if (dst->operation == BLKIF_OP_DISCARD) {
-        struct blkif_request_discard *s = (void *)src;
+        struct blkif_x86_64_request_discard *s = (void *)src;
         struct blkif_request_discard *d = (void *)dst;
         d->nr_sectors = s->nr_sectors;
         return;
-- 
2.6.6

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 1/2] xen: fix style of hw/block/xen_blkif.h
  2016-06-20  7:55 ` [PATCH v3 1/2] xen: fix style of hw/block/xen_blkif.h Juergen Gross
@ 2016-06-20  9:48   ` Stefano Stabellini
  0 siblings, 0 replies; 6+ messages in thread
From: Stefano Stabellini @ 2016-06-20  9:48 UTC (permalink / raw)
  To: Juergen Gross; +Cc: anthony.perard, xen-devel, sstabellini, qemu-devel, kraxel

On Mon, 20 Jun 2016, Juergen Gross wrote:
> Fix hw/block/xen_blkif.h to match qemu coding style.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>

Acked-by: Stefano Stabellini <sstabellini@kernel.org>


>  hw/block/xen_blkif.h | 151 +++++++++++++++++++++++++++------------------------
>  1 file changed, 81 insertions(+), 70 deletions(-)
> 
> diff --git a/hw/block/xen_blkif.h b/hw/block/xen_blkif.h
> index e3b133b..7ccf92e 100644
> --- a/hw/block/xen_blkif.h
> +++ b/hw/block/xen_blkif.h
> @@ -5,31 +5,33 @@
>  #include <xen/io/blkif.h>
>  #include <xen/io/protocols.h>
>  
> -/* Not a real protocol.  Used to generate ring structs which contain
> +/*
> + * Not a real protocol.  Used to generate ring structs which contain
>   * the elements common to all protocols only.  This way we get a
>   * compiler-checkable way to use common struct elements, so we can
> - * avoid using switch(protocol) in a number of places.  */
> + * avoid using switch(protocol) in a number of places.
> + */
>  struct blkif_common_request {
> -	char dummy;
> +    char dummy;
>  };
>  struct blkif_common_response {
> -	char dummy;
> +    char dummy;
>  };
>  
>  /* i386 protocol version */
>  #pragma pack(push, 4)
>  struct blkif_x86_32_request {
> -	uint8_t        operation;    /* BLKIF_OP_???                         */
> -	uint8_t        nr_segments;  /* number of segments                   */
> -	blkif_vdev_t   handle;       /* only for read/write requests         */
> -	uint64_t       id;           /* private guest value, echoed in resp  */
> -	blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
> -	struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
> +    uint8_t        operation;        /* BLKIF_OP_???                         */
> +    uint8_t        nr_segments;      /* number of segments                   */
> +    blkif_vdev_t   handle;           /* only for read/write requests         */
> +    uint64_t       id;               /* private guest value, echoed in resp  */
> +    blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
> +    struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
>  };
>  struct blkif_x86_32_response {
> -	uint64_t        id;              /* copied from request */
> -	uint8_t         operation;       /* copied from request */
> -	int16_t         status;          /* BLKIF_RSP_???       */
> +    uint64_t        id;              /* copied from request */
> +    uint8_t         operation;       /* copied from request */
> +    int16_t         status;          /* BLKIF_RSP_???       */
>  };
>  typedef struct blkif_x86_32_request blkif_x86_32_request_t;
>  typedef struct blkif_x86_32_response blkif_x86_32_response_t;
> @@ -37,83 +39,92 @@ typedef struct blkif_x86_32_response blkif_x86_32_response_t;
>  
>  /* x86_64 protocol version */
>  struct blkif_x86_64_request {
> -	uint8_t        operation;    /* BLKIF_OP_???                         */
> -	uint8_t        nr_segments;  /* number of segments                   */
> -	blkif_vdev_t   handle;       /* only for read/write requests         */
> -	uint64_t       __attribute__((__aligned__(8))) id;
> -	blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
> -	struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
> +    uint8_t        operation;        /* BLKIF_OP_???                         */
> +    uint8_t        nr_segments;      /* number of segments                   */
> +    blkif_vdev_t   handle;           /* only for read/write requests         */
> +    uint64_t       __attribute__((__aligned__(8))) id;
> +    blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
> +    struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
>  };
>  struct blkif_x86_64_response {
> -	uint64_t       __attribute__((__aligned__(8))) id;
> -	uint8_t         operation;       /* copied from request */
> -	int16_t         status;          /* BLKIF_RSP_???       */
> +    uint64_t       __attribute__((__aligned__(8))) id;
> +    uint8_t         operation;       /* copied from request */
> +    int16_t         status;          /* BLKIF_RSP_???       */
>  };
>  typedef struct blkif_x86_64_request blkif_x86_64_request_t;
>  typedef struct blkif_x86_64_response blkif_x86_64_response_t;
>  
> -DEFINE_RING_TYPES(blkif_common, struct blkif_common_request, struct blkif_common_response);
> -DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request, struct blkif_x86_32_response);
> -DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request, struct blkif_x86_64_response);
> +DEFINE_RING_TYPES(blkif_common, struct blkif_common_request,
> +                  struct blkif_common_response);
> +DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request,
> +                  struct blkif_x86_32_response);
> +DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request,
> +                  struct blkif_x86_64_response);
>  
>  union blkif_back_rings {
> -	blkif_back_ring_t        native;
> -	blkif_common_back_ring_t common;
> -        blkif_x86_32_back_ring_t x86_32_part;
> -        blkif_x86_64_back_ring_t x86_64_part;
> +    blkif_back_ring_t        native;
> +    blkif_common_back_ring_t common;
> +    blkif_x86_32_back_ring_t x86_32_part;
> +    blkif_x86_64_back_ring_t x86_64_part;
>  };
>  typedef union blkif_back_rings blkif_back_rings_t;
>  
>  enum blkif_protocol {
> -	BLKIF_PROTOCOL_NATIVE = 1,
> -	BLKIF_PROTOCOL_X86_32 = 2,
> -	BLKIF_PROTOCOL_X86_64 = 3,
> +    BLKIF_PROTOCOL_NATIVE = 1,
> +    BLKIF_PROTOCOL_X86_32 = 2,
> +    BLKIF_PROTOCOL_X86_64 = 3,
>  };
>  
> -static inline void blkif_get_x86_32_req(blkif_request_t *dst, blkif_x86_32_request_t *src)
> +static inline void blkif_get_x86_32_req(blkif_request_t *dst,
> +                                        blkif_x86_32_request_t *src)
>  {
> -	int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
> +    int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
>  
> -	dst->operation = src->operation;
> -	dst->nr_segments = src->nr_segments;
> -	dst->handle = src->handle;
> -	dst->id = src->id;
> -	dst->sector_number = src->sector_number;
> -	/* Prevent the compiler from using src->... instead. */
> -	barrier();
> -	if (dst->operation == BLKIF_OP_DISCARD) {
> -		struct blkif_request_discard *s = (void *)src;
> -		struct blkif_request_discard *d = (void *)dst;
> -		d->nr_sectors = s->nr_sectors;
> -		return;
> -	}
> -	if (n > dst->nr_segments)
> -		n = dst->nr_segments;
> -	for (i = 0; i < n; i++)
> -		dst->seg[i] = src->seg[i];
> +    dst->operation = src->operation;
> +    dst->nr_segments = src->nr_segments;
> +    dst->handle = src->handle;
> +    dst->id = src->id;
> +    dst->sector_number = src->sector_number;
> +    /* Prevent the compiler from using src->... instead. */
> +    barrier();
> +    if (dst->operation == BLKIF_OP_DISCARD) {
> +        struct blkif_request_discard *s = (void *)src;
> +        struct blkif_request_discard *d = (void *)dst;
> +        d->nr_sectors = s->nr_sectors;
> +        return;
> +    }
> +    if (n > dst->nr_segments) {
> +        n = dst->nr_segments;
> +    }
> +    for (i = 0; i < n; i++) {
> +        dst->seg[i] = src->seg[i];
> +    }
>  }
>  
> -static inline void blkif_get_x86_64_req(blkif_request_t *dst, blkif_x86_64_request_t *src)
> +static inline void blkif_get_x86_64_req(blkif_request_t *dst,
> +                                        blkif_x86_64_request_t *src)
>  {
> -	int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
> +    int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
>  
> -	dst->operation = src->operation;
> -	dst->nr_segments = src->nr_segments;
> -	dst->handle = src->handle;
> -	dst->id = src->id;
> -	dst->sector_number = src->sector_number;
> -	/* Prevent the compiler from using src->... instead. */
> -	barrier();
> -	if (dst->operation == BLKIF_OP_DISCARD) {
> -		struct blkif_request_discard *s = (void *)src;
> -		struct blkif_request_discard *d = (void *)dst;
> -		d->nr_sectors = s->nr_sectors;
> -		return;
> -	}
> -	if (n > dst->nr_segments)
> -		n = dst->nr_segments;
> -	for (i = 0; i < n; i++)
> -		dst->seg[i] = src->seg[i];
> +    dst->operation = src->operation;
> +    dst->nr_segments = src->nr_segments;
> +    dst->handle = src->handle;
> +    dst->id = src->id;
> +    dst->sector_number = src->sector_number;
> +    /* Prevent the compiler from using src->... instead. */
> +    barrier();
> +    if (dst->operation == BLKIF_OP_DISCARD) {
> +        struct blkif_request_discard *s = (void *)src;
> +        struct blkif_request_discard *d = (void *)dst;
> +        d->nr_sectors = s->nr_sectors;
> +        return;
> +    }
> +    if (n > dst->nr_segments) {
> +        n = dst->nr_segments;
> +    }
> +    for (i = 0; i < n; i++) {
> +        dst->seg[i] = src->seg[i];
> +    }
>  }
>  
>  #endif /* __XEN_BLKIF_H__ */
> -- 
> 2.6.6
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 2/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix
  2016-06-20  7:55 ` [PATCH v3 2/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix Juergen Gross
@ 2016-06-20  9:52   ` Stefano Stabellini
  0 siblings, 0 replies; 6+ messages in thread
From: Stefano Stabellini @ 2016-06-20  9:52 UTC (permalink / raw)
  To: Juergen Gross; +Cc: anthony.perard, xen-devel, sstabellini, qemu-devel, kraxel

On Mon, 20 Jun 2016, Juergen Gross wrote:
> In case the word size of the domU and qemu running the qdisk backend
> differ BLKIF_OP_DISCARD will not work reliably, as the request
> structure in the ring have different layouts for different word size.
> 
> Correct this by copying the request structure in case of different
> word size element by element in the BLKIF_OP_DISCARD case, too.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>

Acked-by: Stefano Stabellini <sstabellini@kernel.org>


>  hw/block/xen_blkif.h | 20 ++++++++++++++++++--
>  1 file changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/block/xen_blkif.h b/hw/block/xen_blkif.h
> index 7ccf92e..0738684 100644
> --- a/hw/block/xen_blkif.h
> +++ b/hw/block/xen_blkif.h
> @@ -28,6 +28,14 @@ struct blkif_x86_32_request {
>      blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
>      struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
>  };
> +struct blkif_x86_32_request_discard {
> +    uint8_t        operation;        /* BLKIF_OP_DISCARD                     */
> +    uint8_t        flag;             /* nr_segments in request struct        */
> +    blkif_vdev_t   handle;           /* only for read/write requests         */
> +    uint64_t       id;               /* private guest value, echoed in resp  */
> +    blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
> +    uint64_t       nr_sectors;       /* # of contiguous sectors to discard   */
> +};
>  struct blkif_x86_32_response {
>      uint64_t        id;              /* copied from request */
>      uint8_t         operation;       /* copied from request */
> @@ -46,6 +54,14 @@ struct blkif_x86_64_request {
>      blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
>      struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
>  };
> +struct blkif_x86_64_request_discard {
> +    uint8_t        operation;        /* BLKIF_OP_DISCARD                     */
> +    uint8_t        flag;             /* nr_segments in request struct        */
> +    blkif_vdev_t   handle;           /* only for read/write requests         */
> +    uint64_t       __attribute__((__aligned__(8))) id;
> +    blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  */
> +    uint64_t       nr_sectors;       /* # of contiguous sectors to discard   */
> +};
>  struct blkif_x86_64_response {
>      uint64_t       __attribute__((__aligned__(8))) id;
>      uint8_t         operation;       /* copied from request */
> @@ -88,7 +104,7 @@ static inline void blkif_get_x86_32_req(blkif_request_t *dst,
>      /* Prevent the compiler from using src->... instead. */
>      barrier();
>      if (dst->operation == BLKIF_OP_DISCARD) {
> -        struct blkif_request_discard *s = (void *)src;
> +        struct blkif_x86_32_request_discard *s = (void *)src;
>          struct blkif_request_discard *d = (void *)dst;
>          d->nr_sectors = s->nr_sectors;
>          return;
> @@ -114,7 +130,7 @@ static inline void blkif_get_x86_64_req(blkif_request_t *dst,
>      /* Prevent the compiler from using src->... instead. */
>      barrier();
>      if (dst->operation == BLKIF_OP_DISCARD) {
> -        struct blkif_request_discard *s = (void *)src;
> +        struct blkif_x86_64_request_discard *s = (void *)src;
>          struct blkif_request_discard *d = (void *)dst;
>          d->nr_sectors = s->nr_sectors;
>          return;
> -- 
> 2.6.6
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 0/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix
  2016-06-20  7:55 [PATCH v3 0/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix Juergen Gross
  2016-06-20  7:55 ` [PATCH v3 1/2] xen: fix style of hw/block/xen_blkif.h Juergen Gross
  2016-06-20  7:55 ` [PATCH v3 2/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix Juergen Gross
@ 2016-06-20  9:53 ` Stefano Stabellini
  2 siblings, 0 replies; 6+ messages in thread
From: Stefano Stabellini @ 2016-06-20  9:53 UTC (permalink / raw)
  To: Juergen Gross; +Cc: anthony.perard, xen-devel, sstabellini, qemu-devel, kraxel

On Mon, 20 Jun 2016, Juergen Gross wrote:
> In case the word size of the domU and qemu running the qdisk backend
> differ BLKIF_OP_DISCARD will not work reliably, as the request
> structure in the ring have different layouts for different word size.
> 
> Correct this by copying the request structure in case of different
> word size element by element in the BLKIF_OP_DISCARD case, too.
> 
> Changes in V3:
> - revert V2
> - add patch 1 to use qemu coding style for hw/block/xen_blkif.h
> 
> Changes in V2:
> - resync with Linux kernel version of hw/block/xen_blkif.h as
>   suggested by Paul Durrant
> 
> Juergen Gross (2):
>   xen: fix style of hw/block/xen_blkif.h
>   xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix
> 
>  hw/block/xen_blkif.h | 167 ++++++++++++++++++++++++++++++---------------------
>  1 file changed, 97 insertions(+), 70 deletions(-)
 
Added to me queue

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-06-20  9:53 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-20  7:55 [PATCH v3 0/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix Juergen Gross
2016-06-20  7:55 ` [PATCH v3 1/2] xen: fix style of hw/block/xen_blkif.h Juergen Gross
2016-06-20  9:48   ` Stefano Stabellini
2016-06-20  7:55 ` [PATCH v3 2/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix Juergen Gross
2016-06-20  9:52   ` Stefano Stabellini
2016-06-20  9:53 ` [PATCH v3 0/2] " Stefano Stabellini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).