block: Add VFIO based NVMe driver
This is a new protocol driver that exclusively opens a host NVMe
controller through VFIO. It achieves better latency than linux-aio by
completely bypassing host kernel vfs/block layer.
    $rw-$bs-$iodepth  linux-aio     nvme://
    ----------------------------------------
    randread-4k-1     10.5k         21.6k
    randread-512k-1   745           1591
    randwrite-4k-1    30.7k         37.0k
    randwrite-512k-1  1945          1980
    (unit: IOPS)
The driver also integrates with the polling mechanism of iothread.
This patch is co-authored by Paolo and me.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
Message-Id: <20180116060901.17413-4-famz@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
			
			
This commit is contained in:
		| @@ -1888,6 +1888,12 @@ L: qemu-block@nongnu.org | ||||
| S: Supported | ||||
| F: block/null.c | ||||
|  | ||||
| NVMe Block Driver | ||||
| M: Fam Zheng <famz@redhat.com> | ||||
| L: qemu-block@nongnu.org | ||||
| S: Supported | ||||
| F: block/nvme* | ||||
|  | ||||
| Bootdevice | ||||
| M: Gonglei <arei.gonglei@huawei.com> | ||||
| S: Maintained | ||||
|   | ||||
| @@ -11,6 +11,7 @@ block-obj-$(CONFIG_POSIX) += file-posix.o | ||||
| block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o | ||||
| block-obj-y += null.o mirror.o commit.o io.o | ||||
| block-obj-y += throttle-groups.o | ||||
| block-obj-$(CONFIG_LINUX) += nvme.o | ||||
|  | ||||
| block-obj-y += nbd.o nbd-client.o sheepdog.o | ||||
| block-obj-$(CONFIG_LIBISCSI) += iscsi.o | ||||
|   | ||||
							
								
								
									
										1182
									
								
								block/nvme.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1182
									
								
								block/nvme.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -124,3 +124,24 @@ vxhs_open_iio_open(const char *host) "Failed to connect to storage agent on host | ||||
| vxhs_parse_uri_hostinfo(char *host, int port) "Host: IP %s, Port %d" | ||||
| vxhs_close(char *vdisk_guid) "Closing vdisk %s" | ||||
| vxhs_get_creds(const char *cacert, const char *client_key, const char *client_cert) "cacert %s, client_key %s, client_cert %s" | ||||
|  | ||||
| # block/nvme.c | ||||
| nvme_kick(void *s, int queue) "s %p queue %d" | ||||
| nvme_dma_flush_queue_wait(void *s) "s %p" | ||||
| nvme_error(int cmd_specific, int sq_head, int sqid, int cid, int status) "cmd_specific %d sq_head %d sqid %d cid %d status 0x%x" | ||||
| nvme_process_completion(void *s, int index, int inflight) "s %p queue %d inflight %d" | ||||
| nvme_process_completion_queue_busy(void *s, int index) "s %p queue %d" | ||||
| nvme_complete_command(void *s, int index, int cid) "s %p queue %d cid %d" | ||||
| nvme_submit_command(void *s, int index, int cid) "s %p queue %d cid %d" | ||||
| nvme_submit_command_raw(int c0, int c1, int c2, int c3, int c4, int c5, int c6, int c7) "%02x %02x %02x %02x %02x %02x %02x %02x" | ||||
| nvme_handle_event(void *s) "s %p" | ||||
| nvme_poll_cb(void *s) "s %p" | ||||
| nvme_prw_aligned(void *s, int is_write, uint64_t offset, uint64_t bytes, int flags, int niov) "s %p is_write %d offset %"PRId64" bytes %"PRId64" flags %d niov %d" | ||||
| nvme_qiov_unaligned(const void *qiov, int n, void *base, size_t size, int align) "qiov %p n %d base %p size 0x%zx align 0x%x" | ||||
| nvme_prw_buffered(void *s, uint64_t offset, uint64_t bytes, int niov, int is_write) "s %p offset %"PRId64" bytes %"PRId64" niov %d is_write %d" | ||||
| nvme_rw_done(void *s, int is_write, uint64_t offset, uint64_t bytes, int ret) "s %p is_write %d offset %"PRId64" bytes %"PRId64" ret %d" | ||||
| nvme_dma_map_flush(void *s) "s %p" | ||||
| nvme_free_req_queue_wait(void *q) "q %p" | ||||
| nvme_cmd_map_qiov(void *s, void *cmd, void *req, void *qiov, int entries) "s %p cmd %p req %p qiov %p entries %d" | ||||
| nvme_cmd_map_qiov_pages(void *s, int i, uint64_t page) "s %p page[%d] 0x%"PRIx64 | ||||
| nvme_cmd_map_qiov_iov(void *s, int i, void *page, int pages) "s %p iov[%d] %p pages %d" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user