Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/xen/xen Unmap rings before freeing their associated...



details:   https://anonhg.NetBSD.org/src/rev/a4b9f2a611d0
branches:  trunk
changeset: 764417:a4b9f2a611d0
user:      jym <jym%NetBSD.org@localhost>
date:      Wed Apr 20 20:32:38 2011 +0000

description:
Unmap rings before freeing their associated VAs, or we will get a
non-recoverable fault in the error path.

diffstat:

 sys/arch/xen/xen/xennetback_xenbus.c |  25 +++++++++++++++++++++++--
 1 files changed, 23 insertions(+), 2 deletions(-)

diffs (53 lines):

diff -r f3263fb59baa -r a4b9f2a611d0 sys/arch/xen/xen/xennetback_xenbus.c
--- a/sys/arch/xen/xen/xennetback_xenbus.c      Wed Apr 20 20:15:03 2011 +0000
+++ b/sys/arch/xen/xen/xennetback_xenbus.c      Wed Apr 20 20:32:38 2011 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: xennetback_xenbus.c,v 1.40 2011/04/06 23:51:55 jym Exp $      */
+/*      $NetBSD: xennetback_xenbus.c,v 1.41 2011/04/20 20:32:38 jym Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -433,6 +433,7 @@
        netif_tx_sring_t *tx_ring;
        netif_rx_sring_t *rx_ring;
        struct gnttab_map_grant_ref op;
+       struct gnttab_unmap_grant_ref uop;
        evtchn_op_t evop;
        u_long tx_ring_ref, rx_ring_ref;
        u_long revtchn, rx_copy;
@@ -538,7 +539,7 @@
                if (err) {
                        printf("%s: can't get event channel: %d\n",
                            xneti->xni_if.if_xname, err);
-                       goto err2;
+                       goto err3;
                }
                xneti->xni_evtchn = evop.u.bind_interdomain.local_port;
                xen_wmb();
@@ -570,6 +571,26 @@
                break;
        }
        return;
+
+err3:
+       uop.dev_bus_addr = 0;
+
+       uop.host_addr = xneti->xni_rx_ring_va;
+       uop.handle = xneti->xni_rx_ring_handle;
+       err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
+           &uop, 1);
+       if (err)
+               aprint_error_ifnet(&xneti->xni_if,
+                       "unmap_grant_ref failed: %d\n", err);
+
+       uop.host_addr = xneti->xni_tx_ring_va;
+       uop.handle = xneti->xni_tx_ring_handle;
+       err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
+           &uop, 1);
+       if (err)
+               aprint_error_ifnet(&xneti->xni_if,
+                       "unmap_grant_ref failed: %d\n", err);
+
 err2:
        uvm_km_free(kernel_map, xneti->xni_rx_ring_va,
            PAGE_SIZE, UVM_KMF_VAONLY);



Home | Main Index | Thread Index | Old Index