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: Cunyin Chang <cunyin.chang@intel.com> Reviewed-on: https://review.gerrithub.io/390580 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
8acb3630d0
commit
f9f445b6a6
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user