Subject: Re: kern/37370: xen dom0 kernel does not support guest domU's on
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org,>
From: Ronald Roskens <ronr@econet.com>
List: netbsd-bugs
Date: 11/12/2007 20:30:02
The following reply was made to PR kern/37370; it has been noted by GNATS.
From: Ronald Roskens <ronr@econet.com>
To: gnats-bugs@NetBSD.org
Cc:
Subject: Re: kern/37370: xen dom0 kernel does not support guest domU's on
dk wedges
Date: Mon, 12 Nov 2007 13:25:09 -0600
This is a multi-part message in MIME format.
--------------070806060508000406070000
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
ronr@econet.com wrote:
>> Number: 37370
>> Category: kern
>> Synopsis: xen dom0 kernel does not support guest domU's on dk wedges
>> Confidential: no
>> Severity: non-critical
>> Priority: low
>> Responsible: kern-bug-people
>> State: open
>> Class: sw-bug
>> Submitter-Id: net
>> Arrival-Date: Mon Nov 12 17:35:00 +0000 2007
>> Originator: Ronald Roskens
>> Release: NetBSD 4.0RC4
>> Organization:
>> Environment:
> NetBSD xendom0 4.0_RC4 NetBSD 4.0_RC4 (LOCAL_XEN3_DOM0) #0: Fri Nov 9 21:39:02 CST 2007 root@xendom0:/usr/src/sys/arch/i386/compile/LOCAL_XEN3_DOM0 i386
>> Description:
> After enabling dkwedges (adding drvctl, and the assorted DKWEDGE_* to the kernel config file), bootup into a XEN DOM0 environment using the /dev/dk* devices. Attempt to create a new domU, but watch it hang while probing disks. In dom0's dmesg:
>
> xbdback backend/vbd/7/3: can't ioctl device 0xa805: 25
> xvif7.0: Ethernet address aa:00:00:01:00:02
> xbd backend: attach device vnd0d (size 495020) for domain 7
> xbd backend 0x3 for domain 7 using event channel 28
> xbd backend 0x603 for domain 7 using event channel 29
>
> The xen dom0 device xbdback is attempting to do a DIOCGPART ioctl on the dkwedge device and is failing.
>
> ==== xen config ====
> #kernel = "/netbsd-XEN3_DOMU"
> kernel = "/netbsd-INSTALL_XEN3_DOMU"
>
> memory = 64
> name = "nbsd"
> vif = [ 'mac=aa:00:00:00:00:02, bridge=bridge1' ]
> disk = [ 'phy:/dev/dk5,wd0d,w', 'file:/d/xen/ISOs/netbsd-4-0-rc4-i386cd.iso,cd0d
> ,r' ]
>
> root = "/dev/wd0d"
> ==== end xen config ====
>
>
>> How-To-Repeat:
> 1) Create a new XEN3_DOM0 kernel adding:
>
> pseudo-device drvctl
> options DKWEDGE_AUTODISCOVER
> options DKWEDGE_METHOD_BSDLABEL
> options DKWEDGE_METHOD_GPT
> options DKWEDGE_METHOD_MBR
>
> 2) Boot into new XEN3_DOM0 kernel, and setup a raw/phy partition for dom0
>
> disklabel -e wd0
> ** add slice i
> dkctl wd0 addwedge wd0i 64645056 21564144 unknown
>
> 3) Start up guest domU, and it hangs while probing devices. You have to hit ESC and run 'xm destroy <domu>' to kill the guest domU.
>
>
>> Fix:
>
The attached patch lets me use a dk<num> wedge as a physical device for
a xen instance. Note: this patch is against a 4.0RC4 source tree, though
it doesnt look like the function being patched has changed since rev 1.3.
xbd backend: attach device dk5 (size 2114784) for domain 1
xvif1.0: Ethernet address aa:00:00:01:00:02
xbd backend 0x3 for domain 1 using event channel 16
Only real annoyance at this point is that dkwedge does not automatically
create dk<num> instances for all disk partitions. I had to set the
filesystem type in the disklabel to 4.2BSD to have it autoconfigured at
bootup.
--------------070806060508000406070000
Content-Type: text/plain;
name="xbdback_xenbus.c.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="xbdback_xenbus.c.patch"
Index: sys/arch/xen/xen/xbdback_xenbus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/xen/xen/xbdback_xenbus.c,v
retrieving revision 1.3
diff -b -u -r1.3 xbdback_xenbus.c
--- sys/arch/xen/xen/xbdback_xenbus.c 14 Nov 2006 22:14:56 -0000 1.3
+++ sys/arch/xen/xen/xbdback_xenbus.c 12 Nov 2007 19:07:05 -0000
@@ -548,6 +548,7 @@
const char *devname;
int major;
struct partinfo dpart;
+ struct dkwedge_info dkw;
err = xenbus_read_ul(NULL, xbusd->xbusd_path, "physical-device",
&dev, 10);
@@ -609,18 +610,29 @@
}
VOP_UNLOCK(xbdi->xbdi_vp, 0);
err = VOP_IOCTL(xbdi->xbdi_vp, DIOCGPART, &dpart, FREAD, 0, NULL);
- if (err) {
+ if (err == 0) {
+ xbdi->xbdi_size = dpart.part->p_size;
+ printf("xbd backend: attach device %s%d%c (size %d) "
+ "for domain %d\n", devname, DISKUNIT(xbdi->xbdi_dev),
+ DISKPART(xbdi->xbdi_dev) + 'a', xbdi->xbdi_size, xbdi->xbdi_domid);
+ goto again;
+ }
+
+ err = VOP_IOCTL(xbdi->xbdi_vp, DIOCGWEDGEINFO, &dkw, FREAD, 0, NULL);
+ if (err == 0) {
+ xbdi->xbdi_size = dkw.dkw_size;
+ printf("xbd backend: attach device %s%d (size %d) "
+ "for domain %d\n", devname, DISKPART(xbdi->xbdi_dev),
+ xbdi->xbdi_size, xbdi->xbdi_domid);
+ goto again;
+ }
+
printf("xbdback %s: can't ioctl device 0x%x: %d\n",
xbusd->xbusd_path, xbdi->xbdi_dev, err);
xbdi->xbdi_size = xbdi->xbdi_dev = 0;
vn_close(xbdi->xbdi_vp, FREAD, NOCRED, NULL);
xbdi->xbdi_vp = NULL;
return;
- }
- xbdi->xbdi_size = dpart.part->p_size;
- printf("xbd backend: attach device %s%d%c (size %d) "
- "for domain %d\n", devname, DISKUNIT(xbdi->xbdi_dev),
- DISKPART(xbdi->xbdi_dev) + 'a', xbdi->xbdi_size, xbdi->xbdi_domid);
again:
xbt = xenbus_transaction_start();
--------------070806060508000406070000--