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>
