Xenの準仮想化USBドライバの開発
岩松 昇
n_iwamatsu@jp.fujitsu.com
背景: クライアント仮想化とUSB
クライアント仮想化では、ユーザVMと同時に複数のサービスVMが実行され、さ
まざまな機能を提供する。一例を挙げると、
認証機能の提供: USB接続のスマートカードリーダや生体認証装置を利用
インスタントオンのVoIPやメッセンジャーアプリケーション: USB接続のカメラやオーディオを利用
このような場合、ユーザVMとサービスVMから同時に同じUSBホストコントローラ
を利用する必要がある。
Hypervisor
User VM Service VM Service VM
Laptop
USB Host Controller
User OS Service OS Service OS
Authentication VoIP/ Messenger Office/Music apps
USB devices
Usage example of
client-side virtualization
XenとUSB対応の歴史、準仮想化USB開発の動機
Xen 2.0.x
(in PV-only age)
準仮想化USBドライバが一時的に開発ツリーに入ったが、
結局削除されリリースされることはなかった。
Xen 3.0
QemuによりHVMドメインでUHCIが使えるようになった。
Xen 3.2
PCIパススルー(IOMMU)でHVMドメインにUSBホストコント
ローラを渡せるようになった。
Xen 3.4
(current unstable)
サポートが不十分だった
USB1.1 だけ
良好に動作するが、1つのドメインにコントローラ
を占有されて、他ドメインからは利用できない
従来のオプションは、クライアント仮想化でのUSBデバイ
ス利用は不十分であり、準仮想化USBドライバを開発し
はじめ、XCIで提案しました。
“PV USB support” がロードマップに載っています
本発表では、実装詳細と開発状況を報告します。
概要:準仮想化USBドライバとは?
ゲストVMからUSBデバイスを利用するためのドライバ
frontend: USB2.0仮想ホストコントローラでbackendのプロキシとして動作する
backend: 実際にデバイスを制御するUSBファンクションドライバ
urb (USB request block):
Linuxカーネル内の全てのUSBドライバとサブシステム
はurbにより通信を行う。urb は、include/linux/usb.hで
定義されている構造体で、ネットワークドライバにおけ
る skbuff構造体のようなもの。
frontendはXenを介してbackendにurbを転送し、backendは受信したurbをUSB
デバイスに転送する。
Xen Hypervisor
Dom 0
Dom0 OSGuest VM 1
Guest VM 2
Guest OS Guest OS PV USB frontend driver PV USB frontend driver PV USB backend driverUSB native driver
USB Host Controller
USB devices
実装詳細(1/5)
USBの基礎:Linuxドライバ構成とurbライフサイクル
Linuxカーネル内では、USBは3層のモジュールで実装されている
USB Function Driver – USBデバイスごとのドライバ(マスストレージ、プリンタ、など)
Urbはここで生成され、USB coreに転送される。転送が完了するとコールバックハンドラが呼ばれる。
USB Core – LinuxカーネルのUSBサブシステム
Urbはデバイスに合わせて特定のホストコントローラに転送される
USB Host Controller Driver – ホストコントローラハードウェア用のドライバ
転送されてきたUrbはコントローラに転送され、その応答後、USB coreに返却される。
USB Function Driver
USB Core
USB Host Controller Driver
usb_submit_urb()
usb_hcd_giveback_urb()
.urb_enqueue()
calling completion handler
usb_alloc_urb()
usb_free_urb()
Hardware
(USB Host Controller)
User-space or other kernel subsystems
urb
urb
実装詳細(2/5):
準仮想化USBドライバ構成とurbライフサイクル
Frontend ドライバ (ホストコントローラドライバとして実装)
転送されてきたurbはRINGリクエストにマップされ、backendに送られる。
RINGレスポンスのステータスを付与し、urbを USB coreに返却する。
Backend ドライバ (USB functionドライバとして実装)
RINGリクエストから元のurbを再構成し、指定されたデバイスに転送する。
urb転送が完了すると、コールバックハンドラからRINGレスポンスをfrontendに返す。
既存コードの変更は不要で、カーネル内の全USBドライバをサポートできるはず。
PV USB backend
PV USB frontend Xen frontend interface
RING xenbus Virtual USB 2.0 Host Controller Driver
USB Function Driver
USB Core
Host Controller Driver USB Core
USB Function Driver Xen backend interface
RING xenbus
urb urb
Cloned urb
Dom0 kernel-space DomU kernel-space
Cloned urb
Hardware (USB Host Controller)
.urb_enqueue() usb_hcd_giveback_urb()
usb_submit_urb () completion handler alloc
実装詳細(3/5):
urbのRINGリクエスト・レスポンスへのマッピング方法
urb 構造体は以下のようにRINGにマッピングされる。
urbのデータバッファは、grant tableによりfrontendとbackendで該当するページを
共有する。
共有ページ数が10の時, RING_SIZEは32になる。恐らくほとんどのドライバではこ
の値で問題ないと考えられる
structurb {unsigned int pipe;
unsigned int transfer_flags;
void *transfer_buffer;
int transfer_buffer_length;
unsigned char *setup_packet;
int interval;
int start_frame;
int number_of_packets;
struct usb_iso_packet_descriptor iso_frame_desc[0];
int status; int actual_length; int error_count; … }; structusbif_response { ... }; structusbif_request { … segs[]; };
Mapping to RING request
Mapping to RING response
実装詳細(4/5)
仮想ホストコントローラの内部実装
仮想ホストコントローラはurbをスケジューリングするための3つのキューを持つ
submit_waiting
ホストコントローラにエンキューされたurbは、このキューの末尾に追加され、backendに送信されるのを待つ。 submit_in_progress
RINGリクエストが完了してレスポンスを待っている間、urbはこのキューに追加される。 giveback_waiting
RINGレスポンスを受信しUSB coreに返却されるのを待つ間、urbはこのキューで待機する。 RINGレスポンスは割込みから呼 ばれ、キューのフラッシュはタイ マー呼び出しにより行われる。Virtual USB Host Controller
submit_waiting_queue submit_in_progress_queue giveback_waiting_queue urb .urb_enqueue() usb_hcd_giveback_urb() RING request RING response urb
urb urb urb urb urb
urb
after send, move to tail
move matched urb to tail
add to tail
delete from queue
実装詳細(5/5)
ゲストドメインへのデバイス接続方法
BackendドライバのsysfsインタフェースからHotplugルールを設定する。
Hotplugルールのフォーマット
• <usbbusname>:<domid>:<vusb number>:<virtual port number>
設定例
% 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 1-2.1:2:0:2 > /sys/bus/usb/drivers/usbback/new_vport
新しいデバイスが接続されると、backendドライバはそのバス名と設定を確認し、一致する
場合はそのデバイスを要求する。FrontendはXenbusイベントによりhotplug通知を受ける。
Guest VM 1 (domain ID:1) Virtual Host Controller (vusb-0) Virtual roothub Guest VM 2 (domain ID:2) Virtual Host Controller (vusb-0) Virtual roothub deviceDom 0
Host Controller (usb1) roothub hub devicedevice device device device
device 1-4
開発状況
準仮想化USBドライバはちょうど動き始めたところです
動作確認済みデバイス
性能は約6MB/s (USBメモリの読み書きにおいて)
• ネイティブ性能の1/5だが、それでもUSB1.1の4倍以上
• まだまだ改善の余地がある。
実装状況
• ホットプラグと切断に関して未実装箇所あり
Type Name Manufacturer Driver Status
キーボード FKB-108-EU FILCO usbhid マウス Cordless Notebook Mouse Logitech usbhid メモリ RUF2-R2GS Buffalo usb-storage メモリ RUF-C1G/U2 Buffalo usb-storage
HDD HDCN-U500 IO DATA usb-storage [1]
ウェブカム WebCam 3 USB Creative Labs ov511 [2]
Works
Works with issues
Not worked yet
1. SCSI command [READ_CAPCITY] fails.