2016年10月30日 星期日

scst 的 zero copy

如果要使用scst的zero copy的話,config 要設定成下面
HANDLER vdisk_fileio {
        DEVICE lv1{
                filename /dev/lv1
                nv_cache 1
                zero_copy 1
        }

        DEVICE lv2{
                filename /dev/lv2
                nv_cache 1
                zero_copy 1
        }
}


可以在scst_vdisk.c下
fileio_alloc_data_buf()裡面的use_zero_copy看到相關的code.
fileio_alloc_data_buf() -> prepare_read() -> prepare_read_page() 你會發現跟下面的function很像 等後面fileio_exec_read()介紹到

fileio_exec_read()在use_zero_copy的條件下,會呼叫scst_dif_process_read(),但是這個函數實際上是不作用的.
static int scst_dif_none(struct scst_cmd *cmd)
{
 int res = 0;

 TRACE_ENTRY();

 /* Nothing to do */

 TRACE_EXIT_RES(res);
 return res;
}
那麼這個函數,在一般情形下,
vfs_readv() -> do_readv_writev() -> do_iter_readv_writev() -> blkdev_read_iter() -> generic_file_read_iter()  -> do_generic_file_read()
因為我們使用的是block-devices , 所以是用到 block_dev.c 的
const struct file_operations def_blk_fops
這時候,可以發現到,do_generic_file_read跟scst自己寫的prepare_read_page() 很像.
主要差異為scst 是做
/* Ok, we have the page and it's up to date. */
*pageptr = page;
也因此,如果有使用vfs_readv()的地方,有很大機會可以換成zero copy機制.

沒有留言:

張貼留言