All of lore.kernel.org
 help / color / mirror / Atom feed
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;
}

  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.