forked from Minki/linux
virtio-fs: add virtiofs filesystem
Add a basic file system module for virtio-fs. This does not yet contain shared data support between host and guest or metadata coherency speedups. However it is already significantly faster than virtio-9p. Design Overview =============== With the goal of designing something with better performance and local file system semantics, a bunch of ideas were proposed. - Use fuse protocol (instead of 9p) for communication between guest and host. Guest kernel will be fuse client and a fuse server will run on host to serve the requests. - For data access inside guest, mmap portion of file in QEMU address space and guest accesses this memory using dax. That way guest page cache is bypassed and there is only one copy of data (on host). This will also enable mmap(MAP_SHARED) between guests. - For metadata coherency, there is a shared memory region which contains version number associated with metadata and any guest changing metadata updates version number and other guests refresh metadata on next access. This is yet to be implemented. How virtio-fs differs from existing approaches ============================================== The unique idea behind virtio-fs is to take advantage of the co-location of the virtual machine and hypervisor to avoid communication (vmexits). DAX allows file contents to be accessed without communication with the hypervisor. The shared memory region for metadata avoids communication in the common case where metadata is unchanged. By replacing expensive communication with cheaper shared memory accesses, we expect to achieve better performance than approaches based on network file system protocols. In addition, this also makes it easier to achieve local file system semantics (coherency). These techniques are not applicable to network file system protocols since the communications channel is bypassed by taking advantage of shared memory on a local machine. This is why we decided to build virtio-fs rather than focus on 9P or NFS. Caching Modes ============= Like virtio-9p, different caching modes are supported which determine the coherency level as well. The “cache=FOO” and “writeback” options control the level of coherence between the guest and host filesystems. - cache=none metadata, data and pathname lookup are not cached in guest. They are always fetched from host and any changes are immediately pushed to host. - cache=always metadata, data and pathname lookup are cached in guest and never expire. - cache=auto metadata and pathname lookup cache expires after a configured amount of time (default is 1 second). Data is cached while the file is open (close to open consistency). - writeback/no_writeback These options control the writeback strategy. If writeback is disabled, then normal writes will immediately be synchronized with the host fs. If writeback is enabled, then writes may be cached in the guest until the file is closed or an fsync(2) performed. This option has no effect on mmap-ed writes or writes going through the DAX mechanism. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Vivek Goyal <vgoyal@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
parent
2d1d25d0a2
commit
a62a8ef9d9
@ -27,3 +27,14 @@ config CUSE
|
||||
|
||||
If you want to develop or use a userspace character device
|
||||
based on CUSE, answer Y or M.
|
||||
|
||||
config VIRTIO_FS
|
||||
tristate "Virtio Filesystem"
|
||||
depends on FUSE_FS
|
||||
select VIRTIO
|
||||
help
|
||||
The Virtio Filesystem allows guests to mount file systems from the
|
||||
host.
|
||||
|
||||
If you want to share files between guests or with the host, answer Y
|
||||
or M.
|
||||
|
@ -5,5 +5,6 @@
|
||||
|
||||
obj-$(CONFIG_FUSE_FS) += fuse.o
|
||||
obj-$(CONFIG_CUSE) += cuse.o
|
||||
obj-$(CONFIG_VIRTIO_FS) += virtio_fs.o
|
||||
|
||||
fuse-objs := dev.o dir.o file.o inode.o control.o xattr.o acl.o readdir.o
|
||||
|
@ -353,6 +353,10 @@ struct fuse_req {
|
||||
/** Used to wake up the task waiting for completion of request*/
|
||||
wait_queue_head_t waitq;
|
||||
|
||||
#if IS_ENABLED(CONFIG_VIRTIO_FS)
|
||||
/** virtio-fs's physically contiguous buffer for in and out args */
|
||||
void *argbuf;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct fuse_iqueue;
|
||||
@ -383,6 +387,11 @@ struct fuse_iqueue_ops {
|
||||
*/
|
||||
void (*wake_pending_and_unlock)(struct fuse_iqueue *fiq)
|
||||
__releases(fiq->lock);
|
||||
|
||||
/**
|
||||
* Clean up when fuse_iqueue is destroyed
|
||||
*/
|
||||
void (*release)(struct fuse_iqueue *fiq);
|
||||
};
|
||||
|
||||
/** /dev/fuse input queue operations */
|
||||
|
@ -630,6 +630,10 @@ EXPORT_SYMBOL_GPL(fuse_conn_init);
|
||||
void fuse_conn_put(struct fuse_conn *fc)
|
||||
{
|
||||
if (refcount_dec_and_test(&fc->count)) {
|
||||
struct fuse_iqueue *fiq = &fc->iq;
|
||||
|
||||
if (fiq->ops->release)
|
||||
fiq->ops->release(fiq);
|
||||
put_pid_ns(fc->pid_ns);
|
||||
put_user_ns(fc->user_ns);
|
||||
fc->release(fc);
|
||||
|
1195
fs/fuse/virtio_fs.c
Normal file
1195
fs/fuse/virtio_fs.c
Normal file
File diff suppressed because it is too large
Load Diff
19
include/uapi/linux/virtio_fs.h
Normal file
19
include/uapi/linux/virtio_fs.h
Normal file
@ -0,0 +1,19 @@
|
||||
/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
|
||||
|
||||
#ifndef _UAPI_LINUX_VIRTIO_FS_H
|
||||
#define _UAPI_LINUX_VIRTIO_FS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/virtio_ids.h>
|
||||
#include <linux/virtio_config.h>
|
||||
#include <linux/virtio_types.h>
|
||||
|
||||
struct virtio_fs_config {
|
||||
/* Filesystem name (UTF-8, not NUL-terminated, padded with NULs) */
|
||||
__u8 tag[36];
|
||||
|
||||
/* Number of request queues */
|
||||
__u32 num_request_queues;
|
||||
} __attribute__((packed));
|
||||
|
||||
#endif /* _UAPI_LINUX_VIRTIO_FS_H */
|
@ -44,6 +44,7 @@
|
||||
#define VIRTIO_ID_VSOCK 19 /* virtio vsock transport */
|
||||
#define VIRTIO_ID_CRYPTO 20 /* virtio crypto */
|
||||
#define VIRTIO_ID_IOMMU 23 /* virtio IOMMU */
|
||||
#define VIRTIO_ID_FS 26 /* virtio filesystem */
|
||||
#define VIRTIO_ID_PMEM 27 /* virtio pmem */
|
||||
|
||||
#endif /* _LINUX_VIRTIO_IDS_H */
|
||||
|
Loading…
Reference in New Issue
Block a user