Commit 29ba5b1b authored by Michal Berger's avatar Michal Berger Committed by Konrad Sztyber
Browse files

scripts/vagrant: Add support for configuring FDP per nvme



Change-Id: Id647a02b82f7ede25496bbbbc420ef7d13d8f9af
Signed-off-by: default avatarMichal Berger <michal.berger@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17771


Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 8b8a7a80
Loading
Loading
Loading
Loading
+28 −2
Original line number Diff line number Diff line
@@ -146,15 +146,37 @@ def setup_nvme_disk(libvirt, disk, index)
  nvme_pmrs=(ENV['NVME_PMR'] || "").split(',')
  nvme_zns=(ENV['NVME_ZNS'] || "").split(',')
  nvme_ms=(ENV['NVME_MS'] || "").split(',')

  nvme_fdp=(ENV['NVME_FDP'] || "").split(',')

  namespace_disks = []
  pmr_cmdline = ""
  nvme_controller = ""
  fdp_subsys = ""
  fdp_subsys_id = ""

  # Define controller
  nvme_controller = "nvme,id=#{nvme_disk_id},serial=1234#{index}"

  # For the FDP, we need to hook our nvme into a dedicated subsystem
  if !nvme_fdp[index].nil? && nvme_fdp[index] != ""
    fdp_subsys_id = "fdp-subsys#{index}"
    fdp = nvme_fdp[index].split(':')[0..3]
    fdp_ruhs = (nvme_fdp[index].split(':')[4..]) # fdp.ruhs per ns

    # Put some defaults in place if needed
    fdp_enable = "#{fdp[0] != nil && fdp[0] != '' ? fdp[0] : 'off'}"
    fdp_runs = "#{fdp[1]   != nil && fdp[1] != '' ? fdp[1] : '96M'}"
    fdp_nrg = "#{fdp[2]    != nil && fdp[2] != '' ? fdp[2] : 2}"
    fdp_nruh = "#{fdp[3]   != nil && fdp[3] != '' ? fdp[3] : 8}"

    fdp_subsys = "nvme-subsys,id=#{fdp_subsys_id},fdp=#{fdp_enable}"
    fdp_subsys << ",fdp.runs=#{fdp_runs},fdp.nrg=#{fdp_nrg},fdp.nruh=#{fdp_nruh}"

    nvme_controller << ",subsys=#{fdp_subsys_id}"

    libvirt.qemuargs :value => "-device"
    libvirt.qemuargs :value => fdp_subsys
  end
  # Gather all drives - each namespace requires separate drive
  if nvme_namespaces[index].nil?
    namespace_disks = namespace_disks + nvme_disk.split()
@@ -195,10 +217,14 @@ def setup_nvme_disk(libvirt, disk, index)
    end
    zoned = nvme_zns[index].nil? ? "false" : "true"
    ms = nvme_ms[index].nil? ? "" : ",ms=64"
    ns = "nvme-ns,drive=#{nvme_disk_id}-drive#{nsid},bus=#{nvme_disk_id},nsid=#{nsid + 1},zoned=#{zoned},logical_block_size=4096,physical_block_size=4096#{ms}"
    if !fdp_ruhs.nil? && !fdp_ruhs[nsid].nil? && fdp_ruhs[nsid] != ""
        ns << ",fdp.ruhs=#{fdp_ruhs[nsid]}"
    end
    libvirt.qemuargs :value => "-drive"
    libvirt.qemuargs :value => "format=raw,file=#{disk},if=none,id=#{nvme_disk_id}-drive#{nsid}"
    libvirt.qemuargs :value => "-device"
    libvirt.qemuargs :value => "nvme-ns,drive=#{nvme_disk_id}-drive#{nsid},bus=#{nvme_disk_id},nsid=#{nsid + 1},zoned=#{zoned},logical_block_size=4096,physical_block_size=4096#{ms}"
    libvirt.qemuargs :value => ns
  }

end
+9 −3
Original line number Diff line number Diff line
@@ -34,13 +34,16 @@ display_help() {
	echo "                                  If no -b option is specified then this option defaults to emulating single"
	echo "                                  NVMe with 1 namespace and assumes path: /var/lib/libvirt/images/nvme_disk.img"
	echo "                                  -b option can be used multiple times for attaching multiple files to the VM"
	echo "                                  Parameters for -b option: <path>,<type>,<ns_path1[:ns_path1:...]>,<cmb>,<pmr_file[:pmr_size]>,<zns>,<ms>"
	echo "                                  Parameters for -b option: <path>,<type>,<ns_path1[:ns_path1:...]>,<cmb>,<pmr_file[:pmr_size]>,<zns>,<ms>,<fdp>"
	echo "                                  Available types: nvme"
	echo "                                  Default pmr size: 16M"
	echo "                                  Default cmb: false"
	echo "                                  Default zns: false"
	echo "                                  Default ms: none"
	echo "                                  type, ns_path, cmb, pmr, zns and ms can be empty"
	echo "                                  Default fdp: 96M:2:8[:1;2;3:1...] (fdp.runs:fdp.nrg:fdp.nruh:fdp.ruhs)"
	echo "                                  type, ns_path, cmb, pmr, zns, ms  and fdp can be empty"
	echo "                                  fdp.ruhs defines fdp.ruhs per ns, e.g.: 4;5;6:1 would set 4;5;6 for ns=1,"
	echo "                                  and 1 for ns=2."
	echo "  -c                              Create all above disk, default 0"
	echo "  -H                              Use hugepages for allocating VM memory. Only for libvirt provider. Default: false."
	echo "  -u                              Use password authentication to the VM instead of SSH keys."
@@ -204,7 +207,7 @@ if [ -z "$NVME_FILE" ]; then
else
	TMP=""
	for args in $NVME_FILE; do
		while IFS=, read -r path type namespace cmb pmr zns ms; do
		while IFS=, read -r path type namespace cmb pmr zns ms fdp; do
			TMP+="$path,"
			if [ -z "$type" ]; then
				type="nvme"
@@ -215,6 +218,7 @@ else
			NVME_DISKS_TYPE+="$type,"
			NVME_DISKS_NAMESPACES+="$namespace,"
			NVME_MS+="$ms,"
			NVME_FDP+="$fdp,"
			if [ ${NVME_AUTO_CREATE} = 1 ]; then
				$SPDK_DIR/scripts/vagrant/create_nvme_img.sh -n $path
			fi
@@ -238,6 +242,7 @@ if [ ${VERBOSE} = 1 ]; then
	echo NVME_PMR=$NVME_PMR
	echo NVME_ZNS=$NVME_ZNS
	echo NVME_MS=$NVME_MS
	echo NVME_FDP=$NVME_FDP
	echo SPDK_VAGRANT_DISTRO=$SPDK_VAGRANT_DISTRO
	echo SPDK_VAGRANT_VMCPU=$SPDK_VAGRANT_VMCPU
	echo SPDK_VAGRANT_VMRAM=$SPDK_VAGRANT_VMRAM
@@ -265,6 +270,7 @@ export NVME_CMB
export NVME_PMR
export NVME_ZNS
export NVME_MS
export NVME_FDP
export NVME_DISKS_TYPE
export NVME_DISKS_NAMESPACES
export NVME_FILE