[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Xen-devel] disk io request structures
 
- To: James Harper <james.harper@xxxxxxxxxxxxxxxx>
 
- From: Paresh Nakhe <paresh.nakhe@xxxxxxxxx>
 
- Date: Thu, 3 Feb 2011 11:15:13 +0530
 
- Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
 
- Delivery-date: Wed, 02 Feb 2011 21:46:23 -0800
 
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma;	h=mime-version:in-reply-to:references:from:date:message-id:subject:to	:cc:content-type;	b=HKSwLQqOw5J74bH6D41Sml8aZcAfdPjOMHpIJbNPIHBmx+9CoC9XMrhOBr+wzQnW26	KXhCggPhB1K4KQDzhFPQtvLJQvcz/o/wGBnda7i9Jqkq13dXfacQexVLAkWhc0uJ4N7d	NhBeouwHN6+UJu5lb4FYFNPGoY53pUImlN8+I=
 
- List-id: Xen developer discussion <xen-devel.lists.xensource.com>
 
 
 
That was a really nice explanation. blkif_request_segment seems to be serving the same purpose which bio structure serves in native machines. (Plz correct me if i am wrong)
  In your example, we are reading sectors 123-134. Is it necessary that sectors be contiguous? Also the pages to which these are mapped are shown as contiguous. 
Is this always the case?
  I haven't understood the concept of scatter gather request segments clearly. Does this concept have anything do something with the question stated  above?
  Paresh
 
 
On Thu, Feb 3, 2011 at 5:45 AM, James Harper  <james.harper@xxxxxxxxxxxxxxxx> wrote: 
> Hi, 
> Following is the structure of an IO request which is inserted in the 
shared IO 
> ring. 
> 
> include/xen/interface/io/blkif.h 
> 
> struct blkif_request { 
>     uint8_t        operation;    /* BLKIF_OP_??? 
*/ 
>     uint8_t        nr_segments;  /* number of segments 
*/ 
>     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 { 
>         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]; 
> }; 
> 
> Sorry, if my questions seem obvious or trivial. I am a newbie in xen 
> development. Right now, me and my group are trying to understand the 
disk io 
> mechanism in XEN. We intend to modify the existing system. We expect 
better 
> performance after this modification. 
> 
> So, in the above structure, 
>  1. what is a "segment" referred in the structure. 
>  2. Why is there an array of blkif_request_segment (why not a single 
> instance). What is it's purpose? 
>  3. In the structure blkif_request_segment, are the first_sect and 
last_sect 
> physical sector numbers 
> 
 
  Each entry on the ring contains the details of the operation. Each 
operation is going to be either a read from memory or a write to memory. 
The ring entry contains a list of memory pages that are granted to Dom0. 
 
The first_sect and last_sect are worked out by thinking of each page as 
holding 8 sectors (page size is 4096 bytes, sectors are 512 bytes). 
first_sect and last_sect refer to the sector number offset inside that 
frame, so if the address of your buffer was offset 0 then first_sect 
would be 0, if it was offset 512 then first_sect would be 1, etc. Your 
buffer obviously has to be aligned to a 512 byte boundary (which is a 
pain for Windows!). 
 
Probably the best way to describe it is an example. Suppose you want to 
read sectors 123-134 (11 sectors) into virtual memory starting at 
address 0x12345600 (length 11 * 512 = 5632). You would do the following: 
 
1. Get the pfn's of the memory. Eg virtual address 0x12345600-0x12346BFF 
might map to pages 0x4444 and 0x5555 
2. Get a grant ref and grant access to those pfn's. Your grant refs 
might be 123 and 456 
3. Set the members of the struct as follow: 
   . operation = read 
   . nr_segments = 2 (2 pages) 
   . sector_number = 123 
   . handle = I forget what this is for... 
   . id = your own id for you to track this request when you get the 
response back 
   . seg[0].gref = 123 
   . seg[0].first_sect = 3 (offset 0x600 in frame) 
   . seg[0].last_sect = 7 
   . seg[1].gref = 456 
   . seg[1].first_sect = 0 
   . seg[1].last_sect = 5 
 
Please excuse any arithmetic errors I might have made above, but the 
logic should be right. 
 
James 
 
 
  --  What I have is not a dream, because I will   make it a reality.
 
  
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
 
 
    
     |