|
@@ -122,38 +122,6 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid)
|
|
|
return blkif;
|
|
|
}
|
|
|
|
|
|
-static int map_frontend_page(struct xen_blkif *blkif, unsigned long shared_page)
|
|
|
-{
|
|
|
- struct gnttab_map_grant_ref op;
|
|
|
-
|
|
|
- gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
|
|
|
- GNTMAP_host_map, shared_page, blkif->domid);
|
|
|
-
|
|
|
- if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
|
|
|
- BUG();
|
|
|
-
|
|
|
- if (op.status) {
|
|
|
- DPRINTK("Grant table operation failure !\n");
|
|
|
- return op.status;
|
|
|
- }
|
|
|
-
|
|
|
- blkif->shmem_ref = shared_page;
|
|
|
- blkif->shmem_handle = op.handle;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static void unmap_frontend_page(struct xen_blkif *blkif)
|
|
|
-{
|
|
|
- struct gnttab_unmap_grant_ref op;
|
|
|
-
|
|
|
- gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
|
|
|
- GNTMAP_host_map, blkif->shmem_handle);
|
|
|
-
|
|
|
- if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
|
|
|
- BUG();
|
|
|
-}
|
|
|
-
|
|
|
static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
|
|
|
unsigned int evtchn)
|
|
|
{
|
|
@@ -163,35 +131,29 @@ static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
|
|
|
if (blkif->irq)
|
|
|
return 0;
|
|
|
|
|
|
- blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE);
|
|
|
- if (!blkif->blk_ring_area)
|
|
|
- return -ENOMEM;
|
|
|
-
|
|
|
- err = map_frontend_page(blkif, shared_page);
|
|
|
- if (err) {
|
|
|
- free_vm_area(blkif->blk_ring_area);
|
|
|
+ err = xenbus_map_ring_valloc(blkif->be->dev, shared_page, &blkif->blk_ring);
|
|
|
+ if (err < 0)
|
|
|
return err;
|
|
|
- }
|
|
|
|
|
|
switch (blkif->blk_protocol) {
|
|
|
case BLKIF_PROTOCOL_NATIVE:
|
|
|
{
|
|
|
struct blkif_sring *sring;
|
|
|
- sring = (struct blkif_sring *)blkif->blk_ring_area->addr;
|
|
|
+ sring = (struct blkif_sring *)blkif->blk_ring;
|
|
|
BACK_RING_INIT(&blkif->blk_rings.native, sring, PAGE_SIZE);
|
|
|
break;
|
|
|
}
|
|
|
case BLKIF_PROTOCOL_X86_32:
|
|
|
{
|
|
|
struct blkif_x86_32_sring *sring_x86_32;
|
|
|
- sring_x86_32 = (struct blkif_x86_32_sring *)blkif->blk_ring_area->addr;
|
|
|
+ sring_x86_32 = (struct blkif_x86_32_sring *)blkif->blk_ring;
|
|
|
BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, PAGE_SIZE);
|
|
|
break;
|
|
|
}
|
|
|
case BLKIF_PROTOCOL_X86_64:
|
|
|
{
|
|
|
struct blkif_x86_64_sring *sring_x86_64;
|
|
|
- sring_x86_64 = (struct blkif_x86_64_sring *)blkif->blk_ring_area->addr;
|
|
|
+ sring_x86_64 = (struct blkif_x86_64_sring *)blkif->blk_ring;
|
|
|
BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, PAGE_SIZE);
|
|
|
break;
|
|
|
}
|
|
@@ -203,8 +165,7 @@ static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
|
|
|
xen_blkif_be_int, 0,
|
|
|
"blkif-backend", blkif);
|
|
|
if (err < 0) {
|
|
|
- unmap_frontend_page(blkif);
|
|
|
- free_vm_area(blkif->blk_ring_area);
|
|
|
+ xenbus_unmap_ring_vfree(blkif->be->dev, blkif->blk_ring);
|
|
|
blkif->blk_rings.common.sring = NULL;
|
|
|
return err;
|
|
|
}
|
|
@@ -230,8 +191,7 @@ static void xen_blkif_disconnect(struct xen_blkif *blkif)
|
|
|
}
|
|
|
|
|
|
if (blkif->blk_rings.common.sring) {
|
|
|
- unmap_frontend_page(blkif);
|
|
|
- free_vm_area(blkif->blk_ring_area);
|
|
|
+ xenbus_unmap_ring_vfree(blkif->be->dev, blkif->blk_ring);
|
|
|
blkif->blk_rings.common.sring = NULL;
|
|
|
}
|
|
|
}
|