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