*参照元 [#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 を得る。 --[[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()]] シーケンス -バッファのオーナーとなるドライバ --バッファ確保 ---方法は何でも良い、例えば [[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() コールバックが呼ばれると思われる。 使い方の例 (調査中) **参考 [#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]