[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix



> -----Original Message-----
> From: Xen-devel [mailto:xen-devel-bounces@xxxxxxxxxxxxx] On Behalf Of
> Juergen Gross
> Sent: 16 June 2016 11:02
> To: qemu-devel@xxxxxxxxxx; xen-devel@xxxxxxxxxxxxxxxxxxx
> Cc: Anthony Perard; Juergen Gross; sstabellini@xxxxxxxxxx;
> kraxel@xxxxxxxxxx
> Subject: [Xen-devel] [PATCH] xen: fix qdisk BLKIF_OP_DISCARD for 32/64
> word size mix
> 
> 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@xxxxxxxx>

Would it not be better to re-import the canonical blkif header as a whole 
rather than cherry-picking like this? You'd need to post-process to maintain 
style and possibly change some names for compatibility etc. but probably 
nothing beyond what indent and a simple [s]ed script can do.
I did broadly the same thing to re-import the netif header into Linux recently.

  Paul

> ---
>  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 e3b133b..969112f 100644
> --- a/hw/block/xen_blkif.h
> +++ b/hw/block/xen_blkif.h
> @@ -26,6 +26,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 */
> @@ -44,6 +52,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 */
> @@ -82,7 +98,7 @@ static inline void blkif_get_x86_32_req(blkif_request_t
> *dst, blkif_x86_32_reque
>       /* 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;
> @@ -105,7 +121,7 @@ static inline void
> blkif_get_x86_64_req(blkif_request_t *dst, blkif_x86_64_reque
>       /* 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
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.