NVMe driver within hypervisors
Keith Busch
keith.busch at intel.com
Mon Dec 1 16:08:17 PST 2014
On Mon, 1 Dec 2014, Daniel Stodden wrote:
> On Mon, 2014-12-01 at 15:07 +0000, Keith Busch wrote:
>> Correct me if I'm wrong, but doesn't Xen derive device driver support
>> from its "dom-0"? Just use an nvme-capable Linux guest there and you've
>> enabled Xen to support nvme, yeah?
>
> Correct. Backends in dom0 eventually translate guest I/O to bios issued
> to a kernel blockdev. Such as an NVMe one, typically implemented by a
> normal Linux driver.
I get asked about Xen support a lot, but my experience is limited so I've
only been guessing when I say it ought to work just fine. No one ever
takes it to the next level as far as I know. I'm not sure what people
are waiting for (a commercial offering perhaps?), so I'll give it a shot.
It's pretty darn easy actually (YMMV). I'm starting with an old debian,
spare parts from the lab, and an old nvme driver. The h/w I found is
pretty weak, so I can't actually do anything interesting with it except
show that xen and nvme have worked since forever ago.
I'll post stuff on this public list so I can point people to it next
time someone asks "when will xen run nvme?" :)
Here's what I'm starting with:
# cat /etc/debian_version
7.7
# uname -a
Linux debian 3.2.0-4-amd64 #1 SMP Debian 3.2.63-2+deb7u1 x86_64 GNU/Linux
Install Xen:
# apt-get install xen-linux-system
Edit /etc/default/grub by adding the following line:
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=1024M,max:1500M no-real-mode e820-verbose"
Edit /etc/xen/xend-config.sxp to configure the toolstack to match by changing the following settings:
(dom0-min-mem 1024)
(enable-dom0-ballooning no)
Update grub:
# update-grub
After reboot, make sure to select "Xen 4.1-amd64" boot option.
Verify it's running under Xen:
# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 1024 4 r----- 12.5
# xm info
host : debian
release : 3.2.0-4-amd64
version : #1 SMP Debian 3.2.63-2+deb7u1
machine : x86_64
nr_cpus : 4
nr_nodes : 1
cores_per_socket : 2
threads_per_core : 2
cpu_mhz : 3691
hw_caps : bfebfbff:2c100800:00000000:00007f40:71dafbbf:00000000:00000021:0000272b
virt_caps : hvm
total_memory : 1949
free_memory : 1409
free_cpus : 0
xen_major : 4
xen_minor : 1
xen_extra : .4
xen_caps : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64
xen_scheduler : credit
xen_pagesize : 4096
platform_params : virt_start=0xffff800000000000
xen_changeset : unavailable
xen_commandline : placeholder dom0_mem=1024M,max:2048M no-real-mode e820-verbose
cc_compiler : gcc version 4.7.2 (Debian 4.7.2-5)
cc_compile_by : ultrotter
cc_compile_domain : debian.org
cc_compile_date : Mon Sep 29 16:42:20 EEST 2014
xend_config_format : 4
'git' a capable nvme driver for this kernel, make and load it:
# apt-get install linux-headers-3.2.0-4-amd64
# git clone git://git.infradead.org/users/kbusch/nvme-compatibility.git
# cd nvme-compatibility && make nvme && insmod ./drivers/block/nvme.ko
Check that it found my device:
# cat /proc/partitions
major minor #blocks name
8 0 293036184 sda
8 1 498688 sda1
8 2 288442368 sda2
8 3 4093952 sda3
254 0 781412184 nvme0n1
Let's see what's attached to dom0:
# xm block-list 0
Nothing. Let's attach the raw nvme device:
# xm block-attach 0 phy:/dev/nvme0n1 xvda w 0
Now let's check:
# cat /proc/partitions
major minor #blocks name
8 0 293036184 sda
8 1 498688 sda1
8 2 288442368 sda2
8 3 4093952 sda3
254 0 781412184 nvme0n1
202 0 781412184 xvda
# xm block-list 0
Vdev BE handle state evt-ch ring-ref BE-path
51712 0 0 4 40 8 /local/domain/0/backend/vbd/0/51712
Looks like Xen and NVMe have worked for years! Hardly worth a mention
on nvmexpress.org, though; they don't announce for a particular linux
distro, so I don't see why xen would get special treatment.
More information about the Linux-nvme
mailing list