Mailing List Archive

[PATCH 2/4] block: xen-blkback: use API provided by xenbus module to map rings
From: David Vrabel <david.vrabel@citrix.com>

The xenbus module provides xenbus_map_ring_valloc() and
xenbus_map_ring_vfree(). Use these to map the ring pages granted by
the frontend.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
drivers/block/xen-blkback/common.h | 5 +--
drivers/block/xen-blkback/xenbus.c | 54 ++++-------------------------------
2 files changed, 8 insertions(+), 51 deletions(-)

diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
index 9e40b28..07dd177 100644
--- a/drivers/block/xen-blkback/common.h
+++ b/drivers/block/xen-blkback/common.h
@@ -139,7 +139,7 @@ struct xen_blkif {
/* Comms information. */
enum blkif_protocol blk_protocol;
union blkif_back_rings blk_rings;
- struct vm_struct *blk_ring_area;
+ void *blk_ring;
/* The VBD attached to this interface. */
struct xen_vbd vbd;
/* Back pointer to the backend_info. */
@@ -163,9 +163,6 @@ struct xen_blkif {
int st_wr_sect;

wait_queue_head_t waiting_to_free;
-
- grant_handle_t shmem_handle;
- grant_ref_t shmem_ref;
};


diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index 3f129b4..73703d5 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -120,38 +120,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)
{
@@ -161,35 +129,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;
}
@@ -201,8 +163,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;
}
@@ -228,8 +189,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;
}
}
--
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
[PATCH 2/4] block: xen-blkback: use API provided by xenbus module to map rings [ In reply to ]
From: David Vrabel <david.vrabel@citrix.com>

The xenbus module provides xenbus_map_ring_valloc() and
xenbus_map_ring_vfree(). Use these to map the ring pages granted by
the frontend.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
drivers/block/xen-blkback/common.h | 5 +--
drivers/block/xen-blkback/xenbus.c | 54 ++++-------------------------------
2 files changed, 8 insertions(+), 51 deletions(-)

diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
index 00c57c9..7ec0e88 100644
--- a/drivers/block/xen-blkback/common.h
+++ b/drivers/block/xen-blkback/common.h
@@ -139,7 +139,7 @@ struct xen_blkif {
/* Comms information. */
enum blkif_protocol blk_protocol;
union blkif_back_rings blk_rings;
- struct vm_struct *blk_ring_area;
+ void *blk_ring;
/* The VBD attached to this interface. */
struct xen_vbd vbd;
/* Back pointer to the backend_info. */
@@ -163,9 +163,6 @@ struct xen_blkif {
int st_wr_sect;

wait_queue_head_t waiting_to_free;
-
- grant_handle_t shmem_handle;
- grant_ref_t shmem_ref;
};


diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index 5fd2010..69233dd 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -120,38 +120,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)
{
@@ -161,35 +129,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;
}
@@ -201,8 +163,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;
}
@@ -228,8 +189,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;
}
}
--
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Re: [PATCH 2/4] block: xen-blkback: use API provided by xenbus module to map rings [ In reply to ]
On Thu, Oct 20, 2011 at 11:45:17AM +0100, David Vrabel wrote:
> The xenbus module provides xenbus_map_ring_valloc() and
> xenbus_map_ring_vfree(). Use these to map the ring pages granted by
> the frontend.

Jens,

This patch paves the way for two other patches that are in the akpm's MMU area of expertise.
In other words, the last patch in this series (which should go through akpm's tree
or mine with his Ack) depends on this one.

I can split this patchset in three different pieces - one for you, one for david miller,
and one for akpm. But I was hoping to have it as one nice GIT PULL for Linus -
hence I am wondering if it is OK if I get your Ack and do it through my tree?

Thanks!

>
> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
> ---
> drivers/block/xen-blkback/common.h | 5 +--
> drivers/block/xen-blkback/xenbus.c | 54 ++++-------------------------------
> 2 files changed, 8 insertions(+), 51 deletions(-)
>
> diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
> index 00c57c9..7ec0e88 100644
> --- a/drivers/block/xen-blkback/common.h
> +++ b/drivers/block/xen-blkback/common.h
> @@ -139,7 +139,7 @@ struct xen_blkif {
> /* Comms information. */
> enum blkif_protocol blk_protocol;
> union blkif_back_rings blk_rings;
> - struct vm_struct *blk_ring_area;
> + void *blk_ring;
> /* The VBD attached to this interface. */
> struct xen_vbd vbd;
> /* Back pointer to the backend_info. */
> @@ -163,9 +163,6 @@ struct xen_blkif {
> int st_wr_sect;
>
> wait_queue_head_t waiting_to_free;
> -
> - grant_handle_t shmem_handle;
> - grant_ref_t shmem_ref;
> };
>
>
> diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
> index 5fd2010..69233dd 100644
> --- a/drivers/block/xen-blkback/xenbus.c
> +++ b/drivers/block/xen-blkback/xenbus.c
> @@ -120,38 +120,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)
> {
> @@ -161,35 +129,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;
> }
> @@ -201,8 +163,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;
> }
> @@ -228,8 +189,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;
> }
> }
> --
> 1.7.2.5
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Re: [PATCH 2/4] block: xen-blkback: use API provided by xenbus module to map rings [ In reply to ]
On 2011-10-26 15:47, Konrad Rzeszutek Wilk wrote:
> On Thu, Oct 20, 2011 at 11:45:17AM +0100, David Vrabel wrote:
>> The xenbus module provides xenbus_map_ring_valloc() and
>> xenbus_map_ring_vfree(). Use these to map the ring pages granted by
>> the frontend.
>
> Jens,
>
> This patch paves the way for two other patches that are in the akpm's
> MMU area of expertise. In other words, the last patch in this series
> (which should go through akpm's tree or mine with his Ack) depends on
> this one.
>
> I can split this patchset in three different pieces - one for you, one
> for david miller, and one for akpm. But I was hoping to have it as one
> nice GIT PULL for Linus - hence I am wondering if it is OK if I get
> your Ack and do it through my tree?

Sure, that'd be fine.

--
Jens Axboe


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