2016-06-28 4 views
4

私は現在、dma_map_pageを使用してpciデバイスドライバを取得しており、ユーザスペースアドレスをdmaアドレスにマッピングしています。これは正常に動作していますが、私はグループとドメインを使用していくつかの利点を得るために、これをiommu APIに移植しようとしています。ユーザスペースアドレスでのLinux IOMMU APIの使用

現在のコード:これは罰金

ret = get_user_pages_fast(user_addr, one_page, flags, page); 
dma_addr = dma_map_page(dev, off, size, *page, DMA_BIDIRECTIONAL); 

IOMMUコードを動作します。これは、すべての機能が正常に戻りますが、私はデバイスをiovaを渡す際にでき

ret = get_user_pages_fast(...); 
pfn = page_to_pfn(*page); 
group = iommu_group_get(dev); 
domain = iommu_domain_alloc(dev->bus); 
iommu_attach_device(domain, dev); 
iommu_attach_group(domain, group); 
iommu_map(domain, iova, pfn << PAGE_SHIFT, size, IOMMU_READ|IOMMU_WRITE); 

を動作しません」それを使用する。私は誰もが、私の問題がどこにあるか、どこで見ることができるかを知っていますか? Linuxのiommuの実装をどこからでも見つけることはできませんでした。

編集: 私は最初の頃を逃したことをdmesgの中にいくつかのエントリがありました。それは、ページ・テーブルにアクセスしているか、タスク構造体の内部で維持されるデータ構造かもしれないので

DEBUG: phys addr 0x7738de000 
DEBUG: iova 0xdeadb000 
DMAR: DRHD: handling fault status reg 2 
DMAR: DMAR:[DMA Read] Request device [50:00.0] fault addr 1fdaee4000 
DMAR:[fault reason 06] PTE Read access is not set 
+0

CPUとサウスブリッジのモデルは何ですか?あなたは彼らがIOMMUを持っていると確信していますか?お使いのデバイスでIOMMUを有効にしていますか(インテルのVT-dは一部のポートでのみ有効です)。 – osgx

+0

デバイスには、ブート中にいつか割り当てられたiommuグループがあります。 iommuがデバイス用に有効になっていることを確認するために何か確認が必要なことはありますか? – Robert

+0

ロバート、まだ、あなたのHWは何ですか? 'drivers/iommu/iommu.c'ファイルのpd_debugを有効にする方法はありますか?どうして 'PFN_PHYS'ではなく<<? – osgx

答えて

0

は、このような操作は、特権です。

ハイパーバイザーがこの処理をどのように行うか、仮想マシンがそのような呼び出しをどのように処理するかを確認してください。ハイパーバイザーを介してゲストOSからIOMMUページングユニットを設定するドライバーインターフェースがいくつかあります。

ハイパーバイザーも特権モードで実行されます。

関連する問題