
Daniel P. Berrange wrote:
On Wed, Oct 28, 2009 at 12:16:40PM +0100, Chris Lalancette wrote:
Dave Allan wrote:
Attached is a fully functional version of the node device udev based backend, incorporating all the feedback from earlier revisions. I broke the new capability fields out into a separate patch per Dan's suggestion, and I have also included a patch removing the DevKit backend.
3) I took a look at how the network is represented in the XML. In the HAL backend, we get something that looks like:
<device> <name>net_00_13_20_f5_fa_e3</name> <parent>pci_8086_10bd</parent> <capability type='net'> <interface>eth0</interface> <address>00:13:20:f5:fa:e3</address> <capability type='80203'/> </capability> </device>
That "<capability type='80203'/>" looks to be bogus (although I could be wrong; that same XML is encoded into the tests, so maybe there is something else going on). You are already in a <capability> block, so that should probably just be "<type='80203'/>". The same problem occurs in the udev backend.
Why do you think the '<capability type='80203'/>' bit is bogus ? That looks correct to me, showing that eth0 is a ethernet device (as opposed to a 80211 wireless, or neither)
4) I also took a look at the output for one of the bridges. In my HAL backend, I see:
<device> <name>net_00_13_20_f5_fa_e3_0</name> <parent>computer</parent> <capability type='net'> <interface>ovirtbr0</interface> <address>00:13:20:f5:fa:e3</address> </capability> </device>
However, in the udev backend I am missing the parent link (in point of fact, the parent link is missing for quite a few elements), and I also have an additional "<capability type='80203'/>" element:
<device> <name>/sys/devices/virtual/net/ovirtbr0</name> <capability type='net'> <interface>ovirtbr0</interface> <address>00:13:20:f5:fa:e3</address> <capability type='80203'/> </capability> </device>
I'm not sure if either of those is a problem.
The missing parent link is a problem - if all else fails, it should at least point back to the top level 'computer' device. In this case you are correct that <capability type='80203'/> is bogus, since this is a bridge device, not an physical ethernet device.
Udev has an odd characteristic which is that it often sets the parent name to a string that is not the name of a device that it recognizes, i.e., you have a parent name, but looking it up returns nothing. I have been setting the parent pointer to the string provided by udev, and then setting the parent string to computer when I do things like dump the tree if the parent device doesn't actually exist. As I think about it, and the related device naming point that you raise below, the more I think parent should be a libvirt concept, set as you describe: if the parent device is NULL or is not a device known to libvirt, set the parent to computer. I'll create a separate attribute for the udev parent string.
5) We are still missing the mapping of product/vendor id --> names. This shows up for instance in the parent of the eth0 device, where the HAL backend shows:
<product id='0x10bd'>82566DM-2 Gigabit Network Connection</product>
and the udev backend shows nothing. Probably not a show-stopper, but a nice-to-have for human readers.
Yeah, we shouldn't hold this up just for missing human names - unique IDs are the important thing. Even HAL could miss the names if the PCI IDs database was not up2date.
Agreed. I looked at the ids file and didn't relish the idea of parsing it myself, and the vendor names are not available through udev. Is libpciaccess a viable option? It has functions that will do what we want, but I haven't worked with it, so I don't know if it is suitable for use in libvirt.
6) SCSI device 1:0:0:0 (pci_8086_2920_scsi_host_0_scsi_device_lun0 in the HAL backend, /sys/devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0 in the udev backend) shows up with "<type>cdrom</type>" in HAL, but not in udev.
The type=cdrom thing is a nice to have but not a show stopper. If we commit without it, then just open a BZ so we remember to fix it some time.
Hmm. I'll look into that.
computer net_00_13_20_f5_fa_e3 net_00_13_20_f5_fa_e3_0 net_1e_85_27_2d_a9_b0 net_computer_loopback pci_8086_10bd pci_8086_244e pci_8086_2910 pci_8086_2920 pci_8086_2920_scsi_host pci_8086_2920_scsi_host_0 pci_8086_2920_scsi_host_0_scsi_device_lun0 pci_8086_2920_scsi_host_0_scsi_host pci_8086_2920_scsi_host_scsi_device_lun0 pci_8086_2920_scsi_host_scsi_host pci_8086_2926 pci_8086_2926_scsi_host pci_8086_2926_scsi_host_0 pci_8086_2930 pci_8086_2934 pci_8086_2935 pci_8086_2936 pci_8086_2937 pci_8086_2938 pci_8086_2939 pci_8086_293a pci_8086_293c pci_8086_293e pci_8086_29c0 pci_8086_29c2 pci_8086_29c4 pci_8086_29c6 pci_8086_29c7 platform_floppy_0_storage_platform_floppy storage_model_DVDRW_LH_20A1S storage_serial_SATA_ST3320620AS_9QF5E3AP usb_device_1d6b_1_0000_00_1a_0 usb_device_1d6b_1_0000_00_1a_0_if0 usb_device_1d6b_1_0000_00_1a_1 usb_device_1d6b_1_0000_00_1a_1_if0 usb_device_1d6b_1_0000_00_1a_2 usb_device_1d6b_1_0000_00_1a_2_if0 usb_device_1d6b_1_0000_00_1d_0 usb_device_1d6b_1_0000_00_1d_0_if0 usb_device_1d6b_1_0000_00_1d_1 usb_device_1d6b_1_0000_00_1d_1_if0 usb_device_1d6b_1_0000_00_1d_2 usb_device_1d6b_1_0000_00_1d_2_if0 usb_device_1d6b_2_0000_00_1a_7 usb_device_1d6b_2_0000_00_1a_7_if0 usb_device_1d6b_2_0000_00_1d_7 usb_device_1d6b_2_0000_00_1d_7_if0
[snip]
/sys/devices/pci0000:00/0000:00:00.0 /sys/devices/pci0000:00/0000:00:02.0 /sys/devices/pci0000:00/0000:00:03.0 /sys/devices/pci0000:00/0000:00:03.2 /sys/devices/pci0000:00/0000:00:03.3 /sys/devices/pci0000:00/0000:00:19.0 /sys/devices/pci0000:00/0000:00:19.0/net/eth0 /sys/devices/pci0000:00/0000:00:1a.0/usb3 /sys/devices/pci0000:00/0000:00:1a.0/usb3/3-0:1.0 /sys/devices/pci0000:00/0000:00:1a.1/usb4 /sys/devices/pci0000:00/0000:00:1a.1/usb4/4-0:1.0 /sys/devices/pci0000:00/0000:00:1a.2/usb5 /sys/devices/pci0000:00/0000:00:1a.2/usb5/5-0:1.0 /sys/devices/pci0000:00/0000:00:1a.7/usb1 /sys/devices/pci0000:00/0000:00:1a.7/usb1/1-0:1.0 /sys/devices/pci0000:00/0000:00:1b.0 /sys/devices/pci0000:00/0000:00:1d.0/usb6 /sys/devices/pci0000:00/0000:00:1d.0/usb6/6-0:1.0 /sys/devices/pci0000:00/0000:00:1d.1/usb7 /sys/devices/pci0000:00/0000:00:1d.1/usb7/7-0:1.0 /sys/devices/pci0000:00/0000:00:1d.2/usb8 /sys/devices/pci0000:00/0000:00:1d.2/usb8/8-0:1.0 /sys/devices/pci0000:00/0000:00:1d.7/usb2 /sys/devices/pci0000:00/0000:00:1d.7/usb2/2-0:1.0 /sys/devices/pci0000:00/0000:00:1e.0 /sys/devices/pci0000:00/0000:00:1f.0 /sys/devices/pci0000:00/0000:00:1f.2/host0 /sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0 /sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda /sys/devices/pci0000:00/0000:00:1f.2/host1 /sys/devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0 /sys/devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/sr0 /sys/devices/pci0000:00/0000:00:1f.5 /sys/devices/pci0000:00/0000:00:1f.5/host2 /sys/devices/pci0000:00/0000:00:1f.5/host3 /sys/devices/virtual/net/lo /sys/devices/virtual/net/ovirtbr0 /sys/devices/virtual/net/virbr0 computer
I don't like that we're using the sysfs paths for the name here. I'd like to see non-path based names for devices. Either by following the HAL naming, or defining our own naming scheme.
Mostly because if we use paths, then people will come to expect that this field is a path and if we then change it to not be a path apps will get confused/broken. If we did want to include a sysfs path or equivalent, then we ought to have an explicit named XML element for that.
That's a fair point. I don't like the paths-as-names, either; it's the udev default, which is why I used it. As much as HAL *should* be relatively static at this point, it's not guaranteed to be, so I think trying to follow its naming convention will be a maintenance problem. Defining our own naming scheme is a little work, definitely less work than trying to figure out HAL's convention, and not tricky. I'll do so & add an element for the sysfs path. Dave