*参照元 [#l9ed6214]
#backlinks

*説明 [#j29aa4c1]
FIXME: なにをするもの?

-とぴっく
--共有に特化、バッファを確保する機能は提供しない。
--CMA など、別の手段を用いてドライバ(DMA buffer sharing の利用者側)が確保しなければならない。


**主要 API [#v9878462]

-バッファを共有するための準備をする、dma_buf ライブラリにバッファを伝える。
--[[linux-4.4.1/dma_buf_export()]]
--[[linux-4.4.1/dma_buf_export_info]]
---バッファの扱い方(特にどうやって仮想空間にマップするかは必須)を定義する。
---なぜ必要かというと、バッファの確保の仕方によって、バッファのマップの仕方が変わるから。
---[[linux-4.4.1/dma_buf_ops]]
-DMA Buffer を fd を得る。
--[[linux-4.4.1/dma_buf_fd()]]
-fd から DMA Buffer を得る。
--[[linux-4.4.1/dma_buf_get()]]
-DMA Buffer の共有を開始する
--[[linux-4.4.1/dma_buf_attach()]]
--[[linux-4.4.1/dma_buf_attachment]]
-DMA Buffer をカーネルのリニアアドレス空間にマッピングする。
--ドライバからバッファにアクセスするときは必須。
--[[linux-4.4.1/dma_buf_map_attachment()]]
--[[linux-4.4.1/dma_buf_unmap_attachment()]]
-DMA Buffer をユーザの仮想空間にマッピングする。
--[[linux-4.4.1/dma_buf_mmap()]]
-DMA Buffer の共有を終了する
--[[linux-4.4.1/dma_buf_detach()]]


**シーケンス [#n3abc860]

-バッファのオーナーとなるドライバ
--バッファ確保
---方法は何でも良い、例えば [[linux-4.4.1/dma_alloc_coherent()]] などを使う
--[[linux-4.4.1/dma_buf_export()]]
---バッファの共有の準備をする。
---dma_buf カーネルライブラリにバッファの存在を教える。
---[[linux-4.4.1/dma_buf]] が得られる。
--[[linux-4.4.1/dma_buf_fd()]]
---バッファを共有するためのファイルディスクリプタが得られる。

-バッファのオーナーとなるプロセス
--ファイルディスクリプタを受け取る。
---ドライバからファイルディスクリプタを受け取る方法は任意。
---[[linux-4.4.1/ioctl()]] を使うことになる?

-バッファのユーザとなるプロセス
--ファイルディスクリプタを受け取る。
---バッファのオーナープロセスから受け取る方法は任意。
---UNIX socket の sendmsg() の cmsg で複製できる?

-バッファのユーザとなるドライバ
--ファイルディスクリプタを受け取る
---ユーザプロセスから fd を受け取る方法は任意。
---[[linux-4.4.1/ioctl()]] を使うことになる?
--[[linux-4.4.1/dma_buf_get()]]
---dma_buf カーネルライブラリから共有したいバッファを得る。
---[[linux-4.4.1/dma_buf]] が得られる。
--[[linux-4.4.1/dma_buf_attach()]]
---dma_buf カーネルライブラリにバッファを使用し始めることを教える。
---[[linux-4.4.1/dma_buf_attachment]] が得られる。
---attach() コールバックが呼ばれる。
--[[linux-4.4.1/dma_buf_map_attachment()]]
---バッファにアクセスできるようにマップする。
---[[linux-4.4.1/sg_table]] が得られる。
---map_dma_buf() コールバックが呼ばれる。
--バッファに対して、データの読み書きなどを行う。
--[[linux-4.4.1/dma_buf_unmap_attachment()]]
---バッファのマップを解放して、アクセスできないようにする。
---unmap_dma_buf() コールバックが呼ばれる。
--[[linux-4.4.1/dma_buf_detach()]]
---dma_buf カーネルライブラリにバッファを使用し終わったことを教える。
---detach() コールバックが呼ばれる。

-予想
--バッファのオーナーとユーザーがファイルディスクリプタを閉じると、
release() コールバックが呼ばれると思われる。


**使い方の例 [#ab4da934]

 (調査中)


**参考 [#oea5d6fe]

 $ egrep -r '^EXPORT_SYMBOL' drivers/dma-buf/
 drivers/dma-buf/seqno-fence.c:EXPORT_SYMBOL(seqno_fence_ops);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_context_alloc);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_signal_locked);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_signal);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_wait_timeout);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_release);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_free);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_enable_sw_signaling);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_add_callback);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_remove_callback);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_default_wait);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_wait_any_timeout);
 drivers/dma-buf/fence.c:EXPORT_SYMBOL(fence_init);
 drivers/dma-buf/reservation.c:EXPORT_SYMBOL(reservation_ww_class);
 drivers/dma-buf/reservation.c:EXPORT_SYMBOL(reservation_seqcount_class);
 drivers/dma-buf/reservation.c:EXPORT_SYMBOL(reservation_seqcount_string);
 drivers/dma-buf/reservation.c:EXPORT_SYMBOL(reservation_object_reserve_shared);
 drivers/dma-buf/reservation.c:EXPORT_SYMBOL(reservation_object_add_shared_fence);
 drivers/dma-buf/reservation.c:EXPORT_SYMBOL(reservation_object_add_excl_fence);
 drivers/dma-buf/reservation.c:EXPORT_SYMBOL_GPL(reservation_object_get_fences_rcu);
 drivers/dma-buf/reservation.c:EXPORT_SYMBOL_GPL(reservation_object_wait_timeout_rcu);
 drivers/dma-buf/reservation.c:EXPORT_SYMBOL_GPL(reservation_object_test_signaled_rcu);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_export);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_fd);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_get);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_put);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_attach);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_detach);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_map_attachment);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_unmap_attachment);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_begin_cpu_access);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_end_cpu_access);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_kmap_atomic);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_kunmap_atomic);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_kmap);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_kunmap);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_mmap);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_vmap);
 drivers/dma-buf/dma-buf.c:EXPORT_SYMBOL_GPL(dma_buf_vunmap);


**関連モジュール [#q31b30fc]


*コメント [#n7c0ba9b]

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS