From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Paul Durrant <Paul.Durrant@citrix.com>
Cc: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
"Keir (Xen.org)" <keir@xen.org>,
Ian Campbell <Ian.Campbell@citrix.com>,
Jan Beulich <jbeulich@suse.com>,
Roger Pau Monne <roger.pau@citrix.com>
Subject: Re: [PATCH] blkif: add indirect descriptors interface to public headers
Date: Thu, 14 Nov 2013 13:14:40 -0500 [thread overview]
Message-ID: <20131114181440.GA27306@phenom.dumpdata.com> (raw)
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD0173E2D@AMSPEX01CL01.citrite.net>
> > I must be really thick here but I am not seeing it. Could you explain to me
> > exactly why we would not get the same size?
> >
>
> Maybe I'm misunderstanding this but by my reading this section:
>
> uint8_t indirect_op;
> uint16_t nr_segments;
> #ifdef CONFIG_X86_64
> uint32_t _pad1; /* offsetof(blkif_...,u.indirect.id) == 8 */
> #endif
> uint64_t id;
>
> would be 11 bytes long in a 32-bit build and 15 bytes long in a 64-bit build (as it's part of a packed struct).
Damm! I somehow thought we had it done _Right_ so it would be the same
exact and offset on both 64-bit and 32-bit. ARGH!
konrad@phenom:/tmp$ ./blk-interface-64
RING TOTAL SIZE 2368
Each entry 64
Each request 60
64-bit
op:0, indirect_op=1, nr_segment=2,id=8 sector_number=16
gref[0] == (24)
gref[1] == (28)
gref[2] == (32)
gref[3] == (36)
gref[4] == (40)
gref[5] == (44)
gref[6] == (48)
gref[7] == (52)
konrad@phenom:/tmp$ ./blk-interface-32
konrad@phenom:/tmp$ ./blk-interface
RING TOTAL SIZE 1792
Each entry 48
Each request 48
32-bit
op:0, indirect_op=1, nr_segment=2,id=4 sector_number=8
gref[0] == (12)
gref[1] == (16)
gref[2] == (20)
gref[3] == (24)
gref[4] == (28)
gref[5] == (32)
gref[6] == (36)
gref[7] == (40)
Attached is the simple test program.
#include <stdio.h>
#include <sys/types.h>
#include <stddef.h>
/* These are only 64-bit defined */
typedef __signed__ char __s8;
typedef unsigned char __u8;
typedef __signed__ short __s16;
typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;
typedef __signed__ long __s64;
typedef unsigned long __u64;
typedef __u8 uint8_t;
typedef __u16 uint16_t;
typedef __u32 uint32_t;
#if defined(__GNUC__)
typedef __u64 uint64_t;
//typedef __u64 u_int64_t;
//typedef __s64 int64_t;
#endif
typedef uint16_t blkif_vdev_t;
typedef uint64_t blkif_sector_t;
typedef uint32_t grant_ref_t;
/*
* Maximum scatter/gather segments per request.
* This is carefully chosen so that sizeof(struct blkif_ring) <= 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 CONFIG_X86_64 1
struct blkif_request_rw {
uint8_t nr_segments; /* number of segments */
blkif_vdev_t handle; /* only for read/write requests */
#ifdef CONFIG_X86_64
uint32_t _pad1; /* offsetof(blkif_request,u.rw.id) == 8 */
#endif
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 {
grant_ref_t gref; /* reference to I/O buffer frame */
/* @first_sect: first sector in frame to transfer (inclusive). */
/* @last_sect: last sector in frame to transfer (inclusive). */
uint8_t first_sect, last_sect;
} seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
} __attribute__((__packed__));
#define BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST 8
/* so 64 bytes under 64-bit */
struct blkif_request_indirect {
uint8_t indirect_op; /* BLKIF_OP_* (usually READ or WRITE */ // 1
uint16_t nr_segments;
#ifdef CONFIG_X86_64
uint32_t _pad1; /* offsetof(blkif_request,u.rw.id) == 8 */ // 2
#endif
uint64_t id; /* private guest value, echoed in resp */
blkif_sector_t sector_number;
grant_ref_t indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
#ifdef CONFIG_X86_64
uint32_t _pad3; /* make it 64 byte aligned */
#else
uint64_t _pad3; /* make it 64 byte aligned */
#endif
} __attribute__((__packed__));
struct blkif_request {
uint8_t operation; /* BLKIF_OP_??? */
union {
/* struct blkif_request_rw rw; */
struct blkif_request_indirect indirect;
} u;
} __attribute__((__packed__));
struct blkif_response {
uint64_t id; /* copied from request */
uint8_t operation; /* copied from request */
int16_t status; /* BLKIF_RSP_??? */
};
typedef unsigned int RING_IDX; /* 4 bytes */
union blkif_sring_entry {
struct blkif_request req;
struct blkif_response rsp;
};
struct blkif_ring {
/* 8 */
RING_IDX req_prod, req_event; /* #1 front writest req_prod,
blkback updates req_event by interal reqs_cons consumed + 1 */
/* 8 */
RING_IDX rsp_prod, rsp_event; /* #2 blkback writes rsp_prod, and #4 blkfront updates rsp_event
by its internal rsp_cons + 1 */
uint8_t pad[48];
/* 48 + 16 = 64 */
union blkif_sring_entry ring[36]; /* variable-length */
};
void main(void)
{
int i;
printf("RING TOTAL SIZE\t\t%d\n", sizeof(struct blkif_ring));
printf("Each entry\t\t%d\n", sizeof(union blkif_sring_entry));
printf("Each request\t\t%d\n", sizeof(struct blkif_request));
printf("%s\n",
#ifdef CONFIG_X86_64
"64-bit"
#else
"32-bit"
#endif
);
printf("op:%d, indirect_op=%d, nr_segment=%d,id=%d sector_number=%d\n",
offsetof(struct blkif_request, operation),
offsetof(struct blkif_request, u.indirect.indirect_op),
offsetof(struct blkif_request, u.indirect.nr_segments),
offsetof(struct blkif_request, u.indirect.id),
offsetof(struct blkif_request, u.indirect.sector_number));
for (i = 0; i < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST; i++) {
printf("gref[%d] == (%d)\n", i, offsetof(struct blkif_request, u.indirect.indirect_grefs[i]));
}
return;
}
next prev parent reply other threads:[~2013-11-14 18:14 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-12 10:36 [PATCH] blkif: add indirect descriptors interface to public headers Roger Pau Monne
2013-11-12 13:46 ` Paul Durrant
2013-11-12 14:12 ` David Vrabel
2013-11-12 14:18 ` Paul Durrant
2013-11-12 14:43 ` Jan Beulich
2013-11-12 14:49 ` David Vrabel
2013-11-12 14:54 ` Roger Pau Monné
2013-11-12 14:58 ` Jan Beulich
2013-11-14 9:57 ` Roger Pau Monné
2013-11-12 14:22 ` Konrad Rzeszutek Wilk
2013-11-12 14:29 ` Ian Campbell
2013-11-12 14:42 ` Konrad Rzeszutek Wilk
2013-11-12 14:54 ` Ian Campbell
2013-11-12 15:16 ` Paul Durrant
2013-11-13 9:26 ` Ian Campbell
2013-11-13 11:07 ` Paul Durrant
2013-11-13 11:11 ` Ian Campbell
2013-11-13 11:24 ` Paul Durrant
2013-11-14 10:06 ` Roger Pau Monné
2013-11-14 10:14 ` Paul Durrant
2013-11-14 10:27 ` Roger Pau Monné
2013-11-14 10:38 ` Paul Durrant
2013-11-14 10:52 ` Roger Pau Monné
2013-11-14 11:26 ` Paul Durrant
2013-11-14 16:24 ` Konrad Rzeszutek Wilk
2013-11-14 16:26 ` Paul Durrant
2013-11-14 16:34 ` Konrad Rzeszutek Wilk
2013-11-14 16:53 ` Paul Durrant
2013-11-14 16:57 ` Konrad Rzeszutek Wilk
2013-11-14 17:13 ` Paul Durrant
2013-11-14 18:14 ` Konrad Rzeszutek Wilk [this message]
2013-11-15 8:01 ` Roger Pau Monné
2013-11-15 9:05 ` Paul Durrant
2013-11-15 9:44 ` Ian Campbell
2013-11-14 19:16 ` Paul Durrant
2013-11-15 8:04 ` Roger Pau Monné
2013-11-13 12:01 ` Konrad Rzeszutek Wilk
2013-11-28 17:02 ` Roger Pau Monné
2013-11-29 10:14 ` Jan Beulich
2013-11-29 10:28 ` Ian Campbell
2013-11-29 12:47 ` Julien Grall
2013-11-29 12:49 ` Ian Campbell
2013-12-03 9:22 ` Keir Fraser
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131114181440.GA27306@phenom.dumpdata.com \
--to=konrad.wilk@oracle.com \
--cc=Ian.Campbell@citrix.com \
--cc=Paul.Durrant@citrix.com \
--cc=jbeulich@suse.com \
--cc=keir@xen.org \
--cc=roger.pau@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.