12
Copyright 2008 FUJITSU LIMITED Xenの準仮想化USBドライバの開発 岩松 昇 [email protected] 株式会社 富士通研究所

Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

Copyright 2008 FUJITSU LIMITED

Xenの準仮想化USBドライバの開発

岩松 昇[email protected]

株式会社 富士通研究所

Page 2: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

背景: クライアント仮想化と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

Page 3: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

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” がロードマップに載っています

本発表では、実装詳細と開発状況を報告します。

Page 4: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

概要:準仮想化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

Page 5: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

実装詳細(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

Page 6: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

実装詳細(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

Page 7: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

実装詳細(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

Page 8: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

実装詳細(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

Page 9: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

実装詳細(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

Page 10: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

開発状況

準仮想化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.

Page 11: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

TODO と 今後の予定

TODO たくさんのクリーンナップとバグフィックス

性能向上

最近のウェブカムのサポート

• UVC (USB Video Class)対応Webカメラは広帯域が必要

サスペンド・レジュームのサポート

Xend サポート

今後の予定 Netchannel2への対応

FrontendドライバのStubドメインへの移植

Copyright 2008 FUJITSU LIMITED10

年内にはソースコードをポストする予定です

Page 12: Xenの準仮想化USBドライバの開発...実装詳細(2/5): 準仮想化USBドライバ構成とurbライフサイクル Frontend ドライバ(ホストコントローラドライバとして実装)

Copyright 2008 FUJITSU LIMITED11