Date: Thu, 28 Feb 2013 18:00:01 GMT From: =?ISO-8859-1?Q?Roger_Pau_Monn=E9?= <roger.pau@citrix.com> To: freebsd-xen@FreeBSD.org Subject: Re: kern/176471: [xen] xn driver crash on detach Message-ID: <201302281800.r1SI01Vo021280@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/176471; it has been noted by GNATS. From: =?ISO-8859-1?Q?Roger_Pau_Monn=E9?= <roger.pau@citrix.com> To: <bug-followup@FreeBSD.org>, <pete@helenius.fi> Cc: Subject: Re: kern/176471: [xen] xn driver crash on detach Date: Thu, 28 Feb 2013 18:58:44 +0100 Hi (again), I've just realized the previous patch also crashed when trying to detach an interface that's up and running, the following patch allows to detach the interface while running without crashing the FreeBSD kernel. Also, what do you mean by "changing configuration of xn network"? --- From 9c0097ed4775c68769049c61e474ddb62cc11d1f Mon Sep 17 00:00:00 2001 From: Roger Pau Monne <roger.pau@citrix.com> Date: Thu, 28 Feb 2013 17:43:34 +0100 Subject: [PATCH] xen-netfront: fix detach of network interfaces Remove all the media and the interface when detaching it. Prevents the following panic when detaching an interface (xl network-detach freebsd 1) xn1: detached Fatal trap 12: page fault while in kernel mode cpuid = 3; apic id = 06 fault virtual address = 0xffffff80028ff2a0 fault code = supervisor read data, page not present instruction pointer = 0x20:0xffffffff809653af stack pointer = 0x28:0xffffff8117cb4940 frame pointer = 0x28:0xffffff8117cb4980 code segment = base 0x0, limit 0xfffff, type 0x1b = DPL 0, pres 1, long 1, def32 0, gran 1 processor eflags = interrupt enabled, resume, IOPL = 0 current process = 699 (devd) [ thread pid 699 tid 100107 ] Stopped at ifmedia_ioctl+0x3f: movq 0x8(%r12),%rcx db> trace Tracing pid 706 tid 100059 td 0xfffffe0006b69480 ifmedia_ioctl() at ifmedia_ioctl+0x3f/frame 0xffffff80f774c980 ifioctl() at ifioctl+0xeb7/frame 0xffffff80f774ca40 kern_ioctl() at kern_ioctl+0x1ce/frame 0xffffff80f774ca90 sys_ioctl() at sys_ioctl+0x11f/frame 0xffffff80f774cae0 amd64_syscall() at amd64_syscall+0x265/frame 0xffffff80f774cbf0 Xfast_syscall() at Xfast_syscall+0xfb/frame 0xffffff80f774cbf0 --- syscall (54, FreeBSD ELF64, sys_ioctl), rip = 0x44c60a, rsp = 0x7fffffffd678, rbp = 0x7fffffffd750 --- PR: 176471 --- sys/dev/xen/netfront/netfront.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/sys/dev/xen/netfront/netfront.c b/sys/dev/xen/netfront/netfront.c index 88641e3..3a8b8ea 100644 --- a/sys/dev/xen/netfront/netfront.c +++ b/sys/dev/xen/netfront/netfront.c @@ -2171,7 +2171,14 @@ netfront_detach(device_t dev) static void netif_free(struct netfront_info *info) { + XN_LOCK(info); + xn_stop(info); + XN_UNLOCK(info); + callout_drain(&info->xn_stat_ch); netif_disconnect_backend(info); + ifmedia_removeall(&info->sc_media); + ether_ifdetach(info->xn_ifp); + if_free(info->xn_ifp); #if 0 close_netdev(info); #endif -- 1.7.7.5 (Apple Git-26)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201302281800.r1SI01Vo021280>