WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 1/2] Move the block request specific fields into a un

Move the request specific fields into a union

Make the block ring interface extensible by moving the current
read/write fields into a union.

Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>

# HG changeset patch
# User Owen Smith <owen.smith@xxxxxxxxxx>
# Date 1292938128 0
# Node ID 7015d7407eae8694ce1cc92e792b2087f109f6cb
# Parent  89116f28083f7d118a259c5bc684d1c4296d9cb3
* * *

diff -r 89116f28083f -r 7015d7407eae extras/mini-os/blkfront.c
--- a/extras/mini-os/blkfront.c Wed Dec 08 10:46:31 2010 +0000
+++ b/extras/mini-os/blkfront.c Tue Dec 21 13:28:48 2010 +0000
@@ -361,22 +361,22 @@
     req->nr_segments = n;
     req->handle = dev->handle;
     req->id = (uintptr_t) aiocbp;
-    req->sector_number = aiocbp->aio_offset / 512;
+    req->u.rw.sector_number = aiocbp->aio_offset / 512;
 
     for (j = 0; j < n; j++) {
-        req->seg[j].first_sect = 0;
-        req->seg[j].last_sect = PAGE_SIZE / 512 - 1;
+        req->u.rw.seg[j].first_sect = 0;
+        req->u.rw.seg[j].last_sect = PAGE_SIZE / 512 - 1;
     }
-    req->seg[0].first_sect = ((uintptr_t)aiocbp->aio_buf & ~PAGE_MASK) / 512;
-    req->seg[n-1].last_sect = (((uintptr_t)aiocbp->aio_buf + 
aiocbp->aio_nbytes - 1) & ~PAGE_MASK) / 512;
+    req->u.rw.seg[0].first_sect = ((uintptr_t)aiocbp->aio_buf & ~PAGE_MASK) / 
512;
+    req->u.rw.seg[n-1].last_sect = (((uintptr_t)aiocbp->aio_buf + 
aiocbp->aio_nbytes - 1) & ~PAGE_MASK) / 512;
     for (j = 0; j < n; j++) {
        uintptr_t data = start + j * PAGE_SIZE;
         if (!write) {
             /* Trigger CoW if needed */
-            *(char*)(data + (req->seg[j].first_sect << 9)) = 0;
+            *(char*)(data + (req->u.rw.seg[j].first_sect << 9)) = 0;
             barrier();
         }
-       aiocbp->gref[j] = req->seg[j].gref =
+       aiocbp->gref[j] = req->u.rw.seg[j].gref =
             gnttab_grant_access(dev->dom, virtual_to_mfn(data), write);
     }
 
@@ -432,7 +432,7 @@
     req->handle = dev->handle;
     req->id = id;
     /* Not needed anyway, but the backend will check it */
-    req->sector_number = 0;
+    req->u.rw.sector_number = 0;
     dev->ring.req_prod_pvt = i + 1;
     wmb();
     RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&dev->ring, notify);
diff -r 89116f28083f -r 7015d7407eae tools/blktap/drivers/tapdisk.c
--- a/tools/blktap/drivers/tapdisk.c    Wed Dec 08 10:46:31 2010 +0000
+++ b/tools/blktap/drivers/tapdisk.c    Tue Dec 21 13:28:48 2010 +0000
@@ -528,10 +528,10 @@
 segment_start(blkif_request_t *req, int sidx)
 {
        int i;
-       uint64_t start = req->sector_number;
+       uint64_t start = req->u.rw.sector_number;
 
        for (i = 0; i < sidx; i++) 
-               start += (req->seg[i].last_sect - req->seg[i].first_sect + 1);
+               start += (req->u.rw.seg[i].last_sect - 
req->u.rw.seg[i].first_sect + 1);
 
        return start;
 }
@@ -600,13 +600,13 @@
        struct disk_driver *parent = dd->next;
        
        seg_start = segment_start(req, sidx);
-       seg_end   = seg_start + req->seg[sidx].last_sect + 1;
+       seg_end   = seg_start + req->u.rw.seg[sidx].last_sect + 1;
        
        ASSERT(sector >= seg_start && sector + nr_secs <= seg_end);
 
        page  = (char *)MMAP_VADDR(info->vstart, 
                                   (unsigned long)req->id, sidx);
-       page += (req->seg[sidx].first_sect << SECTOR_SHIFT);
+       page += (req->u.rw.seg[sidx].first_sect << SECTOR_SHIFT);
        page += ((sector - seg_start) << SECTOR_SHIFT);
 
        if (!parent) {
@@ -667,7 +667,7 @@
                               req, sizeof(*req));
                        blkif->pending_list[idx].status = BLKIF_RSP_OKAY;
                        blkif->pending_list[idx].submitting = 1;
-                       sector_nr = req->sector_number;
+                       sector_nr = req->u.rw.sector_number;
                }
 
                if ((dd->flags & TD_RDONLY) && 
@@ -677,16 +677,16 @@
                }
 
                for (i = start_seg; i < req->nr_segments; i++) {
-                       nsects = req->seg[i].last_sect - 
-                                req->seg[i].first_sect + 1;
+                       nsects = req->u.rw.seg[i].last_sect - 
+                                req->u.rw.seg[i].first_sect + 1;
        
-                       if ((req->seg[i].last_sect >= page_size >> 9) ||
+                       if ((req->u.rw.seg[i].last_sect >= page_size >> 9) ||
                            (nsects <= 0))
                                continue;
 
                        page  = (char *)MMAP_VADDR(info->vstart, 
                                                   (unsigned long)req->id, i);
-                       page += (req->seg[i].first_sect << SECTOR_SHIFT);
+                       page += (req->u.rw.seg[i].first_sect << SECTOR_SHIFT);
 
                        if (sector_nr >= s->size) {
                                DPRINTF("Sector request failed:\n");
diff -r 89116f28083f -r 7015d7407eae tools/blktap2/drivers/tapdisk-diff.c
--- a/tools/blktap2/drivers/tapdisk-diff.c      Wed Dec 08 10:46:31 2010 +0000
+++ b/tools/blktap2/drivers/tapdisk-diff.c      Tue Dec 21 13:28:48 2010 +0000
@@ -363,13 +363,13 @@
        breq                = &sreq->blkif_req;
        breq->id            = idx;
        breq->nr_segments   = r->blkif_req.nr_segments;
-       breq->sector_number = r->blkif_req.sector_number;
+       breq->u.rw.sector_number = r->blkif_req.u.rw.sector_number;
        breq->operation     = BLKIF_OP_READ;
 
        for (int i = 0; i < r->blkif_req.nr_segments; i++) {
-               struct blkif_request_segment *seg = breq->seg + i;
-               seg->first_sect = r->blkif_req.seg[i].first_sect;
-               seg->last_sect  = r->blkif_req.seg[i].last_sect;
+               struct blkif_request_segment *seg = breq->u.rw.seg + i;
+               seg->first_sect = r->blkif_req.u.rw.seg[i].first_sect;
+               seg->last_sect  = r->blkif_req.u.rw.seg[i].last_sect;
        }
        s->cur += sreq->secs;
 
@@ -426,12 +426,12 @@
                breq                = &sreq->blkif_req;
                breq->id            = idx;
                breq->nr_segments   = 0;
-               breq->sector_number = sreq->sec;
+               breq->u.rw.sector_number = sreq->sec;
                breq->operation     = BLKIF_OP_READ;
 
                for (i = 0; i < BLKIF_MAX_SEGMENTS_PER_REQUEST; i++) {
                        uint32_t secs;
-                       struct blkif_request_segment *seg = breq->seg + i;
+                       struct blkif_request_segment *seg = breq->u.rw.seg + i;
 
                        secs = MIN(s->end - s->cur, psize >> SECTOR_SHIFT);
                        secs = MIN(((blk + 1) << SPB_SHIFT) - s->cur, secs);
diff -r 89116f28083f -r 7015d7407eae tools/blktap2/drivers/tapdisk-image.c
--- a/tools/blktap2/drivers/tapdisk-image.c     Wed Dec 08 10:46:31 2010 +0000
+++ b/tools/blktap2/drivers/tapdisk-image.c     Tue Dec 21 13:28:48 2010 +0000
@@ -148,15 +148,15 @@
        psize = getpagesize();
 
        for (i = 0; i < req->nr_segments; i++) {
-               nsects = req->seg[i].last_sect - req->seg[i].first_sect + 1;
+               nsects = req->u.rw.seg[i].last_sect - 
req->u.rw.seg[i].first_sect + 1;
                
-               if (req->seg[i].last_sect >= psize >> 9 || nsects <= 0)
+               if (req->u.rw.seg[i].last_sect >= psize >> 9 || nsects <= 0)
                        goto fail;
 
                total += nsects;
        }
 
-       if (req->sector_number + nsects > info->size)
+       if (req->u.rw.sector_number + nsects > info->size)
                goto fail;
 
        return 0;
@@ -164,6 +164,6 @@
 fail:
        ERR(-EINVAL, "bad request on %s (%s, %"PRIu64"): id: %"PRIu64": %d at 
%"PRIu64,
            image->name, (rdonly ? "ro" : "rw"), info->size, req->id,
-           req->operation, req->sector_number + total);
+           req->operation, req->u.rw.sector_number + total);
        return -EINVAL;
 }
diff -r 89116f28083f -r 7015d7407eae tools/blktap2/drivers/tapdisk-stream.c
--- a/tools/blktap2/drivers/tapdisk-stream.c    Wed Dec 08 10:46:31 2010 +0000
+++ b/tools/blktap2/drivers/tapdisk-stream.c    Tue Dec 21 13:28:48 2010 +0000
@@ -293,12 +293,12 @@
                breq                = &sreq->blkif_req;
                breq->id            = idx;
                breq->nr_segments   = 0;
-               breq->sector_number = sreq->sec;
+               breq->u.rw.sector_number = sreq->sec;
                breq->operation     = BLKIF_OP_READ;
 
                for (i = 0; i < BLKIF_MAX_SEGMENTS_PER_REQUEST; i++) {
                        uint32_t secs = MIN(s->end - s->cur, psize >> 
SECTOR_SHIFT);
-                       struct blkif_request_segment *seg = breq->seg + i;
+                       struct blkif_request_segment *seg = breq->u.rw.seg + i;
 
                        if (!secs)
                                break;
diff -r 89116f28083f -r 7015d7407eae tools/blktap2/drivers/tapdisk-vbd.c
--- a/tools/blktap2/drivers/tapdisk-vbd.c       Wed Dec 08 10:46:31 2010 +0000
+++ b/tools/blktap2/drivers/tapdisk-vbd.c       Tue Dec 21 13:28:48 2010 +0000
@@ -1066,7 +1066,7 @@
        rsp->status = vreq->status;
 
        DBG(TLOG_DBG, "writing req %d, sec 0x%08"PRIx64", res %d to ring\n",
-           (int)tmp.id, tmp.sector_number, vreq->status);
+           (int)tmp.id, tmp.u.rw.sector_number, vreq->status);
 
        if (rsp->status != BLKIF_RSP_OKAY)
                ERR(EIO, "returning BLKIF_RSP %d", rsp->status);
@@ -1181,10 +1181,10 @@
 tapdisk_vbd_breq_get_sector(blkif_request_t *breq, td_request_t treq)
 {
     int seg, nsects; 
-    uint64_t sector_nr = breq->sector_number; 
+    uint64_t sector_nr = breq->u.rw.sector_number; 
     
     for(seg=0; seg < treq.sidx; seg++) {
-        nsects = breq->seg[seg].last_sect - breq->seg[seg].first_sect + 1;
+        nsects = breq->u.rw.seg[seg].last_sect - 
breq->u.rw.seg[seg].first_sect + 1;
         sector_nr += nsects;
     }
 
@@ -1222,8 +1222,8 @@
                        uint16_t uid  = image->memshr_id;
                        blkif_request_t *breq = &vreq->req;
                        uint64_t sec  = tapdisk_vbd_breq_get_sector(breq, treq);
-                       int secs = breq->seg[treq.sidx].last_sect -
-                           breq->seg[treq.sidx].first_sect + 1;
+                       int secs = breq->u.rw.seg[treq.sidx].last_sect -
+                           breq->u.rw.seg[treq.sidx].first_sect + 1;
 
                        if (hnd != 0)
                                memshr_vbd_complete_ro_request(hnd, uid,
@@ -1288,7 +1288,7 @@
                        blkif_request_t *breq = &vreq->req;
         
                        ret = memshr_vbd_issue_ro_request(treq.buf,
-                             breq->seg[seg].gref,
+                             breq->u.rw.seg[seg].gref,
                              parent->memshr_id,
                              treq.sec,
                              treq.secs,
@@ -1366,7 +1366,7 @@
        req       = &vreq->req;
        id        = req->id;
        ring      = &vbd->ring;
-       sector_nr = req->sector_number;
+       sector_nr = req->u.rw.sector_number;
        image     = tapdisk_vbd_first_image(vbd);
 
        vreq->submitting = 1;
@@ -1385,10 +1385,10 @@
                goto fail;
 
        for (i = 0; i < req->nr_segments; i++) {
-               nsects = req->seg[i].last_sect - req->seg[i].first_sect + 1;
+               nsects = req->u.rw.seg[i].last_sect - 
req->u.rw.seg[i].first_sect + 1;
                page   = (char *)MMAP_VADDR(ring->vstart, 
                                           (unsigned long)req->id, i);
-               page  += (req->seg[i].first_sect << SECTOR_SHIFT);
+               page  += (req->u.rw.seg[i].first_sect << SECTOR_SHIFT);
 
                treq.id             = id;
                treq.sidx           = i;
@@ -1482,7 +1482,7 @@
                vreq->status = BLKIF_RSP_OKAY;
                DBG(TLOG_DBG, "retry #%d of req %"PRIu64", "
                    "sec 0x%08"PRIx64", nr_segs: %d\n", vreq->num_retries,
-                   vreq->req.id, vreq->req.sector_number,
+                   vreq->req.id, vreq->req.u.rw.sector_number,
                    vreq->req.nr_segments);
 
                err = tapdisk_vbd_issue_request(vbd, vreq);
diff -r 89116f28083f -r 7015d7407eae xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h     Wed Dec 08 10:46:31 2010 +0000
+++ b/xen/include/public/io/blkif.h     Tue Dec 21 13:28:48 2010 +0000
@@ -98,13 +98,19 @@
     uint8_t     first_sect, last_sect;
 };
 
+struct blkif_request_rw {
+    blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
+    struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
+};
+
 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 seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
+    union {
+       struct blkif_request_rw rw;
+    } u;
 };
 typedef struct blkif_request blkif_request_t;
 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel