5

dma_map_pageユーザー空間アドレスを dma アドレスにマップするために現在使用している pci デバイス ドライバーがあります。これは正常に機能していますが、これを 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 コード: これは機能しません

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);

すべての関数が正常に返されますが、iova をデバイスに渡すと、デバイスはそれを使用できません。以前に iommu を使用したことがあり、私の問題がどこにあるのか、またはどこを見ればよいかを知っている人はいますか? 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
4

1 に答える 1

0

このような操作は、ページ テーブルにアクセスしているため、またはタスク構造内に保持されているデータ構造である可能性があるため、特権が与えられます。

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

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

于 2017-08-17T15:32:19.090 に答える