[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Problem creating a new device type


  • To: xen-devel@xxxxxxxxxxxxxxxxxxx
  • From: John L Griffin <jlg@xxxxxxxxxx>
  • Date: Sat, 12 Nov 2005 14:53:10 -0500
  • Delivery-date: Sat, 12 Nov 2005 19:53:21 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

Howdy xen folks,

I am having trouble creating a new device type (e.g., vif, vbd, vtpm).  I 
call this new device type "meter".

I'm using an up-to-date xen-unstable tree.  When I start a guest domain 
(with a "meter" domain configuration option), the startup process hangs 
for two minutes and produces a "Error: Device 0 (meter) could not be 
connected. Hotplug scripts not working" message.  The guest domain is then 
stuck in the "paused" state until I kill it.

During this, the xenbus successfully probes the backend, and the correct 
"frontend" and "frontend-id" are available to the backend on the xenbus.

I've included the "xm log" error and a summary of the files I've modified 
below.

My questions are:

1. Have I left out modifying a necessary file when creating a new device 
type?

2. Any ideas as to what could be going on that's preventing my new guest 
domain from starting?

3. Once it's working with dom0 as the backend, will it be possible to 
start my backend in a non-dom0 domain, or is the code not to that point 
yet?

I was able to create this new device on the xen-unstable tree from a month 
ago, but I can't get things going on recent trees.

Thanks for anything!
JLG

------------------------------------------------------------------------

[2005-11-12 14:38:11 xend] DEBUG (DevController:69) Waiting for devices 
meter.
[2005-11-12 14:38:11 xend] DEBUG (DevController:75) Waiting for 0.
[2005-11-12 14:40:11 xend] ERROR (SrvBase:87) Request wait_for_devices 
failed.
Traceback (most recent call last):
  File "/usr/lib/python/xen/web/SrvBase.py", line 85, in perform
    return op_method(op, req)
  File "/usr/lib/python/xen/xend/server/SrvDomain.py", line 68, in 
op_wait_for_devices
    return self.dom.waitForDevices()
  File "/usr/lib/python/xen/xend/XendDomainInfo.py", line 1200, in 
waitForDevices
    self.waitForDevices_(c)
  File "/usr/lib/python/xen/xend/XendDomainInfo.py", line 856, in 
waitForDevices_
    return self.getDeviceController(deviceClass).waitForDevices()
  File "/usr/lib/python/xen/xend/server/DevController.py", line 71, in 
waitForDevices
    return map(self.waitForDevice, self.deviceIDs())
  File "/usr/lib/python/xen/xend/server/DevController.py", line 80, in 
waitForDevice
    raise VmError( ("Device %s (%s) could not be connected. "
VmError: Device 0 (meter) could not be connected. Hotplug scripts not 
working


------------------------------------------------------------------------

I have taken the following steps:

- Edited tools/python/xen/xm/create.py to add a "meter" device to the list 
of options configuration device list:
        config_devs.append(['device', ['meter']])

- Edited tools/python/xen/xend/XendDomainInfo.py to add a new Meterif 
controller class:
        addControllerClass('meter', meterif.MeterifController)

- Added a new file tools/python/xen/xend/server/meterif.py with defaults 
for that new class:
        def getDeviceDetails(self, config):
                """@see DevController.getDeviceDetails"""
                devid = self.allocateDeviceID()
                return (devid, {}, {})

        def configuration(self, devid):
                result = DevController.configuration(self, devid)
                return result

- Added new kernel compilation options for CONFIG_XEN_METERDEV_FRONTEND 
and CONFIG_XEN_METERDEV_BACKEND to the appropriate files in 
linux-2.6-xen-sparse/arch/xen: Kconfig, configs/xen0_defconfig_x86_32, 
configs/xenU_defconfig_x86_32, such that the "meterfront" device is 
compiled into xenU kernels and the "meterback" device is compiled into 
xen0 kernels.

- Added a new file 
linux-2.6-xen-sparse/drivers/xen/meterfront/meterfront.c (along with 
Kconfig and Makefile, following the example in the netfront directory). 
The file is very simple, containing only enough code to register with the 
xenbus, such as:
        static struct xenbus_driver meterfront = {
                .name = "meter",
                .owner = THIS_MODULE,
                .ids = meterfront_ids,
                .probe = meterfront_probe,
                .remove = meterfront_remove,
                .resume = meterfront_resume,
                .suspend = meterfront_suspend,
        };
        static void __init init_meter_xenbus(void)
        {
                xenbus_register_driver(&meterfront);
        }

- Added a new file linux-2.6-xen-sparse/drivers/xen/meterback/meterback.c 
(along with xenbus.c and Makefile, following the example in the netback 
directory), again with simple entries:
        void meterif_xenbus_init(void)
        {
                xenbus_register_backend(&meterback);
        }

- Edited the file linux-2.6-xen-sparse/drivers/xen/Makefile to compile 
meterfront and meterback depending on the kernel compilation options.


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.