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機制.
沒有留言:
張貼留言