From de9f4857d085214c15f424b4aa1b1e95c7658549 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Tue, 20 Apr 2021 12:17:53 -0700 Subject: [PATCH] env_dpdk: add allowed_at helpers for PCI hotplug timeout Signed-off-by: Jim Harris Change-Id: I5265f99fc12e134bf156de75de433a739b9ef1ef Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7505 Reviewed-by: Ben Walker Reviewed-by: Changpeng Liu Reviewed-by: Reviewed-by: Shuhei Matsumoto Reviewed-by: Aleksey Marchuk Tested-by: SPDK CI Jenkins --- lib/env_dpdk/pci.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/lib/env_dpdk/pci.c b/lib/env_dpdk/pci.c index 9e67d0c8e..f01717787 100644 --- a/lib/env_dpdk/pci.c +++ b/lib/env_dpdk/pci.c @@ -457,6 +457,18 @@ pci_device_init(struct rte_pci_driver *_drv, return 0; } +static void +set_allowed_at(struct rte_devargs *rte_da, uint64_t tsc) +{ + rte_da->data = (void *)(tsc); +} + +static uint64_t +get_allowed_at(struct rte_devargs *rte_da) +{ + return (uint64_t)rte_da->data; +} + int pci_device_fini(struct rte_pci_device *_dev) { @@ -477,7 +489,7 @@ pci_device_fini(struct rte_pci_device *_dev) /* remove our allowed_at option */ if (_dev->device.devargs) { - _dev->device.devargs->data = NULL; + set_allowed_at(_dev->device.devargs, 0); } assert(!dev->internal.removed); @@ -550,8 +562,8 @@ scan_pci_bus(bool delay_init) rte_dev->device.devargs = da; } - if (da->data) { - uint64_t allowed_at = (uint64_t)(uintptr_t)da->data; + if (get_allowed_at(da)) { + uint64_t allowed_at = get_allowed_at(da); /* this device was seen by spdk before... */ if (da->policy == RTE_DEV_BLOCKED && allowed_at <= now) { @@ -563,10 +575,10 @@ scan_pci_bus(bool delay_init) if (delay_init) { da->policy = RTE_DEV_BLOCKED; - da->data = (void *)(now + 2 * spdk_get_ticks_hz()); + set_allowed_at(da, now + 2 * spdk_get_ticks_hz()); } else { da->policy = RTE_DEV_ALLOWED; - da->data = (void *)(uintptr_t)now; + set_allowed_at(da, now); } } } @@ -647,8 +659,8 @@ spdk_pci_device_attach(struct spdk_pci_driver *driver, rte_dev = dev->dev_handle; da = rte_dev->device.devargs; - if (da && da->data) { - da->data = (void *)(uintptr_t)spdk_get_ticks(); + if (da && get_allowed_at(da)) { + set_allowed_at(da, spdk_get_ticks()); da->policy = RTE_DEV_ALLOWED; }