Yes, I know this.I am not sure I understand the details correctly. iounit is the size that we use in client_read to determine the size in which we should request I/O from the client. But we still can't do I/O in size larger than s->msize. If you look at the client side (kernel 9p fs), you will find rsize = fid->iounit; if (!rsize || rsize > clnt->msize-P9_IOHDRSZ) rsize = clnt->msize - P9_IOHDRSZ;
if your iounit calculation ends up zero, that should be handled
correctly by
if (!iounit) {
iounit = s->msize - P9_IOHDRSZ;
}
return iounit;
So what is the issue here. ?
This will result in an alignment issue while mapping the I/O
requested by int p9_nr_pages(char *data, int len)Please see the following experiment I did without the fix.
{
unsigned long start_page, end_page;
start_page = (unsigned long)data >> PAGE_SHIFT;
end_page = ((unsigned long)data + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
return end_page - start_page;
}
$ qemu-system-x86_64 /root/CentOS---6.6-64bit---2015-03-06-a.qcow2 -smp 4 -m 4096 -fsdev cephfs,security_model=passthrough,id=fsdev0,path=/ -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=cephfs --enable-kvm -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no
[root@localhost ~]# mount -t 9p -o trans=virtio,version=9p2000.L cephfs /mntIn this case, I used the default msize which is 8192(in Byte). Since cephfs
[root@localhost ~]# ls -lah /mnt/8kfile
-rw-r--r-- 1 root root 8.0K 2016-02-19 09:37 /mnt/8kfile
[root@localhost ~]# cat p9_read.stp4) The output I got when I copied out the file /mnt/8kfile to /tmp/ directory,
probe kernel.function("p9_virtio_zc_request").call
{
printf("p9_virtio_zc_request: inlen size is %d\n", int_arg(5));
}
probe kernel.function("p9_nr_pages").call
{
printf("p9_nr_pages: start_page = %ld\n", int_arg(1) >> 12);
printf("p9_nr_pages: end_age = %ld\n", (int_arg(1) + 8168 + 4096 -1) >> 12);
}
p9_virtio_zc_request: inlen size is 8168Per the text in red(start_page = 34293757815, end_page = 34293757818),
p9_nr_pages: start_page = 34293757815
p9_nr_pages: end_age = 34293757818
CEPHFS_DEBUG: cephfs_preadv iov_len=4096This patch aims to fix this. And the result turns out it works quite well, all the
CEPHFS_DEBUG: cephfs_preadv iov_len=4072
CEPHFS_DEBUG: cephfs_preadv iov_len=24
p9_virtio_zc_request: inlen size is 4096Thanks,
p9_nr_pages: start_page = 34203171814
p9_nr_pages: end_age = 34203171815
p9_virtio_zc_request: inlen size is 4096
p9_nr_pages: start_page = 34203171815
p9_nr_pages: end_age = 34203171816
CEPHFS_DEBUG: cephfs_preadv iov_len=4096
CEPHFS_DEBUG: cephfs_preadv iov_len=4096
-aneesh