From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: RFC v1: Xen block protocol overhaul - problem statement (with pictures!) Date: Tue, 18 Dec 2012 09:31:09 -0500 Message-ID: <20121218143109.GA24471@phenom.dumpdata.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="BXVAT5kNtrzKuDFl" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xensource.com, martin.petersen@oracle.com, felipe.franciosi@citrix.com, matthew@wil.cx, axboe@kernel.dk List-Id: xen-devel@lists.xenproject.org --BXVAT5kNtrzKuDFl Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hey, I am including some folks that are not always on Xen-devel to see if they= have some extra ideas or can correct my misunderstandings. This is very much RFC - so there is bound to be some bugs. The original is here https://docs.google.com/document/d/1Vh5T8Z3Tx3sUEhVB0DnNDKBNiqB_ZA8Z5YVqA= sCIjuI/edit in case one wishes to modify/provide comment on that one. There are outstanding issues we have now with the block protocol: Note: I am assuming 64-bit guest/host - as the size=E2=80=99s of the stru= ctures change on 32-bit. I am also attaching the header for the blkif ring as of today. A) Segment size is limited to 11 pages. It means we can at most squeeze in 44kB per request. The ring can hold 32 (next power of two below 36) requests, meaning we can do 1.4M of outstanding requests. B). Producer and consumer index is on the same cache line. In present har= dware that means the reader and writer will compete for the same cacheline caus= ing a ping-pong between sockets. C). The requests and responses are on the same ring. This again causes th= e ping-pong between sockets as the ownership of the cache line will shift b= etween sockets. D). Cache alignment. Currently the protocol is 16-bit aligned. This is aw= kward as the request and responses sometimes fit within a cacheline or sometime= s straddle them. E). Interrupt mitigation. We are currently doing a kick whenever we are done =E2=80=9Cprocessing=E2=80=9D the ring. There are better ways to do t= his - and we could use existing network interrupt mitigation techniques to make the code poll when there is a lot of data.=20 F). Latency. The processing of the request limits us to only do 44kB - wh= ich means that a 1MB chunk of data - which on contemporary devices would only use I= /O request - would be split up in multiple =E2=80=98requests=E2=80=99 inadvertently = delaying the processing of said block.=20 G) Future extensions. DIF/DIX for integrity. There might be other in the future and it would be good to leave space for extra flags TBD.=20 H). Separate the response and request rings. The current implementation has one thread for one block ring. There is no reason why there could not be two threads - one for responses and one for requests - and especially if they are scheduled on different CPUs. Furthermore this could also be split in multi-queues - so two queues (response and request= ) on each vCPU.=20 I). We waste a lot of space on the ring - as we use the ring for both requests and responses. The response structure needs to occupy the same amount of space as the request structure (112 bytes). If the request structure is expanded to be able to fit more segments (say the =E2=80=98struct blkif_sring_entry is expanded to ~1500 bytes) that st= ill requires us to have a matching size response structure. We do not need to use that much space for one response. Having a separate response ring would simplify the structures.=20 J). 32 bit vs 64 bit. Right now the size of the request structure is 112 bytes under 64-bit guest and 102 bytes under 32-bit guest. It is confusing and furthermore requires the host to do extra accounting and processing. The crude drawing displays memory that the ring occupies in offset of 64 bytes (cache line). Of course future CPUs could have different cache lines (say 32 bytes?)- which would skew this drawing. A 32-bit ring is a bit different as the =E2=80=98struct blkif_sring_entry=E2=80=99 is of 1= 02 bytes. The A) has two solutions to this (look at http://comments.gmane.org/gmane.comp.emulators.xen.devel/140406 for details). One proposed by Justin from Spectralogic has to negotiate the segment size. This means that the =E2=80=98struct blkif_sring_entry=E2= =80=99 is now a variable size. It can expand from 112 bytes (cover 11 pages of data - 44kB) to 1580 bytes (256 pages of data - so 1MB). It is a simple extension by just making the array in the request expand from 11 to a variable size negotiated. The math is as follow. struct blkif_request_segment { uint32 grant; // 4 bytes uint8_t first_sect, last_sect;// 1, 1 =3D 6 bytes } (6 bytes for each segment) - the above structure is in an array of size 11 in the request. The =E2=80=98struct blkif_sring_entry=E2=80=99 is 112 = bytes. The change is to expand the array - in this example we would tack on 245 extr= a =E2=80=98struct blkif_request_segment=E2=80=99 - 245*6 + 112 =3D 1582. If= we were to use 36 requests (so 1582*36 + 64) we would use 57016 bytes (14 pages). The other solution (from Intel - Ronghui) was to create one extra ring that only has the =E2=80=98struct blkif_request_segment=E2=80=99 in = them. The =E2=80=98struct blkif_request=E2=80=99 would be changed to have an index = in said =E2=80=98segment ring=E2=80=99. There is only one segment ring. This mean= s that the size of the initial ring is still the same. The requests would point to the segment and enumerate out how many of the indexes it wants to use. The limit is of course the size of the segment. If one assumes a one-page segment this means we can in one request cover ~4MB. The math is as follow: First request uses the half of the segment ring - so index 0 up to 341 (out of 682). Each entry in the segment ring is a =E2=80=98struct blkif_request_segment=E2=80=99 so it occupies 6 bytes. The other requests= on the ring (so there are 35 left) can use either the remaining 341 indexes of the sgement ring or use the old style request. The old style request can address use up to 44kB. For example: sring[0]->[uses 0->341 indexes in the segment ring] =3D 342*4096 =3D 140= 0832 sring[1]->[use sthe old style request] =3D 11*4096 =3D 45056 sring[2]->[uses 342->682 indexes in the segment ring] =3D 1392640 sring[3..32] -> [uses the old style request] =3D 29*4096*11 =3D 1306624 Total: 4145152 bytes Naturally this could be extended to have a bigger segment ring to cover more. The problem with this extension is that we use 6 bytes and end up straddling a cache line. Using 8 bytes will fix the cache straddling. Thi= s would mean fitting only 512 segments per page. There is yet another mechanism that could be employed - and it borrows from VirtIO protocol. And that is the =E2=80=98indirect descriptors=E2=80= =99. This very similar to what Intel suggests, but with a twist. We could provide a new BLKIF_OP (say BLKIF_OP_INDIRECT), and the =E2=80=98= struct blkif_sring=E2=80=99 (each entry can be up to 112 bytes if needed - so th= e old style request would fit). It would look like: /* so 64 bytes under 64-bit. If necessary, the array (seg) can be expanded to fit 11 segments as the old style request did */ struct blkif_request_indirect { uint8_t op; /* BLKIF_OP_* (usually READ or WRITE= */ // 1 blkif_vdev_t handle; /* only for read/write requests = */ // 2 #ifdef CONFIG_X86_64 uint32_t _pad1; /* offsetof(blkif_request,u.rw.= id) =3D=3D 8 */ // 2 #endif uint64_t id; /* private guest value, echoed in re= sp */ grant_ref_t gref; /* reference to indirect buffer frame if us= ed*/ struct blkif_request_segment_aligned seg[4]; // each is 8 byt= es } __attribute__((__packed__)); struct blkif_request { uint8_t operation; /* BLKIF_OP_??? */ union { struct blkif_request_rw rw; struct blkif_request_indirect indirect; =E2=80=A6 other .. } u; } __attribute__((__packed__)); The =E2=80=98operation=E2=80=99 would be BLKIF_OP_INDIRECT. The read/writ= e/discard, etc operation would now be in indirect.op. The indirect.gref points to a page that is filled with: struct blkif_request_indirect_entry { blkif_sector_t sector_number; struct blkif_request_segment seg; } __attribute__((__packed__)); //16 bytes, so we can fit in a page 256 of these structures. This means that with the existing 36 slots in the ring (single page) we can cover: 32 slots * each blkif_request_indirect covers: 256 * 4096 ~=3D 32M. If we don=E2=80=99t want to use indirect descriptor we can stil= l use up to 4 pages of the request (as it has enough space to contain four segments and the structure will still be cache-aligned). B). Both the producer (req_* and rsp_*) values are in the same cache-line. This means that we end up with the same cacheline being modified by two different guests. Depending on the architecture and placement of the guest this could be bad - as each logical CPU would try to write and read from the same cache-line. A mechanism where the req_* and rsp_ values are separated and on a different cache line could be used. The value of the correct cache-line and alignment could be negotiated via XenBus - in case future technologies start using 128 bytes for cache or such. Or the the producer and consumer indexes are in separate rings. Meaning we have a =E2=80=98request ring=E2=80=99 and a =E2= =80=98response ring=E2=80=99 - and only the =E2=80=98req_prod=E2=80=99, =E2=80=98req_eve= nt=E2=80=99 are modified in the =E2=80=98request ring=E2=80=99. The opposite (resp_*) are only modifi= ed in the =E2=80=98response ring=E2=80=99. C). Similar to B) problem but with a bigger payload. Each =E2=80=98blkif_sring_entry=E2=80=99 occupies 112 bytes which does not len= d itself to a nice cache line size. If the indirect descriptors are to be used for everything we could =E2=80=98slim-down=E2=80=99 the blkif_request/res= ponse to be up-to 64 bytes. This means modifying BLKIF_MAX_SEGMENTS_PER_REQUEST to 5 as that would slim the largest of the structures to 64-bytes. Naturally this means negotiating a new size of the structure via XenBus. D). The first picture shows the problem. We now aligning everything on the wrong cachelines. Worst in =E2=85=93 of the cases we straddle three cache-lines. We could negotiate a proper alignment for each request/response structure. E). The network stack has showed that going in a polling mode does improv= e performance. The current mechanism of kicking the guest and or block backend is not always clear. [TODO: Konrad to explain it in details] F). The current block protocol for big I/Os that the backend devices can handle ends up doing extra work by splitting the I/O in smaller chunks, and then reassembling them. With the solutions outlined in A) this can be fixed. This is easily seen with 1MB I/Os. Since each request can only handle 44kB that means we have to split a 1MB I/O in 24 requests (23 * 4096 * 11 =3D 1081344). Then the backend ends up sending them in sector-sizes- which with contemporary devices (such as SSD) ends up with more processing. The SSDs are comfortable handling 128kB or higher I/Os in one go. G). DIF/DIX. This a protocol to carry extra =E2=80=98checksum=E2=80=99 in= formation for each I/O. The I/O can be a sector size, page-size or an I/O size (most popular are 1MB). The DIF/DIX needs 8 bytes of information for each I/O. It would be worth considering putting/reserving that amount of space in each request/response. Also putting in extra flags for future extensions would be worth it - however the author is not aware of any right now. H). Separate response/request. Potentially even multi-queue per-VCPU queues. As v2.6.37 demonstrated, the idea of WRITE_BARRIER was flawed. There is no similar concept in the storage world were the operating system can put a food down and say: =E2=80=9Ceverything before = this has to be on the disk.=E2=80=9D There are ligther versions of this - call= ed =E2=80=98FUA=E2=80=99 and =E2=80=98FLUSH=E2=80=99. Depending on the inter= nal implementation of the storage they are either ignored or do the right thing. The filesystems determine the viability of these flags and change writing tactics depending on this. From a protocol level, this means that the WRITE/READ/SYNC requests can be intermixed - the storage by itself determines the order of the operation. The filesystem is the one that determines whether the WRITE should be with a FLUSH to preserve some form of atomicity. This means we do not have to preserve an order of operation= s - so we can have multiple queues for request and responses. This has show in the network world to improve performance considerably. I). Wastage of response/request on the same ring. Currently each response MUST occupy the same amount of space that the request occupies - as the ring can have both responses and requests. Separating the request and response ring would remove the wastage. J). 32-bit vs 64-bit (or 102 bytes vs 112 bytes). The size of the ring entries is different if the guest is in 32-bit or 64-bit mode. Cleaning this up to be the same size would save considerable accounting that the host has to do (extra memcpy for each response/request). --BXVAT5kNtrzKuDFl Content-Type: image/png Content-Disposition: attachment; filename="blkif_sring_struct.png" Content-Transfer-Encoding: base64 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 irh9vGCpK+fXq9dXfGNQmf/PI4+78vc3ftl19dkxrDtV9dP6vZdc6m4C6irUcbW91TfsctU2 KkfrtZ/K7wyk6viung8/5srZddcUt1znqciJtY/KD29SqpPaQ+t1w7IuxUrbR/7ble8m/9+4 r7YdY8R5rg52DF2bf3xyXoftFbnRMawNd85b5I6t/dV+YWTI2l+RH5WtbVSmtaXqfvikAe3X vhZIVRkqf++ll7tydD7unMZfm/m+svei6qZ1rr3vmNzhfVfOKk/vZcGOvTfVDvF5K1Km9f80 4ztuuaBE52JtreXh9dzevKX9eut8VGZnINXqqbbQe1Xnrs+cvWe0LHxv632jdfqc2fWK3/uV WO8BvRfsfWltozb+97FXJx8tWdFhe10/vS/ss6WueDu+ttf1tG31/jTb9VMd7fqpPdRmuiba phZIVRk6B/tc6FqEXetWRx2j2HeXttd+Wq9yfnvft8pC6tf+6w1JSi7J+oWvZUPqmUM6vF/U xkBqj2iYB8qbg2WzPVBWqmmpd6UeGixb4WFUmpi6xR/LtMZvgxCQWu8ogrqqDLT+cfYz7san L119gQt83I0xXa8bqt0IdIOT9YWvL3TdVAU1Oyp8lrWOpeOqDN3odHM0UAojVTqugELb60Zj wKqbumwQ9tcf/Kb9Jqe66+Zr69X1Viukqn1aTz+jvX30Wtuq7i73LGgfHdvd8Hfscjdy3QjD cysXRYoBVfXWTV5trPPReRkwCsR1jPgG/+9+/kYBrPYXpGt//dVrA9Ww/bVMtmtuN3K9VtsX A+tykKpzVveuzkH1VrupLfVa56d2UwTKfhipbVVHtaW9r9z7ztepEqs+KkNwK7AUsLjz9jAW nrfgROet66NtVEddT9XD6q199N5SPVUPvadsfWcgVevsPaRrqZxGfYYsn9F+nNlnTm2hz5fq of8daKWfA8FYCEclATVtA/eeSAFR++s9ojoYcOn87PMXwpb9MNNfnbf20/56b6g81d3efypP df77Ra+1l6/zs3NQm+ma6NrUAqnaX+0gwNdxVSe9tvJUJ73HdK66lq4O6XorU9upzjqO6qO2 0PpSkLohvf4Djj8++Wp6fWx9CKl6D+i6CEr1ftL7SOcdAjyQ2m1SF/xuHw01jdR9OfXoCsvY 7COooYYGUDo89Y3RenX7bwWBEJDaRV1dlj9lX/T60v1VMM2KvnC1nUFXfIPW/tVAmG4aulmE gyjCcg1SdTOy9fpfX/4GpAYQWiYIE1xrn3BQg5aFN6laIFXr7UZsN2sBRAgHVndFw3SjcucW RLl0066mfQQLMeQYZOicVR+VZwCpa6V2+MTP3+gAM4WwcH9Xbw+2ag/tH9ZRbaj96tXdb9G2 uItccBq+b+x6tbd1ADDh+65SSNWPgw7nnQKroLTYeWsfg8Ew4mjXUz/c1LZhNE7w01lI1Xso fh/qWPZa19baygAvjHRae+q9VUnb6HgG3u2f9fQ9os+6vb/0WbHz1Llb26u99N6L3w+6vjYg SOAnQAw/F1oWtkNnu/u1fxzZF0jbeQk6w8i5rAi41VHvBW0fR7VLQerTX/uG6+p/+k9+mAmp 1nuj9tF7Xm2o44XvFyC12zTXQ2YsXcNJFZbR4tMDpvjo6LKgq7+QkZt6owfjqSAQAlK7CFLD G4tuPBY5DG03UXWF6mZUbb5ZDDjxTVpf6ipDNxm7AYfwrBtYfIOxG75uCoKdGEDczTkFs85A qm4+8YAiOWwbgb3KESTqxh/fkOzcKm0f68oMj2E3UytD4GU3bAcYAqkUVq3t1Cbh/rpZ281Y rxUVK5WbVw9IjUHZunx1HfU+CoHUotZxOWr/OLWhFPzFxwzPS3WOr42gQoAeLtv2/ift1zMG LYvIdRZSLfLenh5x023t3eE6hzCCbZAaR00FmJXkcNr56D0Qvif0HnGfmfTHot47an9ra9VB dQl/ZOn9Fu6v9+h+H2F0n8/oB0L8HqkHpIY/cuIfIfbDVNsIWPVjT+9zq4OLDEdTSNkPkqw6 6hqMOf745P9Iy3jPt30MqZZaYu8FtbXaLewBAFK7TcpBbS4CnpVA5GAPtFs97DZ5UFUKwa0Z uauJ92a/L0JAalcOGrAbaAxhZn1520CBuCzd4KqB1Bg4dQO2G0DWwJQsWHDdlOOvdTcju9nE OYzapzOQGt9csgDSrJuabuRxV3y1EK8bq34sZB3D6qofDDZgQ21gN19rO7vhx1YkNgvWugJS 43ZXXd30TCmQ6f3iYNrn7hW7kQu+w4h6OUiNj2n5o4KwrPOOI5gWmQ4h9d+jx2B2duBUFqSq bQSDigpa29hxrbu/2kGBcX3V1sXeExZtt3qrbJsOSu1go97jfW2brM9nV0BqvL9LffE/eFUX y6VWWXotWLQ66HNp6QdxL0jWMTb/5yschNzzn0a68mT3Iyv9/FterevJiXJsDertBzOQ2uOQ KsicXMH+jQGkhikDS1LvyIDUQT6dQAOttvvIKkJAaldCqqIrcUREN23d7PWlazesEAZ1k6s2 khpHzawLW92LWRBgaQhxWTboKu4Cb482nTmkrpAqIIy7h3X+gi9FUax7OIx6Wddppe2jHwkx xKhsRYgMKFyqQ3pDtvQCG0Bi1yIGTLWPda33BKTqvRN2xap9FMG0SJ7Lj1Z3c5BmYhHAeF7K UvAXR8rCH1VZ5633T9yFrPeQi+Qr9zIjMq7l9YRUe//YZ0pto/eR1cEiqWqP8DOp9qokyqzy LC0mjggLqOy9aukV9p6y49nycJCStYMt6y5IjX9Q2I9UtWFW/rlA3+qgSLIcrrd2zqrjvWnZ +k5/O31PhT1KKsM+G5YjmwmpPp0JSO02zfGwmBXxnFhhGdp2ZrTsVr+8GIRa3uuNYBACUrsY Uu0L9pPg+dS6UVsOqW6kAkxFXXRzk/V/tZCq7e2mqRuuvvgtIpIFqQIHG/gR5gZqmeUsum62 9MZiN3vdPFROPSHVUgDCbkeBkeXLujzY9H9BtQGCdeVW2j4u/za9+VkOoisj/fEg4A4hzi1L ASxOndBNW/Bl56V6KYpkcF0ppBYb2V8LpBqoh6BqkS/Vz45v3fXWbirnVxU+hlL1URTafqjo mGofKzPrvC31wfKOdSybgUB1sME2BiJ6b2l9PSFVMKhjhBPZWwRY52CQqiirAaV+mKneYY52 KbtBhWlbWIqFzkPd5PEPUn2GtF0Mc3qPqd52PJWj7wGLTFYKqaV++FQCqXofW4TSBr3pO8tS akIQ148brbc66DOr1/a5UjkqLwtS1b0/JG2HET7lodg56D2qz5rVSe2j44UpCEBqt0l5p3ui KOgFHiAvqLAMRUyfipZN9tHYgk8baCqSJjARDEJAahdDqqx8QX2Z21RPFrELB7zoBiVo0g1N 0YpaIqm6QegYutnqr91Ai3Wn2mwENr2M/g8jSdrfRpW7aajS8jubk5p1c7GRzTqGzl/HC6FV N00t075qI8vFrLR9BCICErspq63kMEfXbsLuxhx1N+qGqXQK1/WZ7q92EnzYjbQSSBV463Wx m2st3f023Y9NOxZGAu34Nn2Qvbfi6F3ZgVPpeavt3fsjLV/AbpCbdd5qa8GRrqfAwvaN82VV lr1X6w2pFtGzwTe6ZjY7Q5iTqs+ZtYvqEU8ZVe4JYur6djMopOXbZ0QQHD9JLGtAltrDXTPN BqL3VNoeqo/9IKwEUtW+KjvuiagGUgXVNiOJziXMQRYw2zY2A4k+R2EPjA1y0v5qA70/siB1 XvrZ0vf5Q1GUNIZU/cBwdUrbo9T7B0jtFg32+afhIClNyL8tinqOibr4xwVRUgHoZ4WjU1DZ vKnL/esH/TEagzJm+WVDwSAEpHbToy8FNLoJ6gs7a65KLdN6i2JWC6kWIXNT6qTwFXaP63/V K2t6HUUqdFw5q17aR+W5eqfl6zxKRZtKwYbKL/YYR9c+6Y1MxyrXPgbdlbZPmEuoMgRqxaKJ 2qbYOkUUw2sUtmF8XlnvBR231imoVH5Wu9v7Sg7Xh4P4rIu70ghqnJMqcNC1iac6yjrvMNJr bV3q86CIa6n3ZyWQqrLCrvuwfjpvHSccAGiQatfEvferbJsQNtU2ek9k1d8G32Wt0zI3w0dG 2+p84kGL1rMQlq3PSwzG1UCq2tauVdbn1p1f8J7POh/7XKkcWx9D6jUpvJ6YgmdzdJ3c5y3j 867PiX7IZ7UrkNqtmuKjnhqVv8ZHVsdGeavhvKlNPgpq0DnQ57V+5rdV+sCnwfoBfr1G9C/2 ABvPzYoQkNrbniaTBal5qXdXP3GqVkjNs+v9xKliUf1aIDUPPRT1bJsQUvuyK4XUrv4++MWC pQ5Qr4nmje3M+wFI7VaN9nml6pofFq0bGwHlKB95HRjlsd7oAVbrBmXkuV7v108r8FhUBKT2 HkjVzbmUbWqk/gqp5dqnVB5of4VURanKtZuBYX+D1EraptgTnoDU7GP8335qoWcrnIO2XHml 0maAVIQQkNpNzzO3rrNStm7gYt2uPQEU1Tx6sxZb93BF7VPloy57yi6VoMJR951NPamk3axr udKBRF1p1x1dz7aJuqSrbZus1II8WqkApR4dXKyrvd7fY+ePPD8Z8h+Gts+N2tny7HsPSEUI AakYY4xr8tIUkvU9frefnQMDqQgBqRhjjHvcEydPdZC6PBoYhoFUhIBUjDHGPWJ17w86/Yzk wozHL2MgFSEgFWOMcY/46edfdlHUpgqe4gWkAqkIAakYY4y7xVeNv9ZNPbW+iwdnAakIISAV Y4xxRX57y0fJCQ0NyfU33UZ7AKkIAakYY4zz4Qceedx19c/vQw/cAFIRQkAqxhj3cjee+5Xk 7D404T6QihACUjHGuJf7pTfecVHUe3LwtDIgFSEEpGKMMXa+5Y7JDlJXdfHjkYFUhBCQijHG uCJv2rErOfW0LySXjb2a9gBSEQJSMcYY58OPP7PARVH1l/YAUhECUjHGGOfCiqCefMopLqJK ewCpCAGpGGOMe9xvbfq1i6IqJ5X2AFIRAlIxxhjnwhrNr+9sje6nPYBUhIBUjDHGubDmRdX8 qLQFkIoQkIoxxjgX1pOl9H1938OP0R5AKkL9B1In/8H/dKBajecsWOq+NPPgZWs2ufkC8+D3 Pt7NTQFj3DWg1dCQvL3lI9oDSEWo/0DqxZde7n6h475ldQ3mwV9s/HIy+vIrc+Erxn3V3bDy 4NvumuJyDPPgGY9+t+ofql3lZxe9lpsfwG+u/VUufvy+9pebkxNPGpBcNf5aoBNIRah/Qep9 Dz1aty91zd2Xl5tdXgDgm/d9KzdgNOGGW3IDjOdddEluQFqTo/PDBuPyVjQ3L59b5edW8l0z +MwhyXHHHbc/rf8cbvsI9TJIJScV4/xY3bl5SV958fWf5iaqmZcfv01Pzuv2H7pDz/liMuB3 T06++Qff6rD87nsfyM0P4Guu+3pufgCPOP+iDjCreWXTe11r6iXc9hECUjHGGNfBSjnQ97TS Q2gPuvsRAlIxxhjnwoqW6nt66er1tAeQihCQijHGuOet2UKGnHWO676mPYBUhIBUjDHGufC8 xctdFFWzL9AeQCpCQCrGGONcWLNxaOqp5vc/oT2AVISAVIwxxj1vgakAVaPmaQ8gFSEgFWOM cS780Kzvua5+PdyA9gBSEQJSMcYY58J62MUZZw7hUctAKkJAKl9kGGOcDy9bs8lFUTX9FO0B pCIEpPJFhjHGufDEyVMdpC5v3kJ7AKkIAal8kWGMcT7mRh10+hnJhZdcSnsAqQgBqUAqxhjn w3MWLHVR1Jmzn6E9gFSEgFQgFWOM8+Grxl/rpp5av/23tAeQihCQCqRijHHP++0tHyUnNDQk 1990G+0BpCIEpAKpGGOcDz/wyOOuq/+FJStoDyAVISAVSMUY43x4+IjzkrOHfYm2AFIRQkAq xhjnwy+98Y6Lot5z/7dpDyAVIQSkYoxxPnzLHZMdpK7a8CHtAaQihIBUjDHueW/asSs59bQv JKMvv5L2AFIRQkAqxhjnw0/MW+SiqI8/s4D26HuQ2ph6YeqdqbembkrdUGTbiX67WjWqyP5a vsKv2556bupBft2E1M1FPAdMQkAqxhj3Y1829urk5FNOcRFV2qNPQerA1J96QBzvIXRP6tlF YFbrkhqPdUHqzzL2H+7LXezrcGPqHanX+fVjPUSHXuHLmQ0mISAVY4z7qd/a9GsXRf3G7ZNo j74HqQ/66OWAYNk0H6UM1eChcVuNkDrTg+j2jP1neVAOo7fj/Xaji5S3xrsBTEJAKsYY91NP nfEdB6ka3U979DlIXVdhNFKQuTH15BohVZHRm1NPyth/pO/Sj7v/td2YjLKmpG7xkV2EgFSM Me6v1ryojed+hbbom5C6O/VU39Xe6uFvvk8DMI322w0vApmVyCKele6/xKcGxJHSQb4uTeAR AlIxrnT0885/Tn687Rclt9F6baf//+pv/9a5VFnvffKv7ct+8uHWZOnmlckb7/9Vl9Rfx9vw 95/2q2um9td5x+e+8e//yS1b8ze/6rC9roFtH16bvuz5r/7YRVHve/gxPud9E1IT3w0/18Po RA+BC4Oc1e0eZAudgNRCFftP98A8IWPdNA/Sg8AjBKTiXmFBxdNvP5Gs3bGzy46hsh9fPbMk 5N279MaSZWi9gewfv/O0c6my7Hx+9Kt17vXDP/ofyTPNc7rk/FT+q1tW9arr/uKGl5PXfrmm 5v3V/n/w57+XPLh8crJ8a1tXtn4IaJnaetqy/57MWv1Q8oud/+LWPbZqRjL99Ukdrk2/gKeG BpeXyndNn4XU5ozu9FYPgs8V2gYpFboBUhU1neMh9OYSaQPzQSMEpOJe4xjqusICuFIQWk9I jSOpL6xbkPyvFfd1eRv2tkhqZ8Fa7S8Itdfv/t1HydRXb0qWbXmr/cfPQ2/8fvIn7z7Xre+1 vHj99t+6Ef1XjPsq3zN9F1I/81HUY+67hbZR9fq7rXB0yqftAdhOqiOkClCX+aju2CL7jgrq hRCQivMHo4ISRc8EEAZ0izctc+Cg5QItWV2z2kbbv739g/ZlYXlaFnfRax9Bivaz7nhtJ1A0 yMyCOYMXgaWicto/BplSkGpdzD/b8Q8dIFV1/6OffMdBapguUM6qo9pD9Vj94ZbMtAOlDsi/ /Id/63BeOqbqrtdqCznrnFdt+3l7+ZWkO8TW+en4il6u+Ov1rh5h5Fr1CNvzL3+9vUPXu9pT 10Xb2Xkp6qnzVrnqrg/3iYE8htT5P1voIqjhtn+2+UfJHy67vV9CatOT81xX/9PPv8z3T9+F VIHhmmjZRB9JHeahMvR8D4qTPDTWA1INUD8rU+Z0n4qAEJCK82PBi7ra1dX6xE+a2rtiBSEC FAGcwOHRVdMd7AhotO0jb051y7Wvlqlbt1R0VDCkrl6VJzDU/wJglaljaltBjV4Xg1R1CWt/ /VVU7uVNf1EWUgVMKt+6lkMQUhRP5yJQ0noDslJW/VR3tYfaS/8rHSKsh8rSX9VRYBxGJbVO 5//A63e4MmYsv7u9ve16aL2W2XXR+ZaLJIdW1FLXQ1YdrQyD8D9d/0N3/RTJ/M7K+9vb3+qo 87EUCIt06rXK0l+ds1IjVPfwuAJqrdc5x5CqcwrbKbyu9oOlP0HqxZdengw6/QzmRu3bkDo+ gM6CB1NFSxdXAZk3+lzR8L7dVCRvNGv/aX7ZVL9v6EFlgBohIBX3rC1qJrCxZU/+9LHk+XU/ yAQHg09FxizaWg5SFckUdAmObL0ifII4i8hW0t0fdg0v3LjE7W9RyCxINUB9as3j7ZHE+Hxi mCpnwdacv3yyQ/sJ1gRmVg+Bn9rFItIxpKotLAopcFbbzW1+1r0WuAtg7XpovcqrBlJ1DNlS GlRGCJy6DirPckVltZHAtVh3v/1IUJk6L4Fl2OayzsFyi+N21b7z3p13DEyHZfQXSH1z7a9c FPW2u6bwHdT3nzg1xUcod3lYXF0oPjApCzLtaVWmJr9NY4X729yrWR4XbLeRfFQEpOLc2UBB US51MYfdwqUg1QDMlpWCVMGQddeH3dHW5VwppIbHVD0FqeoyzoJUwaTATHAUnlNnIVWAqsik orgGpnHagUCzWH6njhUPElMdFKXU/wLSeABXufaJUyq0rdpF52hW173qbZAadrMbHIfXMAtS ra3NigRbXXUdBdeWcxq3q66F/fAJ0w76I6R+875vOUh4ZeW7fAf1fUiVBviu9qFgB0JAKq5h 4JK6fgUIgheBmEXyikFqvH8pSFXU0wCp1oFTMVTJOqZFZ2NI1WutV9QyhJ7OQqqis4o6qsvb oqZx2kE84CiG1HhQV1iH8JyqGTgWb1vMBqlZ16scpOpHTFZOqeW/qq3th0jcrlnnrRQHlWup Dv0BUt/7eHcy5KxzkhHnX8R3T/+BVIQQkIrrMbelph4SrAhaq4FURTWLgadgJl5vkKKu6FpH 9wuKXvr5q5mQal3TymENYamzkGpWvQVmlr9pEcTOQqq63MO0hjASXUm9lEagbeMBXaFrhdR4 8JZSGgTr1g5hBDhu1zBaHOb3qlzLle0PkDpv8XIXRZ3x6Hf5zgFSEUJAKi5lzRMqkAu74pUv alBUCaQK0LTM5ryUBSy2nUXMwhkAwpzGSiE1hCTLpbXBTsUGTml9OMiqHjmpYeRUVk5qGNHt DKSqS1w/EMK2NBCudCCcoptx17ryQRUBrhRS1XVfDlIt/UH10w+GEIzjdtV7RNuEMyioTkoZ 6E+j+yfccIubG7X5/U/4/gFSEUJAKi7XfS2oUZ6kInYCVEGSAY1F5gQixYBSUCEQtJH+gg+b mD0ELS1T7qOAxUbchxE1gW38JCKDFwGOIEr1EySqrHAAU6kpqARs1u3fWUhVbqfKUgqDIog6 V517CMudgVTllOo8FVHV4DS1qY5XzcApG5Smuuma6q9NI1YppOr66MeLyioFqUoB0LHi8uJ2 FTzrnASl+mGkc1MUNkwhiK+Nrpsi4sXyZnVueh1Pf5ZXr/3gN8mJJw1Irrnu63z3AKkIISAV V9pFLEC0QT3q8g8jq+pS1zrBpaJlWRPlCzDUnavtBHKCzXA7QYogQ+VrG4GSRQu1TvsUm4JK UVcBS3gMQWI4IErHsqmMBFYGVzaoRyPPtUzbaFsbhKVlKquaKbt0HlYPwXcISSo77moPl+lY Yd2y6qC66RpoPwG50iWqgVSLkGuWBtVRf/Xa1gmu40ir6hcuEzzqHG3WgbB9Y+tHTpxHmwX/ Oi+VJ/BU2fG1jiFV7RLWSfUO31P2XixWr7z5oVnfc139zy56je8dIBUhBKRi3LssII1H0WdN hJ+nHzjhVGClIDUPTzfrSZ930SXJGWcOcYOneK8DqQghIBXjqiCplLujW1nRakGfIqmKNOqv Xit6a0/xKuXuAjwdR9FTpYaEaRchpNpMBZU8JEHnZ7My9EVIXbZmk4ui3jllGp81IBUhBKRi XP3z5ks57iLvyinB7HGt6ha3Sfete7uU1SXeXZCq6bcEqFmPdVVXvdWp1EwDYd6wbR/Oh9tX LDjV9+3y5i181oBUhBCQijHG+ZgbVY9AvfCSS2kPIBUhBKRijHE+PGfBUhdFnTn7GdoDSEUI AakYY5wPXz3ha27qKU1BRXsAqQghIBVjjHvcb2/5yE3ef/1Nt9EeQCpCCEjFGON8+IFHHndd /S8sWUF7AKkIISAVY4zz4eEjzkuGnHUObQGkIoSAVIwxzodfWfmui6Lec/+3aQ8gFSEEpGKM cT58yx2THaSu2vAh7QGkIoSAVIwx7nlv2rErOfW0LySjL7+S9gBSEUJAKsYY58NPzFuU8P0K pCKEgFSMMc6Vrxj31eTkU05xEVXaA0hFCAGpGGPc435r069dFPUbt0+iPYBUhBCQijHG+fDU Gd9xkPri6z+lPYBUhBCQijHG+fAXG7/sTFsAqQghIBVjjHPh+a/+2EVR73v4MdoDSEUIAakY Y5wjIGpocHmptAeQihACUjHGuMe9fvtv3Yh+jeynPYBUhBCQijHGubC+S/WdqjlSaQ8gFSFU B0i9esLX3LOlMcYY1+6zh/2fyYDfPTn55h98i/bIka+57utAKkK9FVIxxhjjvuorxl0DpCLU WyH1gUceT1Zt+BBjjPuNf/jGO8mQs85Jfv8PH6pLebfddY8Doj9+8c9p35z5azfdBqQi1Fsh lZxUjHF/s+BF33/qDq5HeQLe4SPOo23JSUUIAakYY5wPSJ23eLkra8aj36VtgVSEEJCKMcb5 gNQJN9zi5kZtfv8T2hZIRQgBqRhjXLsFlPWA1LUf/CY58aQBbpaUPJ3fm2v3Jd+870CXHuOV lfuSGY/uB1IRQkAqxhjX0/WA1Jmzn3HlPLvotVyd2z33H0hGX36oi+HvoDOQihACUjHGuM6Q KoDpTBnnXXRJcsaZQ5L3Pt7d7fV/7+M9yUtvfJ48/XxLsnT1viC6uzeZOPlgcuElh5JVG/a5 7Zrf3+uW6/W8xZ8nm3bsSd7estct7xhhPnaZtnt2UUvy4utt+9l211zX6qwygVSEEJCKMcY5 gdRlaza5Mu6cMq3b6y5wHD7icArIR5KLLz2UnHhS4iKngkh1wZ962hG37Oxhh5O3Nu11Ec8J N7QmJ59yJK1zktz3cFukNY6ExtFRpQyc0JC0H0vlLW/el57zQVeWrGVAKkIISMUY45xAquBU ZQhWu7vuU2ccSBrPPeyipJaDKihVlDSru1/gKTids6DFRT4VVS0HqSpLgPrCks/bI7eXjT2U XDHuEN39CCEgFWOM8wip6t5XN/+Fl1zaI3V/4JH9Dkpnzt5/TPd8MUg976KOEc9ykKq/itKG 6xVF1YApIBUhBKRijHEOIXXOgqVufw2c6om6r9/elhOqSKcsmHxo1v72yGoWpF49obUqSM1a z8AphBCQijHGOYZUTTmlqac0BVVPnoNg9fFnWhyAClbvvvdAUUiNgTILQgW+tkxd+3odrlfO q1IFgFSEEJCKMcY5g1TNsarJ+zWJf0/VXTmp8TyoAkqBpUFq2FWfBZR6bdtbzukXGw+3b6fy NSjKorOyorUaLKVlNhgLSEUIAakYY1xHK6e0Fkh94JHHHeC+sGRFzcd+7PstHSKdGqSk1zaV lEbv67UNhIrd9OR+FzlVbur8Vz93rwWPgkit1+h9vdZIf+WsZkGq9rUydBxBrkbw23YaYKVZ AhSl1XpFbAedfsQBsNbfcsfBZMhZbccIQRZIRQgBqRhj3AmfPexLKZh9ver9ho84L4Wzczp1 7M5CqkU1NReqop0aFGWAavsLLkecf9iVKWiV43lWFS3VLAGyorOC3XA7zRogeNUxNA2V1hmQ ahCVRvrr2JrmCkhFCAGpGGNcJ0gdffmVFY3kt/9fWfmui6J+875v0Ya9xEAqQkAqxhj3SUj9 xu2TkqvGX+tG9N965zcdpK7a8CFtCKQihIBUjDHuOUgV5Oi7Uj7+hBOSoWcP65EJ/DGQihCQ ijHGQGompB533HHt/5934cXJ0tXraUsgFSEEpGKMcc9Caugrxn21Q74qBlIRQkAqzol/sfNf krU7drq/tAfuL5CqaOq5X/m/kvXbf9ut9dWUUBq1z7UDUhECUnGn/N4n/5os3byyS4+xaec/ J8u2vFV0/Z+u/2Hy4PLJRdf/eNsvknuX3uhAU6+1rfbJ2vbVLas6lPWjX61L/uDPf8/t/yfv Plf3c4vr1lv8xvt/lfzlr7fXvP+s1Q+58w7PXW39v1bc55Y99Mbvd7jmtm2p64yz/cXGL1ff 3X/88cnpZ5yZwuJHxwBkutrNWVqsHE0pZXOMagoqTetU/EEDidvGfc537HHTPGmZ5jXtijlJ yz0CFUitWten3llk+Vb/ftqTeknqocF6/b8sdUvq1tRrUjfWWIdGf4x4/5G+XJW/K/VTqQcU KWNm6mZwCQGpfcwx1HWFBZSCmu6A1Le3f5As3rSs/fWTP30seWzVDLevYLne56ZyVZeuKLur rDqrPdWunYHUp9Y87sr65T/8mwPeqa/elCzcuMQte3nTX7jXqz/c0n5M/UgAUmsBsyurgtTj U0Ad8LsnZ+ah1htStZ3Nmaoyreyumo9U9ZmzoAVIrY8meDiMIXW0B8PZqYenHpt6e+rNwTbN ftmY1KNSr0u9rYY6XODLSSJIHZT6s9QbfX1G++Mvzyhjut8fSEVAam+OmGZ1eReDVIHHz3b8 Q9XH2fD3nyYb//6faoZU7S/XCqlZMPXCugU1nUep89d6tWk5GIzbIk5B6Mw1VdkGiaXqGbdn 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 FzRWZSgj7jIAAAAASUVORK5CYII= --BXVAT5kNtrzKuDFl Content-Type: image/png Content-Disposition: attachment; filename="blkif_segment_struct.png" Content-Transfer-Encoding: base64 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 iYiIkqVkiZIlIiJKlpIlSpaIiIiSpWSJkiUiIkqWkiVK1vHkzDXXzurws1/8qvUhIufAdYHr A9cJ60PJEiVLluTVr//lWf196i//xvoQkXPgusD1geuE9aFkiZIlSpaIKFlKlpIlSpaSJSJK lpKlZImSpWSJiJIlSpYoWaJkiYiSpWQpWaJkKVkiomQpWUqWKFlKlogoWaJkiZIlSpaIKFlK lpIlSpaSJSJKlpKlZImSpWSJiJKlZClZomSJkiUiSpaSpWSJkqVkiYiSpWQpWaJkKVkiomQp WUqWKFmiZImIkqVkKVmiZClZIqJkKVlK1qGcAOHBR755zmePP/n0/me/+NXZZ1//5/8457O/ +/a/nvNdXitZm4d9kjpmX4ztx7qP2Hd1/2xz25Ss1Vm0n9in2zrH/vrr/7T/8GPfHl2303D+ i5KlZClZWyPb3p4Ed9334P5zfuq5B5/9yAUX7P/W79xy8Pntn7z3nO/yWsnansAA69mb5v0f /cR5klNO3Bnvft8HlKyjfYE9Zz9984n/3L/mXdfPzrv6+Zlrrp19tu5ykSLOb5bR+5zz/8d/ 4icPlvujP3bh/m+/5/dO5PkvSpaSpWRtVbJ+4VWvme3o/Bp96NHH95910UWz9z//5a/Nfu3+ yq/dMJv2PX9w+0EjwHc+ds/9StaWJeviF754tm5/+/i/nPc59Z6GuErOP/zbD2bf+fQXvqJk HYML7PU33jz7PxGjN731HbP3+WHD+cc5yf+894Yr3rz2Mi/92Z+bzasnWSwLqarnP9MxPUJf z/9bPnSHkiVKlpKlZI1JVnvw82uZi2wrHUzHr1u6EdoTSMnansD0IlgI8dXvvG623gjxkOTk BFayjvYFtu4fuvF4j/3bTn/lmbfNPhvr5hsC8eY85RyOmPckC8Hj/G+7AJEuol/Mp41oKVmi ZClZR1qyEJcP3nn37KKH5PCrtc2RyoWS6BGRJaYjhM9FeSjkf+2v3zi7WPOLk2Xc+pGPz94f kywuwr0TIt1S93zu4VMnWW29E3kgStSb9k/u/6uDemc6ogG96Xj/ut+8aTYd+/Gxf/z3WT2y jxZJ1k9f+jOzhvI3bnrv7LtK1vogFURq2b+ch/zfyzUi2sQ+Yhr2HdO1OUs5Zu64+76D6fif fcy+SF319g/HBXXK8dbO8+ZbP7xyXbP8RK7//IEvDUoW0v7ay6887322uV22kiVKlpJ15CWL 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 5BebknU4g5tyXrAvgKhlfn2ni7letKm/o/iQ8rHzP3mJSpZsSrLSpU5UH2Eiutz+IE2+Mj0F 7Zh1uR5xHU1uZE/GcmOZkqVkrZTjlYOwQs5JewDVz5eJaPXG+1Cylrubrd0/CHBbjzlR24T4 JUYRVrIOSUKSS1LhvTre1S730zbHFFKyZFOSxQ8QBKg9f3gWbH6U5pozNF4d8KN0LF+1lSol S8laGqIj5IKwIzlwendd1DuWVolktXc7KVnLdeUlZ45fWr2cF/ZJ6niVSFbY5rYpWcOwz5If 1cux3OV+2kYk6ySc/3J0h3DguOLcYQidiBbv53XvjsOezLQ3pdRx6JQsJUtOqGSdFJQsEdmE ZCFVpFHkSSdtQjy9MXW8uV43YG46oosxYw/2BtedenehkqVkiZKlZInIsZcsIlPkoCJTNXeY XhnyGRPJ4lrNa67d9YHpGc+NrsZ2+B26IJk/PQbJJVSylCxRspQsETl142SR+M64VhmLjnEF az5jbiTJ+FfJ4Wqf84lUIWc1vwuRS5djuvGVLCVLlCwlS0ROfE4W0amM5J5x2uqQDrV7kbvp M+I742j1pqvjzyFniFcG/V004vuy48sFxq4buiFEyRIlS5QsETnUxPdN3KBBd2Evd4tIFlGw JM9PkaxtjC+nZImSJUqWiBw7yeKO+uR4pVsQqcrQDrXbL+LDHd+0BYvuXFx1eCXmnRHslSxR skTJEpFjKVlAFCvPkK3wUPg6bE479ts2rme98eWULFGyRMkSkWMpWYkgkVDfPvuz7VqsY78N 5Xat233Zji+nZImSJUqWiBxbyTrKKFmiZImSJSJKlpKlZImSpWSJiJKlZClZomQpWSKiZClZ SpYoWaJkiYiSpWQpWaJkKVkiomQpWUqWKFlKlogoWUqWkiVKlihZIqJkKVlKlihZSpaIKFlK lpIlSpaSJSJKlpKlZImSJUqWiChZSpaSJUqWkiUiSpaSpWSJkqVkiYiSpWQpWaJkKVlKlogo WUqWkiVKlpIlIkqWkqVkiZKlZImIkqVkKVmiZClZIiJKlpKlZImSpWSJiJKlZClZomQpWSKi ZClZSpYoWUqWiChZSpaSFcm65l3XyynkWRddNNv/b3rrO6yPFXje8y+e1d8brniT9SEi58B1 gesD1wnr43zedPU7To9kiYiIiBwCJ1+ybv/kvSIiIiI74ZYP/U9zskRERETMyVKyRERERMlS skRERETJUrJERERElCwlS0RERJQsJUtERESULCXraJFBzTxgRURElCwla4MYiRMREVGylCwl S0RERJQsJUtERESULCXLA1ZERETJUrKULBERESVLyVKyRERERMlSskRERETJUrKULBERESVL yVKyRERERMlSskRERETJUrKULBERESVLyVKyRERERMlSskRERETJUrKULBERESVLyVKyRERE RMlSskRERETJUrKULBERESVLyVKyRERERMlSskRERETJUrKULBERESVLyVKyRERERMlSskRE RETJUrKULBERESVLyVKyjjTffOI/9//u2/86aTrrS0RElCwl69Tzqb/8m4M6gds/eW93ujde 9Zb9V7/+l7ufffoLX9n/pde8fv9HLrhgNo9nXXTR/jXvun7/6//8H0uvz4suecnBuvC/+0hE RJQsJetYS9av/NoNM8H666//0zmf/8O//WD/+htvnk3Tkyy+j1whRLd+5OP7d9x93/61v37j 7L2XvuwV+48/+fRS6/PH9/7FbD0u/dmfU7JERETJUrKOv2T1Ilgc0K+9/MqDOutJFhEsIldt V+K73/eB2Xdu+8N7VlovlqVkiYiIkqVkbQSiRn9y/1/t33zrh2dRIQRoTI5u+dAds+k++8Wv Dk7HZ+//6CdmcIASWeK7kaIhyXrwkW/u/+iPXTgTqA/eefegZD3np567/4Yr3nze+w89+vjs O0S1lCwREVGylKxDPXjoImPdfvwnfnImOPz/istedU5uE3LEe5kO+B/RqUnnCNuZa66dfRZZ ogvvN2567zlSNSRZyBndhH/7+L8c1NtQTlaPu+57cPYdhFHJEhERJUvJOjSufud1MxH6/Je/ diBJCArrStdbpvuFV71mJk0fu+f+g+kQJAQKqcp0v/2e35t997d+55ZZ9Irp6LpLcvoiyerV 21TJYlmIIMt6+LFvK1kiIqJkKVmHB1JB11s7BALdgdy9x//3fO7h2bojUO33uZuPz0hcR3IQ NvKl2unovtu2ZCWC1ltPJUtERJQsJWunEHHKsAV06SE/yFKdJtEpcrH4vJLvE+Giq4//3/MH t5+3HHK+tiVZtYvyTW99x3nrr2SJiIiSpWQdStI7okQ0K+vI/wytkCT1RKvGQKySD9UTp1aq NiVZ5I0ROWM6crnWESwlS0RElCwlayuyhfgQtWKcqSS/164+Pudg64Hs0L2YiFc7/3Q5blKy kMAk7feWqWSJiIiSpWQdCiSmM8QCA3n2ZIP1fewf//1gKIWeEP35A1+aCU5Ei+R4Rmlvp0uX 46YkK4JFknuS8ZUsERFRspSsIwOi8tznX3zOoJ5EtYhmMUwDrxEtEtqRjzod//MeYpX36WZk O6u4IVR8f5OShcglF2zRNpIr1o79xd2HvNc+gkfJEhERJUvJ2ggkpBMNQqgYzoGuwZ++9Gdm 60oEK9Px2JlMR44W0yFn7XTcpZjxtBC4/J+8qU1IFgOWLsoRYx0zfZ5L2LsrspUvJUtERJQs JWtjkEuFdDAWFlLEnXp0A7bTITdEqjIdUpZhHtr8LiJZ1/3mTbNkdCJJyBTbT27WMpLFerV3 K2Z9x6iP1eGuySpdwOe8146npWSJiIiSpWQdSRjItPdYngxwmkFPp0rWYYwbpmSJiIiSpWQd Ocjlohsxj8UBnifIsBDIS4ZYULJERETJUrKUrCVzvEiEh5e98rKDIRYQr/pA6UhWOGzZSt5W Bmb1wiIiIkqWknXkIIrFsA7kPJGTRf5TexcfdyMiVoHH8hzmOpPYn3Xhfy8sIiKiZClZIiIi omQpWR6wIiIiSpaSpWSJiIgoWUqWkiUiIiJKlpIlIiIiSpaSpWSJiIgoWUqWkiUiIiJKlpIl IiIiSpaSpWSJiIgoWUqWkiUiIiJKlpIlIiIiSpaSpWSJiIgoWUqWkiUiIiJKlpIlIiIiSpaS pWSJiIgoWUqWkiUiIiJKlpIlIiIiSpaSpWSJiIgoWUqWkiUiIiJKlpIlIiIiSpaSpWSJiIgo WUrWrnj3+z4wwwNWREREyVKyRERERMlSskRERESULCVLRERElCwlS0RERJQsJUtEREREyVKy RERERMk6ApKVoRBERERENsGtH/m4kiUiIiKyaV50yUuULCNZIiIiYiTLnCwRERExJ0vJEhER EVGyRERERJQsJUtERESULCVLRERERMkSERERUbKULBEREVGylCwRERFRspQsERERESVLyRIR ERElS8kSERERJUvJEhEREVGylCwRERFRspQsERERUbKULBERERElS8kSERERJUvJEhERESVL yRIRERFRspQsERERUbKULBEREVGylCwRERERJUvJEhERESVLyRIRERElS8kSERERUbKULBER EVGylCwRERFRspQsERERESVLyRIRERElS8kSERERJUvJEhEREVGyRERERJQsJUtERESULCVL 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 bsNEXTMECPNi/zFvjslEAuuwEdQp0+U4bZeTcdkWdZeLiChZDkY6SEZ0r1GkjEm1KAepHcQz 0ZlA5GfRHXo5cGjsIkIQYRuSuoxJNRTBS/J6oipsH6JTB76ksSVnqEog21EHtUzCfG/QzRbW N/NP9IR5I1M1Yb039hiCV7ef9QAkta4L0sb+YZ3SRbsrySLHLOKX6GN752hEqdYx25+oHgJa 67puc7pbk7c1dNdfctJqtyGixfFQ58Xx2HYRczzWZbKuiWDW5SQKPGW/i4goWadUshYNwcCO a6NBRBlWeYZevkt+zpTHrgwl0tc8mkViNjQN0tJbB95n/ouWwXdpoKc8oqXtCuyJZZa7aH5E FtvuUaSSdam5YocxFEhkjPUZGrg0dTCljmtdM+2qx0x7/FBXi+aVZS7z2CQRESVLyTon12oo 2nOcIUpExGgTjbIsL1kiIqJknVrJolEkz4gus0XjXB0n6K5Krla640TJEhFRspSsnd5VSK4J uSfLjlp+lGF7yPFBtqYMLSGbgTHEyJUyP0lERMmyu1BERESULCVLRERERMlSskRERETJUrJE REREyVKyRERERJQsERERESVLyRIRERElS8kSERERUbJERERElCwlS0RERJQsJUtERESULCVL RERERMlSskRERETJUrJEREREyVKyRERERJQsJUtERESULCVLRERElCwlS0RERETJUrJERERE yVKyRERERMlSskRERESULCVLRERElCwlS0RERJQsJUtEREREyVKyRERERMlSskRERETJUrJE RERElCwlS0RERJQsJUtERESULCVLRERERMmaS5aIiIjIIXCiJes77mARERE5JB4+ypL0/wGh 4hZDpPSCdQAAAABJRU5ErkJggg== --BXVAT5kNtrzKuDFl Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="blkif.h" /****************************************************************************** * blkif.h * * Unified block-device I/O interface for Xen guest OSes. * * Copyright (c) 2003-2004, Keir Fraser */ #ifndef __XEN_PUBLIC_IO_BLKIF_H__ #define __XEN_PUBLIC_IO_BLKIF_H__ #include #include /* * Front->back notifications: When enqueuing a new request, sending a * notification can be made conditional on req_event (i.e., the generic * hold-off mechanism provided by the ring macros). Backends must set * req_event appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). * * Back->front notifications: When enqueuing a new response, sending a * notification can be made conditional on rsp_event (i.e., the generic * hold-off mechanism provided by the ring macros). Frontends must set * rsp_event appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). */ typedef uint16_t blkif_vdev_t; typedef uint64_t blkif_sector_t; /* * REQUEST CODES. */ #define BLKIF_OP_READ 0 #define BLKIF_OP_WRITE 1 /* * Recognised only if "feature-barrier" is present in backend xenbus info. * The "feature_barrier" node contains a boolean indicating whether barrier * requests are likely to succeed or fail. Either way, a barrier request * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by * the underlying block-device hardware. The boolean simply indicates whether * or not it is worthwhile for the frontend to attempt barrier requests. * If a backend does not recognise BLKIF_OP_WRITE_BARRIER, it should *not* * create the "feature-barrier" node! */ #define BLKIF_OP_WRITE_BARRIER 2 /* * Recognised if "feature-flush-cache" is present in backend xenbus * info. A flush will ask the underlying storage hardware to flush its * non-volatile caches as appropriate. The "feature-flush-cache" node * contains a boolean indicating whether flush requests are likely to * succeed or fail. Either way, a flush request may fail at any time * with BLKIF_RSP_EOPNOTSUPP if it is unsupported by the underlying * block-device hardware. The boolean simply indicates whether or not it * is worthwhile for the frontend to attempt flushes. If a backend does * not recognise BLKIF_OP_WRITE_FLUSH_CACHE, it should *not* create the * "feature-flush-cache" node! */ #define BLKIF_OP_FLUSH_DISKCACHE 3 /* * Recognised only if "feature-discard" is present in backend xenbus info. * The "feature-discard" node contains a boolean indicating whether trim * (ATA) or unmap (SCSI) - conviently called discard requests are likely * to succeed or fail. Either way, a discard request * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by * the underlying block-device hardware. The boolean simply indicates whether * or not it is worthwhile for the frontend to attempt discard requests. * If a backend does not recognise BLKIF_OP_DISCARD, it should *not* * create the "feature-discard" node! * * Discard operation is a request for the underlying block device to mark * extents to be erased. However, discard does not guarantee that the blocks * will be erased from the device - it is just a hint to the device * controller that these blocks are no longer in use. What the device * controller does with that information is left to the controller. * Discard operations are passed with sector_number as the * sector index to begin discard operations at and nr_sectors as the number of * sectors to be discarded. The specified sectors should be discarded if the * underlying block device supports trim (ATA) or unmap (SCSI) operations, * or a BLKIF_RSP_EOPNOTSUPP should be returned. * More information about trim/unmap operations at: * http://t13.org/Documents/UploadedDocuments/docs2008/ * e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc * http://www.seagate.com/staticfiles/support/disc/manuals/ * Interface%20manuals/100293068c.pdf * The backend can optionally provide three extra XenBus attributes to * further optimize the discard functionality: * 'discard-aligment' - Devices that support discard functionality may * internally allocate space in units that are bigger than the exported * logical block size. The discard-alignment parameter indicates how many bytes * the beginning of the partition is offset from the internal allocation unit's * natural alignment. * 'discard-granularity' - Devices that support discard functionality may * internally allocate space using units that are bigger than the logical block * size. The discard-granularity parameter indicates the size of the internal * allocation unit in bytes if reported by the device. Otherwise the * discard-granularity will be set to match the device's physical block size. * 'discard-secure' - All copies of the discarded sectors (potentially created * by garbage collection) must also be erased. To use this feature, the flag * BLKIF_DISCARD_SECURE must be set in the blkif_request_trim. */ #define BLKIF_OP_DISCARD 5 /* * 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 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__)); struct blkif_request_discard { uint8_t flag; /* BLKIF_DISCARD_SECURE or zero. */ #define BLKIF_DISCARD_SECURE (1<<0) /* ignored if discard-secure=0 */ blkif_vdev_t _pad1; /* only for read/write requests */ #ifdef CONFIG_X86_64 uint32_t _pad2; /* offsetof(blkif_req..,u.discard.id)==8*/ #endif uint64_t id; /* private guest value, echoed in resp */ blkif_sector_t sector_number; uint64_t nr_sectors; uint8_t _pad3; } __attribute__((__packed__)); struct blkif_request { uint8_t operation; /* BLKIF_OP_??? */ union { struct blkif_request_rw rw; struct blkif_request_discard discard; } u; } __attribute__((__packed__)); struct blkif_response { uint64_t id; /* copied from request */ uint8_t operation; /* copied from request */ int16_t status; /* BLKIF_RSP_??? */ }; /* * STATUS RETURN CODES. */ /* Operation not supported (only happens on barrier writes). */ #define BLKIF_RSP_EOPNOTSUPP -2 /* Operation failed for some unspecified reason (-EIO). */ #define BLKIF_RSP_ERROR -1 /* Operation completed successfully. */ #define BLKIF_RSP_OKAY 0 /* * Generate blkif ring structures and types. */ DEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response); #define VDISK_CDROM 0x1 #define VDISK_REMOVABLE 0x2 #define VDISK_READONLY 0x4 /* Xen-defined major numbers for virtual disks, they look strangely * familiar */ #define XEN_IDE0_MAJOR 3 #define XEN_IDE1_MAJOR 22 #define XEN_SCSI_DISK0_MAJOR 8 #define XEN_SCSI_DISK1_MAJOR 65 #define XEN_SCSI_DISK2_MAJOR 66 #define XEN_SCSI_DISK3_MAJOR 67 #define XEN_SCSI_DISK4_MAJOR 68 #define XEN_SCSI_DISK5_MAJOR 69 #define XEN_SCSI_DISK6_MAJOR 70 #define XEN_SCSI_DISK7_MAJOR 71 #define XEN_SCSI_DISK8_MAJOR 128 #define XEN_SCSI_DISK9_MAJOR 129 #define XEN_SCSI_DISK10_MAJOR 130 #define XEN_SCSI_DISK11_MAJOR 131 #define XEN_SCSI_DISK12_MAJOR 132 #define XEN_SCSI_DISK13_MAJOR 133 #define XEN_SCSI_DISK14_MAJOR 134 #define XEN_SCSI_DISK15_MAJOR 135 #endif /* __XEN_PUBLIC_IO_BLKIF_H__ */ --BXVAT5kNtrzKuDFl Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel --BXVAT5kNtrzKuDFl--