Module Name:    src
Committed By:   jym
Date:           Wed Apr 20 20:32:38 UTC 2011

Modified Files:
        src/sys/arch/xen/xen: xennetback_xenbus.c

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


To generate a diff of this commit:
cvs rdiff -u -r1.40 -r1.41 src/sys/arch/xen/xen/xennetback_xenbus.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/xen/xen/xennetback_xenbus.c
diff -u src/sys/arch/xen/xen/xennetback_xenbus.c:1.40 src/sys/arch/xen/xen/xennetback_xenbus.c:1.41
--- src/sys/arch/xen/xen/xennetback_xenbus.c:1.40	Wed Apr  6 23:51:55 2011
+++ src/sys/arch/xen/xen/xennetback_xenbus.c	Wed Apr 20 20:32:38 2011
@@ -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);

Reply via email to