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);