|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 5 of 5] blkif.h: Define and document the request number/size/segments extension
>>> On 03.02.12 at 06:24, "Justin T. Gibbs" <justing@xxxxxxxxxxxxxxxx> wrote:
> xen/include/public/io/blkif.h | 106 ++++++++++++++++++++++++++++++++++++++++-
> 1 files changed, 103 insertions(+), 3 deletions(-)
>
>
> Note: 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 compatible
> with this header file.
NAK. No backwards incompatible changes allowed in public headers.
Jan
> This extension first appeared in FreeBSD.
>
> Signed-off-by: Justin T. Gibbs <justing@xxxxxxxxxxxxxxxx>
>
> diff -r c3609ad53946 -r f5c2e866c661 xen/include/public/io/blkif.h
> --- a/xen/include/public/io/blkif.h Thu Feb 02 16:19:57 2012 -0700
> +++ b/xen/include/public/io/blkif.h Thu Feb 02 16:19:57 2012 -0700
> @@ -119,6 +119,29 @@
> * 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 requests supported by the backend.
> + *
> + * max-request-segments
> + * Values: <uint8_t>
> + * Default Value: BLKIF_MAX_SEGMENTS_PER_HEADER_BLOCK
> + * Maximum Value: 255
> + *
> + * 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: 255 * 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).
> + *
> *----------------------- Backend Device Identification
> -----------------------
> * mode
> * Values: "r" (read only), "w" (writable)
> @@ -235,6 +258,31 @@
> * 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)
> + *
> + * The maximum number of concurrent requests that will be issued by
> + * the frontend.
> + *
> + * 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
> @@ -392,11 +440,21 @@
> #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
> +
> +/*
> + * Maximum scatter/gather segments per request (header + segment blocks).
> + */
> +#define BLKIF_MAX_SEGMENTS_PER_REQUEST 255
>
> /*
> * NB. first_sect and last_sect in blkif_request_segment, as well as
> @@ -411,9 +469,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_??? */
> @@ -421,11 +495,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)
> */
> @@ -462,6 +547,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
>
> _______________________________________________
> 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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |