[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for comms



For proper grant mappings, HVM guests require pages allocated using
alloc_xenballooned_pages instead of alloc_vm_area.

Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
---
 drivers/net/xen-netback/common.h  |    4 ++--
 drivers/net/xen-netback/netback.c |   34 ++++++++++++++++++++--------------
 2 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
index 161f207..d5ee9d1 100644
--- a/drivers/net/xen-netback/common.h
+++ b/drivers/net/xen-netback/common.h
@@ -70,8 +70,8 @@ struct xenvif {
        /* The shared rings and indexes. */
        struct xen_netif_tx_back_ring tx;
        struct xen_netif_rx_back_ring rx;
-       struct vm_struct *tx_comms_area;
-       struct vm_struct *rx_comms_area;
+       struct page *tx_comms_page;
+       struct page *rx_comms_page;
 
        /* Frontend feature information. */
        u8 can_sg:1;
diff --git a/drivers/net/xen-netback/netback.c 
b/drivers/net/xen-netback/netback.c
index fd00f25..f35e07c 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -42,6 +42,7 @@
 
 #include <xen/events.h>
 #include <xen/interface/memory.h>
+#include <xen/balloon.h>
 
 #include <asm/xen/hypercall.h>
 #include <asm/xen/page.h>
@@ -1578,9 +1579,11 @@ static int xen_netbk_kthread(void *data)
 void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
 {
        struct gnttab_unmap_grant_ref op;
+       void *addr;
 
        if (vif->tx.sring) {
-               gnttab_set_unmap_op(&op, (unsigned 
long)vif->tx_comms_area->addr,
+               addr = pfn_to_kaddr(page_to_pfn(vif->tx_comms_page));
+               gnttab_set_unmap_op(&op, (unsigned long)addr,
                                    GNTMAP_host_map, vif->tx_shmem_handle);
 
                if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
@@ -1588,16 +1591,17 @@ void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
        }
 
        if (vif->rx.sring) {
-               gnttab_set_unmap_op(&op, (unsigned 
long)vif->rx_comms_area->addr,
+               addr = pfn_to_kaddr(page_to_pfn(vif->rx_comms_page));
+               gnttab_set_unmap_op(&op, (unsigned long)addr,
                                    GNTMAP_host_map, vif->rx_shmem_handle);
 
                if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
                        BUG();
        }
-       if (vif->rx_comms_area)
-               free_vm_area(vif->rx_comms_area);
-       if (vif->tx_comms_area)
-               free_vm_area(vif->tx_comms_area);
+       if (vif->rx_comms_page)
+               free_xenballooned_pages(1, &vif->rx_comms_page);
+       if (vif->tx_comms_page)
+               free_xenballooned_pages(1, &vif->tx_comms_page);
 }
 
 int xen_netbk_map_frontend_rings(struct xenvif *vif,
@@ -1610,15 +1614,19 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
 
        int err = -ENOMEM;
 
-       vif->tx_comms_area = alloc_vm_area(PAGE_SIZE);
-       if (vif->tx_comms_area == NULL)
+       if (alloc_xenballooned_pages(1, &vif->tx_comms_page))
                goto err;
 
-       vif->rx_comms_area = alloc_vm_area(PAGE_SIZE);
-       if (vif->rx_comms_area == NULL)
+       txs = (struct xen_netif_tx_sring *)pfn_to_kaddr(page_to_pfn(
+                       vif->tx_comms_page));
+
+       if (alloc_xenballooned_pages(1, &vif->rx_comms_page))
                goto err;
 
-       gnttab_set_map_op(&op, (unsigned long)vif->tx_comms_area->addr,
+       rxs = (struct xen_netif_rx_sring *)pfn_to_kaddr(page_to_pfn(
+                       vif->rx_comms_page));
+
+       gnttab_set_map_op(&op, (unsigned long)txs,
                          GNTMAP_host_map, tx_ring_ref, vif->domid);
 
        if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
@@ -1635,10 +1643,9 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
        vif->tx_shmem_ref    = tx_ring_ref;
        vif->tx_shmem_handle = op.handle;
 
-       txs = (struct xen_netif_tx_sring *)vif->tx_comms_area->addr;
        BACK_RING_INIT(&vif->tx, txs, PAGE_SIZE);
 
-       gnttab_set_map_op(&op, (unsigned long)vif->rx_comms_area->addr,
+       gnttab_set_map_op(&op, (unsigned long)rxs,
                          GNTMAP_host_map, rx_ring_ref, vif->domid);
 
        if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
@@ -1656,7 +1663,6 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
        vif->rx_shmem_handle  = op.handle;
        vif->rx_req_cons_peek = 0;
 
-       rxs = (struct xen_netif_rx_sring *)vif->rx_comms_area->addr;
        BACK_RING_INIT(&vif->rx, rxs, PAGE_SIZE);
 
        return 0;
-- 
1.7.6.4


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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.