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