Commit f9f445b6 authored by Cunyin Chang's avatar Cunyin Chang Committed by Jim Harris
Browse files

nvme: Add support of hotplug for vfio-attached devices.



This patch just make sure SPDK support the hotplug of vfio-attached devices,
but there still issues when we get hotplug events from kernel, this patch tested
based on my modified local vfio-pci driver which just for test purpose and not upstream.

Change-Id: I974177e70e4133d2a583d00e714a7607765d3548
Signed-off-by: default avatarCunyin Chang <cunyin.chang@intel.com>
Reviewed-on: https://review.gerrithub.io/390580


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 8acb3630
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -228,7 +228,8 @@ _nvme_pcie_hotplug_monitor(void *cb_ctx, spdk_nvme_probe_cb probe_cb,
	struct spdk_pci_addr pci_addr;

	while (spdk_get_uevent(hotplug_fd, &event) > 0) {
		if (event.subsystem == SPDK_NVME_UEVENT_SUBSYSTEM_UIO) {
		if (event.subsystem == SPDK_NVME_UEVENT_SUBSYSTEM_UIO ||
		    event.subsystem == SPDK_NVME_UEVENT_SUBSYSTEM_VFIO) {
			if (event.action == SPDK_NVME_UEVENT_ADD) {
				SPDK_DEBUGLOG(SPDK_TRACE_NVME, "add nvme address: %s\n",
					      event.traddr);
+28 −0
Original line number Diff line number Diff line
@@ -93,10 +93,14 @@ parse_event(const char *buf, struct spdk_uevent *event)
	char action[SPDK_UEVENT_MSG_LEN];
	char subsystem[SPDK_UEVENT_MSG_LEN];
	char dev_path[SPDK_UEVENT_MSG_LEN];
	char driver[SPDK_UEVENT_MSG_LEN];
	char vfio_pci_addr[SPDK_UEVENT_MSG_LEN];

	memset(action, 0, SPDK_UEVENT_MSG_LEN);
	memset(subsystem, 0, SPDK_UEVENT_MSG_LEN);
	memset(dev_path, 0, SPDK_UEVENT_MSG_LEN);
	memset(driver, 0, SPDK_UEVENT_MSG_LEN);
	memset(vfio_pci_addr, 0, SPDK_UEVENT_MSG_LEN);

	while (*buf) {
		if (!strncmp(buf, "ACTION=", 7)) {
@@ -108,6 +112,12 @@ parse_event(const char *buf, struct spdk_uevent *event)
		} else if (!strncmp(buf, "SUBSYSTEM=", 10)) {
			buf += 10;
			snprintf(subsystem, sizeof(subsystem), "%s", buf);
		} else if (!strncmp(buf, "DRIVER=", 7)) {
			buf += 7;
			snprintf(driver, sizeof(driver), "%s", buf);
		} else if (!strncmp(buf, "PCI_SLOT_NAME=", 14)) {
			buf += 14;
			snprintf(vfio_pci_addr, sizeof(vfio_pci_addr), "%s", buf);
		}
		while (*buf++)
			;
@@ -137,6 +147,24 @@ parse_event(const char *buf, struct spdk_uevent *event)
		spdk_pci_addr_fmt(event->traddr, sizeof(event->traddr), &pci_addr);
		return 1;
	}
	if (!strncmp(driver, "vfio-pci", 8)) {
		struct spdk_pci_addr pci_addr;

		event->subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_VFIO;
		if (!strncmp(action, "add", 3)) {
			event->action = SPDK_NVME_UEVENT_ADD;
		}
		if (!strncmp(action, "remove", 6)) {
			event->action = SPDK_NVME_UEVENT_REMOVE;
		}
		if (spdk_pci_addr_parse(&pci_addr, vfio_pci_addr) != 0) {
			SPDK_ERRLOG("Invalid format for NVMe BDF: %s\n", vfio_pci_addr);
			return -1;
		}
		spdk_pci_addr_fmt(event->traddr, sizeof(event->traddr), &pci_addr);
		return 1;

	}
	return -1;
}

+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@
#define SPDK_UEVENT_H_

#define SPDK_NVME_UEVENT_SUBSYSTEM_UIO 1
#define SPDK_NVME_UEVENT_SUBSYSTEM_VFIO 2

enum spdk_nvme_uevent_action {
	SPDK_NVME_UEVENT_ADD = 0,