- 追加された行はこの色です。
- 削除された行はこの色です。
*参照元 [#l9ed6214]
#backlinks
*説明 [#j29aa4c1]
FIXME: なにをするもの?
-とぴっく
--解説
-メモ
--バッファを確保する機能は提供しない。ドライバが確保する。
主要な API
-
-バッファを共有するための準備をする、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 にする。
-DMA Buffer を fd を得る。
--[[linux-4.4.1/dma_buf_fd()]]
-fd を DMA Buffer にする。
-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()]]
シーケンス
-バッファのオーナーとなるドライバ
--バッファ確保
---方法は何でも良い、例えば dma_alloc_coherent() などを使う
--dma_buf_export()
---方法は何でも良い、例えば [[linux-4.4.1/dma_alloc_coherent()]] などを使う
--[[linux-4.4.1/dma_buf_export()]]
---バッファの共有の準備をする。
---dma_buf カーネルライブラリにバッファの存在を教える。
---struct dma_buf が得られる。
--dma_buf_fd()
---バッファを共有するための準備をする。
---ファイルディスクリプタが得られる。
---[[linux-4.4.1/dma_buf]] が得られる。
--[[linux-4.4.1/dma_buf_fd()]]
---バッファを共有するためのファイルディスクリプタが得る。
-バッファのオーナーとなるプロセス
--ファイルディスクリプタを受け取る。
---ドライバからファイルディスクリプタを受け取る方法は任意。
---ioctl() を使うことになる?
---[[linux-4.4.1/ioctl()]] を使うことになる?
-バッファのユーザとなるプロセス
--ファイルディスクリプタを受け取る。
---バッファのオーナープロセスから受け取る方法は任意。
---UNIX socket の sendmsg() の cmsg で複製できる?
-バッファのユーザとなるドライバ
--ファイルディスクリプタを受け取る
---ユーザプロセスから fd を受け取る方法は任意。
---ioctl() を使うことになる?
--dma_buf_get()
---[[linux-4.4.1/ioctl()]] を使うことになる?
--[[linux-4.4.1/dma_buf_get()]]
---dma_buf カーネルライブラリから共有したいバッファを得る。
---struct dma_buf が得られる。
--dma_buf_attach()
---[[linux-4.4.1/dma_buf]] が得られる。
--[[linux-4.4.1/dma_buf_attach()]]
---dma_buf カーネルライブラリにバッファを使用し始めることを教える。
---struct dma_buf_attachment が得られる。
---attach() コールバック
--dma_buf_map_attachment()
---[[linux-4.4.1/dma_buf_attachment]] が得られる。
---attach() コールバックが呼ばれる。
--[[linux-4.4.1/dma_buf_map_attachment()]]
---バッファにアクセスできるようにマップする。
---struct sg_table が得られる。
---map_dma_buf() コールバック
---[[linux-4.4.1/sg_table]] が得られる。
---map_dma_buf() コールバックが呼ばれる。
--バッファに対して、データの読み書きなどを行う。
--dma_buf_unmap_attachment()
--[[linux-4.4.1/dma_buf_unmap_attachment()]]
---バッファのマップを解放して、アクセスできないようにする。
---unmap_dma_buf() コールバック
--dma_buf_detach()
---unmap_dma_buf() コールバックが呼ばれる。
--[[linux-4.4.1/dma_buf_detach()]]
---dma_buf カーネルライブラリにバッファを使用し終わったことを教える。
---detach() コールバック
---detach() コールバックが呼ばれる。
-予想
--バッファのオーナーとユーザーがファイルディスクリプタを閉じると、
release() コールバックが呼び出されるものと思われる。
release() コールバックが呼ばれると思われる。
使い方の例
(調査中)
**参考 [#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]