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

Re: [Xen-devel] [PATCH 4 of 4 v2] blkif.h: Define and document the request number/size/segments extension



>>> On 15.02.12 at 06:06, "Justin T. Gibbs" <justing@xxxxxxxxxxxxxxxx> wrote:
> Note: As of __XEN_INTERFACE_VERSION__ 0x00040201 the definition of
>       BLKIF_MAX_SEGMENTS_PER_REQUEST has changed.  Drivers must be updated
>       to, at minimum, use BLKIF_MAX_SEGMENTS_PER_HEADER_BLOCK, before being
>       recompiled with a __XEN_INTERFACE_VERSION greater than or equal to
>       this value.
> 
> This extension first appeared in the FreeBSD Operating System.

Any pointer to their implementation?

> Signed-off-by: Justin T. Gibbs <justing@xxxxxxxxxxxxxxxx>
> 
> diff -r 321810c42d55 -r adcb465964c5 xen/include/public/io/blkif.h
> --- a/xen/include/public/io/blkif.h   Tue Feb 14 21:54:09 2012 -0700
> +++ b/xen/include/public/io/blkif.h   Tue Feb 14 21:54:09 2012 -0700
> @@ -142,6 +142,32 @@
>   *      The maximum supported size of the request ring buffer in units of
>   *      machine pages.  The value must be a power of 2.
>   *
> + * max-requests         <uint32_t>
> + *      Default Value:  BLKIF_MAX_RING_REQUESTS(PAGE_SIZE)
> + *      Maximum Value:  BLKIF_MAX_RING_REQUESTS(PAGE_SIZE * max-ring-pages)
> + *
> + *      The maximum number of concurrent, logical requests that will be
> + *      issued by the backend.
> + *
> + *      Note: A logical request may span multiple ring entries.
> + *
> + * max-request-segments
> + *      Values:         <uint8_t>
> + *      Default Value:  BLKIF_MAX_SEGMENTS_PER_HEADER_BLOCK
> + *      Maximum Value:  BLKIF_MAX_SEGMENTS_PER_REQUEST
> + *
> + *      The maximum value of blkif_request.nr_segments supported by
> + *      the backend.
> + *
> + * max-request-size
> + *      Values:         <uint32_t>
> + *      Default Value:  BLKIF_MAX_SEGMENTS_PER_HEADER_BLOCK * PAGE_SIZE
> + *      Maximum Value:  BLKIF_MAX_SEGMENTS_PER_REQUEST * PAGE_SIZE

In particular, wrt the question about a reference to their implementation,
I don't see why both max-request-segments and max-request-size are
necessary here and below. What is the intended behavior when the two
aren't in sync?

> + *
> + *      The maximum amount of data, in bytes, that can be referenced by a
> + *      request type that accesses frontend memory (currently BLKIF_OP_READ,
> + *      BLKIF_OP_WRITE, or BLKIF_OP_WRITE_BARRIER).
> + *
>   *------------------------- Backend Device Properties 
> -------------------------
>   *
>   * discard-aligment
> @@ -239,6 +265,33 @@
>   *      The size of the frontend allocated request ring buffer in units of
>   *      machine pages.  The value must be a power of 2.
>   *
> + * max-requests
> + *      Values:         <uint32_t>
> + *      Default Value:  BLKIF_MAX_RING_REQUESTS(PAGE_SIZE)
> + *      Maximum Value:  BLKIF_MAX_RING_REQUESTS(PAGE_SIZE * max-ring_pages)

max-ring-pages?

Jan

> + *
> + *      The maximum number of concurrent, logical requests that will be
> + *      issued by the frontend.
> + *
> + *      Note: A logical request may span multiple ring entries.
> + *
> + * max-request-segments
> + *      Values:         <uint8_t>
> + *      Default Value:  BLKIF_MAX_SEGMENTS_PER_HEADER_BLOCK
> + *      Maximum Value:  MIN(255, backend/max-request-segments)
> + *
> + *      The maximum value the frontend will set in the
> + *      blkif_request.nr_segments field.
> + *
> + * max-request-size
> + *      Values:         <uint32_t>
> + *      Default Value:  BLKIF_MAX_SEGMENTS_PER_HEADER_BLOCK * PAGE_SIZE
> + *      Maximum Value:  max-request-segments * PAGE_SIZE
> + *
> + *      The maximum amount of data, in bytes, that can be referenced by
> + *      a request type that accesses frontend memory (currently 
> BLKIF_OP_READ,
> + *      BLKIF_OP_WRITE, or BLKIF_OP_WRITE_BARRIER).
> + *
>   *------------------------- Virtual Device Properties 
> -------------------------
>   *
>   * device-type
> @@ -400,11 +453,28 @@
>  #define BLKIF_OP_DISCARD           5
>  
>  /*
> - * Maximum scatter/gather segments per request.
> + * Maximum scatter/gather segments associated with a request header block.
>   * This is carefully chosen so that sizeof(blkif_ring_t) <= PAGE_SIZE.
>   * NB. This could be 12 if the ring indexes weren't stored in the same 
> page.
>   */
> -#define BLKIF_MAX_SEGMENTS_PER_REQUEST 11
> +#define BLKIF_MAX_SEGMENTS_PER_HEADER_BLOCK  11
> +
> +/*
> + * Maximum scatter/gather segments associated with a segment block.
> + */
> +#define BLKIF_MAX_SEGMENTS_PER_SEGMENT_BLOCK 14
> +
> +#if __XEN_INTERFACE_VERSION__ >= 0x00040201
> +/*
> + * Maximum scatter/gather segments per request (header + segment blocks).
> + */
> +#define BLKIF_MAX_SEGMENTS_PER_REQUEST 255
> +#else
> +/*
> + * Maximum scatter/gather segments per request (header block only).
> + */
> +#define BLKIF_MAX_SEGMENTS_PER_REQUEST BLKIF_MAX_SEGMENTS_PER_HEADER_BLOCK
> +#endif
>  
>  /*
>   * NB. first_sect and last_sect in blkif_request_segment, as well as
> @@ -419,9 +489,25 @@ struct blkif_request_segment {
>      /* @last_sect: last sector in frame to transfer (inclusive).     */
>      uint8_t     first_sect, last_sect;
>  };
> +typedef struct blkif_request_segment blkif_request_segment_t;
>  
>  /*
>   * Starting ring element for any I/O request.
> + *
> + * One or more segment blocks can be inserted into the request ring
> + * just after a blkif_request_t, allowing requests to operate on
> + * up to BLKIF_MAX_SEGMENTS_PER_REQUEST.
> + *
> + * BLKIF_SEGS_TO_BLOCKS() can be used on blkif_requst.nr_segments
> + * to determine the number of contiguous ring entries associated
> + * with this request.
> + *
> + * Note:  Due to the way Xen request rings operate, the producer and
> + *        consumer indices of the ring must be incremented by the
> + *        BLKIF_SEGS_TO_BLOCKS() value of the associated request.
> + *        (e.g. a response to a 3 ring entry request must also consume
> + *        3 entries in the ring, even though only the first ring entry
> + *        in the response has any data.)
>   */
>  struct blkif_request {
>      uint8_t        operation;    /* BLKIF_OP_???                         */
> @@ -429,11 +515,22 @@ struct blkif_request {
>      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];
> +    blkif_request_segment_t seg[BLKIF_MAX_SEGMENTS_PER_HEADER_BLOCK];
>  };
>  typedef struct blkif_request blkif_request_t;
>  
>  /*
> + * A segment block is a ring request structure that contains only
> + * segment data.
> + *
> + * sizeof(struct blkif_segment_block) <= sizeof(struct blkif_request)
> + */
> +struct blkif_segment_block {
> +    blkif_request_segment_t seg[BLKIF_MAX_SEGMENTS_PER_SEGMENT_BLOCK];
> +};
> +typedef struct blkif_segment_block blkif_segment_block_t;
> +
> +/*
>   * Cast to this structure when blkif_request.operation == BLKIF_OP_DISCARD
>   * sizeof(struct blkif_request_discard) <= sizeof(struct blkif_request)
>   */
> @@ -470,6 +567,21 @@ typedef struct blkif_response blkif_resp
>   */
>  DEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response);
>  
> +/*
> + * Index to, and treat as a segment block, an entry in the ring.
> + */
> +#define BLKRING_GET_SEG_BLOCK(_r, _idx)                                 \
> +    (((blkif_segment_block_t *)RING_GET_REQUEST(_r, _idx))->seg)
> +
> +/*
> + * The number of ring request blocks required to handle an I/O
> + * request containing _segs segments.
> + */
> +#define BLKIF_SEGS_TO_BLOCKS(_segs)                                     \
> +    ((((_segs - BLKIF_MAX_SEGMENTS_PER_HEADER_BLOCK)                    \
> +     + (BLKIF_MAX_SEGMENTS_PER_SEGMENT_BLOCK - 1))                      \
> +    / BLKIF_MAX_SEGMENTS_PER_SEGMENT_BLOCK) + /*header_block*/1)
> +
>  #define VDISK_CDROM        0x1
>  #define VDISK_REMOVABLE    0x2
>  #define VDISK_READONLY     0x4
> diff -r 321810c42d55 -r adcb465964c5 xen/include/public/xen-compat.h
> --- a/xen/include/public/xen-compat.h Tue Feb 14 21:54:09 2012 -0700
> +++ b/xen/include/public/xen-compat.h Tue Feb 14 21:54:09 2012 -0700
> @@ -27,7 +27,7 @@
>  #ifndef __XEN_PUBLIC_XEN_COMPAT_H__
>  #define __XEN_PUBLIC_XEN_COMPAT_H__
>  
> -#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040200
> +#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040201
>  
>  #if defined(__XEN__) || defined(__XEN_TOOLS__)
>  /* Xen is built with matching headers and implements the latest interface. 
> */
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx 
> http://lists.xensource.com/xen-devel 



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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