Hi,
This patch series adds the paravirtualized USB (PVUSB) support that I
gave a presentation on the last Xen Summit at Oracle.
http://www.xen.org/files/xensummit_oracle09/PVUSB.pdf
After the last summit, I finished the device disconnection functions
and removed the critical issues.
The following patches can be applied to the linux-2.6.18-xen.hg tree.
The PVUSB has no xend support yet, but I prepared the simple
shell-script for setting up and initializing the XenStore entries.
Please read attached README.txt and use init_xs.sh.
Thanks,
Noboru
Signed-off-by: Noboru Iwamatsu <n_iwamatsu@xxxxxxxxxxxxxx>
Paravirtualized USB trivial Document
Noboru Iwamatsu <n_iwamatsu@xxxxxxxxxxxxxx>
16th Mar. 2009
Kernel config options
========================
1) First, you need to make USB work correctly.
Enable USB support and choose the proper HCD.
You can select ether [*] built-in or <M> module.
MAIN MENU -> Device Drivers -> USB support ->
<M> Support for Host-side USB
--- USB Host Controller Drivers
<M> EHCI HCD (USB 2.0) support
<M> OHCI HCD support
<M> UHCI HCD (most Intel and VIA) support
After selecting the above options, then select drivers
for the USB peripherals you'll be using.
You need not select the USB peripherals drivers for
the backend, moreover, you should not select the USB
peripherals drivers as [*] built-in in the backend.
Built-in USB peripherals drivers always have a priority
to claim the attached device, so that device cannot be
assigned to the guest domain.
2) Options for the backend (domain 0)
MAIN MENU -> XEN ->
[*] Privileged Guest (domain 0)
<M> Backend driver support
<M> USB backend driver
3) Options for the frontend (guest domain)
MAIN MENU -> XEN ->
<M> USB frontend driver
[*] Taking the HCD statistics (for debug)
Modules
========
usbback:
/lib/modules/<`uname -r`>/kernel/drivers/xen/usbback/usbbk.ko
usbfront:
/lib/modules/<`uname -r`>/kernel/drivers/xen/usbfront/xen-hcd.ko
How to use
============
Current PVUSB has no xend support :-)
So, you have to manually setup the xenstore entries and the hotplug rule.
Setup:
- loading the modules.
# modprobe usbbk (in the backend)
# modprobe xen-hcd (in the frontend)
- Setup and initialize the XenStore
Example.
# ./init_xs.sh 1 0 (for the domid 1)
Hotplug:
1) First, you have to start from the state that no device is connected.
And, if any usb device driver other than "usbbk.ko" are loaded in
the backend, you should remove the modules.
(e.g.
If usb-storage or usbhid is loaded, you should do the following.
# rmmod usb-storage
# rmmod usbhid
)
2) Write the hotplug-rule through the sysfs interface of the backenend driver.
- The hotplug-rule format
<usbbusname>:<domid>:<vusb number>:<port number>
"usbbusname" is the combination of the USB Bus number and the port number.
It's a quite complex thing, but when the new device connected, you can see
this number in the kernel messages.
Example of usbbusname:
# dmesg
...
usb 4-1: new low speed USB device using uhci_hcd and address 2
usb 4-1: configuration #1 chosen from 1 choice
^^^^^
(this means USB Bus number #4 and root port number #1)
...
- Setting the hotplug-rule
/sys/bus/usb/drivers/usbback/new_vport is the sysfs path for
setting the hotplug-rules.
Example:
# echo 1-2.3:1:0:3 > /sys/bus/usb/drivers/usbback/new_vport
# echo 1-4:2:0:1 > /sys/bus/usb/drivers/usbback/new_vport
# echo 4-1:2:0:2 > /sys/bus/usb/drivers/usbback/new_vport
- Show the current hotplug-rules
/sys/bus/usb/drivers/usbback/vports shows you current hotplug-rules.
Example:
# cat /sys/bus/usb/drivers/usbback/vports
1-2.3:1:0:3
1-4:2:0:1
4-1:2:0:2
- Remove hotplug-rule
/sys/bus/usb/drivers/usbback/remove_vport is the sysfs path for
removing the hotplug-rules.
Example:
# echo 1-4:2:0:1 > /sys/bus/usb/drivers/usbback/remove_vport
3) Plug the device.
Plug the USB device to the appropriate port that wrote in the
hotplug-rule.
If the device is successfuly claimed by the backend driver, you
can see the claimed USB interfaces through the sysfs.
Example:
# cat /sys/bus/usb/drivers/usbback/grabbed_devices
1-4:1.0
If the backend driver failed to claim the device, and other driver
got the device, there is a pssibility that udev got in the way of
the backend driver's probing.
In order to avoid the execution of events from udevd, you should
temporarily stop the udevd while plugging the device.
Example:
# udevcontrol stop_exec_queue (stop)
...
plug the device
...
# udevcontrol start_exec_queue (restart)
Known issues
==============
- Webcams not works, other Isoc devices not tested.
Tested environment
======================
Fujitsu CELSIUS Workstation N450:
CPU: Intel(R) Core 2 Duo E6700 (2.66GHz)
Chipset: Intel 975X Express
RAM: 4GB
Xen:
Xen: 3.3.0, x86_64
kernel: linux-2.6.18-xen (c/s 806), x86_64
OS: CentOS 5.2, x86_64
Number of the guest domain: 1
VCPU assignment: dom0 (CPU0, CPU1), domU (CPU1)
XenStore Reference
=====================
/local/domain/<domid>
backend/
vusb/ - a directory
containing vusb backends
<domid>/ - a directory vusb's
for domid
<id>/ - a directory
for each virtual host controller
frontend-id - the domain id
of the frontend
frontend - the
path to the frontend domain
num-ports -
number of the root ports (max. 16)
port-1 - the
port connection status
...
0=disconnected, 1=low_speed, 2=full_speed, 3= high_speed
port-16
state -
communication state across XenBus to the frontend.
device/
vusb/ - a directory
containing the virtual hcd
<id>/ - a directory
containing the virtual hcd id for the domain
backend-id - the domain id
of the backend
backend - the path to
the backend domain
ring-ref - the
grant table reference for the usb request ring queue
event-channel - the event
channel used for the usb request ring queue
state -
communication state across XenBus to the backend.
Sysfs Reference
==================
usbback:
/sys/bus/usb/drivers/usbback/
grabbed_devices - devices that be
claimed usbback driver.
new_vport - the
path to set the new hotplug-rule
remove_vport - the path to
remove the hotplug-rule
vports - show
the current hotplug-rules
usbfront:
/syb/class/usb/usb_host/usb_host<bus number>/
statistics - show the
statistics and the debbuging informations
#!/bin/sh
#
# Setup XenStore entry for paravirtualized USB driver.
#
# Written by Noboru Iwamatsu <n_iwamatsu@xxxxxxxxxxxxxx>
#
XSWRITE=/usr/bin/xenstore-write
XSCHMOD=/usr/bin/xenstore-chmod
DEV_NAME=vusb
# Max 16 ports.
NUM_PORTS=8
usage () {
echo "Usage: `basename $0` <frontend-id> <device-id>"
echo " <frontend-id>: the domain id of frontend"
echo " <device-id>: the device id of frontend"
echo ""
echo "Example:"
echo " If you use paravirtual USB driver on Domain ID 1,"
echo " simply do"
echo " `basename $0` 1 0"
exit 1
}
[ $# -eq 2 ] || usage
DEV_ID=$2
# Write backend information into the location that frontend look for.
$XSWRITE /local/domain/$1/device/$DEV_NAME/$DEV_ID/backend-id 0
$XSWRITE /local/domain/$1/device/$DEV_NAME/$DEV_ID/backend \
/local/domain/0/backend/$DEV_NAME/$1/$DEV_ID
# Write frontend information into the location that backend look for.
$XSWRITE /local/domain/0/backend/$DEV_NAME/$1/$DEV_ID/frontend-id $1
$XSWRITE /local/domain/0/backend/$DEV_NAME/$1/$DEV_ID/frontend \
/local/domain/$1/device/$DEV_NAME/$DEV_ID
# Write virtual root hub field.
$XSWRITE /local/domain/0/backend/$DEV_NAME/$1/$DEV_ID/num-ports $NUM_PORTS
for i in $(seq 1 $NUM_PORTS)
do
# Set all port to disconnected state
$XSWRITE /local/domain/0/backend/$DEV_NAME/$1/$DEV_ID/port-$i "0"
done
# Set permission
$XSCHMOD /local/domain/$1/device/$DEV_NAME/$DEV_ID n$1 r0
$XSCHMOD /local/domain/$1/device/$DEV_NAME/$DEV_ID/backend-id n$1 r0
$XSCHMOD /local/domain/$1/device/$DEV_NAME/$DEV_ID/backend n$1 r0
$XSCHMOD /local/domain/0/backend/$DEV_NAME/$1/$DEV_ID n0 r$1
$XSCHMOD /local/domain/0/backend/$DEV_NAME/$1/$DEV_ID/frontend-id n0 r$1
$XSCHMOD /local/domain/0/backend/$DEV_NAME/$1/$DEV_ID/frontend n0 r$1
$XSCHMOD /local/domain/0/backend/$DEV_NAME/$1/$DEV_ID/num-ports n0 r$1
for i in $(seq 1 $NUM_PORTS)
do
$XSCHMOD /local/domain/0/backend/$DEV_NAME/$1/$DEV_ID/port-$i n0 r$1
done
# Set state to XenbusStateInitialising
$XSWRITE /local/domain/$1/device/$DEV_NAME/$DEV_ID/state 1
$XSCHMOD /local/domain/$1/device/$DEV_NAME/$DEV_ID/state n$1 r0
$XSWRITE /local/domain/0/backend/$DEV_NAME/$1/$DEV_ID/state 1
$XSCHMOD /local/domain/0/backend/$DEV_NAME/$1/$DEV_ID/state n0 r$1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|