xenの準仮想化usbドライバの開発...実装詳細(2/5):...
TRANSCRIPT
Copyright 2008 FUJITSU LIMITED
Xenの準仮想化USBドライバの開発
株式会社 富士通研究所
背景: クライアント仮想化とUSB
Copyright 2008 FUJITSU LIMITED1
クライアント仮想化では、ユーザVMと同時に複数のサービスVMが実行され、さまざまな機能を提供する。一例を挙げると、 認証機能の提供: USB接続のスマートカードリーダや生体認証装置を利用
インスタントオンのVoIPやメッセンジャーアプリケーション: USB接続のカメラやオーディオを利用
このような場合、ユーザVMとサービスVMから同時に同じUSBホストコントローラを利用する必要がある。
Hypervisor
User VM Service VM Service VM
LaptopUSB Host Controller
User OS Service OS Service OS
AuthenticationVoIP/
Messenger
Office/Music
apps
USB devices
Usage example of
client-side virtualization
XenとUSB対応の歴史、準仮想化USB開発の動機
Copyright 2008 FUJITSU LIMITED2
Xen 2.0.x(in PV-only age)
準仮想化USBドライバが一時的に開発ツリーに入ったが、結局削除されリリースされることはなかった。
Xen 3.0 QemuによりHVMドメインでUHCIが使えるようになった。
Xen 3.2PCIパススルー(IOMMU)でHVMドメインにUSBホストコントローラを渡せるようになった。
Xen 3.4(current unstable)
サポートが不十分だった
USB1.1 だけ
良好に動作するが、1つのドメインにコントローラを占有されて、他ドメインからは利用できない
従来のオプションは、クライアント仮想化でのUSBデバイス利用は不十分であり、準仮想化USBドライバを開発しはじめ、XCIで提案しました。
“PV USB support” がロードマップに載っています
本発表では、実装詳細と開発状況を報告します。
概要:準仮想化USBドライバとは?
Copyright 2008 FUJITSU LIMITED3
ゲスト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 OS
Guest VM 1 Guest VM 2
Guest OSGuest OS
PV USB
frontend driver
PV USB
frontend driver
PV USB
backend driver
USB native driver
USB Host Controller
USB devices
urb transferring
実装詳細(1/5)USBの基礎:Linuxドライバ構成とurbライフサイクル
Copyright 2008 FUJITSU LIMITED4
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
Kernel-space
実装詳細(2/5):準仮想化USBドライバ構成とurbライフサイクル
Frontend ドライバ (ホストコントローラドライバとして実装) 転送されてきたurbはRINGリクエストにマップされ、backendに送られる。
RINGレスポンスのステータスを付与し、urbを USB coreに返却する。
Backend ドライバ (USB functionドライバとして実装) RINGリクエストから元のurbを再構成し、指定されたデバイスに転送する。
urb転送が完了すると、コールバックハンドラからRINGレスポンスをfrontendに返す。
既存コードの変更は不要で、カーネル内の全USBドライバをサポートできるはず。
Copyright 2008 FUJITSU LIMITED5
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
RINGxenbus
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
allocfree
実装詳細(3/5):urbのRINGリクエスト・レスポンスへのマッピング方法
urb 構造体は以下のようにRINGにマッピングされる。
urbのデータバッファは、grant tableによりfrontendとbackendで該当するページを共有する。
共有ページ数が10の時, RING_SIZEは32になる。恐らくほとんどのドライバではこの値で問題ないと考えられる
Copyright 2008 FUJITSU LIMITED6
struct urb
{
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;
…
};
struct usbif_response
{
...
};
struct usbif_request
{
…
segs[];
};
Mapping to RING request
Mapping to RING response
Sharing pages with grant table
実装詳細(4/5)仮想ホストコントローラの内部実装
Copyright 2008 FUJITSU LIMITED7
仮想ホストコントローラはurbをスケジューリングするための3つのキューを持つ
submit_waitingホストコントローラにエンキューされたurbは、このキューの末尾に追加され、backendに送信されるのを待つ。
submit_in_progressRINGリクエストが完了してレスポンスを待っている間、urbはこのキューに追加される。
giveback_waitingRINGレスポンスを受信し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
urb urb
実装詳細(5/5)ゲストドメインへのデバイス接続方法
Copyright 2008 FUJITSU LIMITED8
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
device
Dom 0
Host Controller
(usb1)
roothub
hub
device
device device device device
device
1-4
1-2.1 1-2.3
開発状況
準仮想化USBドライバはちょうど動き始めたところです 動作確認済みデバイス
性能は約6MB/s (USBメモリの読み書きにおいて)
• ネイティブ性能の1/5だが、それでもUSB1.1の4倍以上
• まだまだ改善の余地がある。
実装状況
• ホットプラグと切断に関して未実装箇所あり
Copyright 2008 FUJITSU LIMITED9
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.
2. Horizontal stripes are into video streaming image.
TODO と 今後の予定
TODO たくさんのクリーンナップとバグフィックス
性能向上
最近のウェブカムのサポート
• UVC (USB Video Class)対応Webカメラは広帯域が必要
サスペンド・レジュームのサポート
Xend サポート
今後の予定 Netchannel2への対応
FrontendドライバのStubドメインへの移植
Copyright 2008 FUJITSU LIMITED10
年内にはソースコードをポストする予定です
Copyright 2008 FUJITSU LIMITED11