Module Name: src
Committed By: bouyer
Date: Sun Oct 20 11:37:11 UTC 2013
Modified Files:
src/sys/arch/xen/xen: xbdback_xenbus.c
Log Message:
Add more XENPRINTF() to xbdback_connect()
in xbdback_backend_changed(), fix memory leak.
Do not free an uninitialized pointer in xbdback_connect(). Should fix
hypervisor or dom0 reboot when using windows PV drivers, as reported
by several users on port-xen.
To generate a diff of this commit:
cvs rdiff -u -r1.57 -r1.58 src/sys/arch/xen/xen/xbdback_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/xbdback_xenbus.c
diff -u src/sys/arch/xen/xen/xbdback_xenbus.c:1.57 src/sys/arch/xen/xen/xbdback_xenbus.c:1.58
--- src/sys/arch/xen/xen/xbdback_xenbus.c:1.57 Mon Jul 23 01:31:01 2012
+++ src/sys/arch/xen/xen/xbdback_xenbus.c Sun Oct 20 11:37:11 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: xbdback_xenbus.c,v 1.57 2012/07/23 01:31:01 jym Exp $ */
+/* $NetBSD: xbdback_xenbus.c,v 1.58 2013/10/20 11:37:11 bouyer Exp $ */
/*
* Copyright (c) 2006 Manuel Bouyer.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.57 2012/07/23 01:31:01 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.58 2013/10/20 11:37:11 bouyer Exp $");
#include <sys/atomic.h>
#include <sys/buf.h>
@@ -530,6 +530,7 @@ xbdback_connect(struct xbdback_instance
const char *proto;
struct xenbus_device *xbusd = xbdi->xbdi_xbusd;
+ XENPRINTF(("xbdback %s: connect\n", xbusd->xbusd_path));
/* read comunication informations */
err = xenbus_read_ul(NULL, xbusd->xbusd_otherend,
"ring-ref", &ring_ref, 10);
@@ -538,6 +539,7 @@ xbdback_connect(struct xbdback_instance
xbusd->xbusd_otherend);
return -1;
}
+ XENPRINTF(("xbdback %s: connect ring-ref %lu\n", xbusd->xbusd_path, ring_ref));
err = xenbus_read_ul(NULL, xbusd->xbusd_otherend,
"event-channel", &revtchn, 10);
if (err) {
@@ -545,12 +547,15 @@ xbdback_connect(struct xbdback_instance
xbusd->xbusd_otherend);
return -1;
}
+ XENPRINTF(("xbdback %s: connect revtchn %lu\n", xbusd->xbusd_path, revtchn));
err = xenbus_read(NULL, xbusd->xbusd_otherend, "protocol",
&len, &xsproto);
if (err) {
xbdi->xbdi_proto = XBDIP_NATIVE;
proto = "unspecified";
+ XENPRINTF(("xbdback %s: connect no xsproto\n", xbusd->xbusd_path));
} else {
+ XENPRINTF(("xbdback %s: connect xsproto %s\n", xbusd->xbusd_path, xsproto));
if (strcmp(xsproto, XEN_IO_PROTO_ABI_NATIVE) == 0) {
xbdi->xbdi_proto = XBDIP_NATIVE;
proto = XEN_IO_PROTO_ABI_NATIVE;
@@ -566,8 +571,8 @@ xbdback_connect(struct xbdback_instance
free(xsproto, M_DEVBUF);
return -1;
}
+ free(xsproto, M_DEVBUF);
}
- free(xsproto, M_DEVBUF);
/* allocate VA space and map rings */
xbdi->xbdi_ring_va = uvm_km_alloc(kernel_map, PAGE_SIZE, 0,
@@ -577,6 +582,7 @@ xbdback_connect(struct xbdback_instance
"can't get VA for ring", xbusd->xbusd_otherend);
return -1;
}
+ XENPRINTF(("xbdback %s: connect va 0x%" PRIxVADDR "\n", xbusd->xbusd_path, xbdi->xbdi_ring_va));
grop.host_addr = xbdi->xbdi_ring_va;
grop.flags = GNTMAP_host_map;
@@ -592,6 +598,7 @@ xbdback_connect(struct xbdback_instance
goto err;
}
xbdi->xbdi_ring_handle = grop.handle;
+ XENPRINTF(("xbdback %s: connect grhandle %d\n", xbusd->xbusd_path, grop.handle));
switch(xbdi->xbdi_proto) {
case XBDIP_NATIVE:
@@ -626,6 +633,7 @@ xbdback_connect(struct xbdback_instance
"can't bind event channel", xbusd->xbusd_otherend);
goto err2;
}
+ XENPRINTF(("xbdback %s: connect evchannel %d\n", xbusd->xbusd_path, xbdi->xbdi_evtchn));
xbdi->xbdi_evtchn = evop.u.bind_interdomain.local_port;
event_set_handler(xbdi->xbdi_evtchn, xbdback_evthandler,
@@ -765,6 +773,7 @@ xbdback_backend_changed(struct xenbus_wa
xbdi->xbdi_ro = false;
else
xbdi->xbdi_ro = true;
+ free(mode, M_DEVBUF);
major = major(xbdi->xbdi_dev);
devname = devsw_blk2name(major);
if (devname == NULL) {