pci: avoid inlining functions

Parsing operations should not happen in performance critical sections.
Headers should not propose implementations unless duly required.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
This commit is contained in:
Gaetan Rivet 2017-10-26 12:05:56 +02:00 committed by Thomas Monjalon
parent 7e434f300d
commit cbf10af6de
3 changed files with 78 additions and 63 deletions

View File

@ -87,6 +87,74 @@ static struct rte_devargs *pci_devargs_lookup(struct rte_pci_device *dev)
return NULL;
}
/* Macro used by pci addr parsing functions. **/
#define GET_PCIADDR_FIELD(in, fd, lim, dlm) \
do { \
unsigned long val; \
char *end; \
errno = 0; \
val = strtoul((in), &end, 16); \
if (errno != 0 || end[0] != (dlm) || val > (lim)) \
return -EINVAL; \
(fd) = (typeof (fd))val; \
(in) = end + 1; \
} while(0)
int
eal_parse_pci_BDF(const char *input, struct rte_pci_addr *dev_addr)
{
dev_addr->domain = 0;
GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':');
GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.');
GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0);
return 0;
}
int
eal_parse_pci_DomBDF(const char *input, struct rte_pci_addr *dev_addr)
{
GET_PCIADDR_FIELD(input, dev_addr->domain, UINT16_MAX, ':');
GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':');
GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.');
GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0);
return 0;
}
#undef GET_PCIADDR_FIELD
void
rte_pci_device_name(const struct rte_pci_addr *addr,
char *output, size_t size)
{
RTE_VERIFY(size >= PCI_PRI_STR_SIZE);
RTE_VERIFY(snprintf(output, size, PCI_PRI_FMT,
addr->domain, addr->bus,
addr->devid, addr->function) >= 0);
}
int
rte_eal_compare_pci_addr(const struct rte_pci_addr *addr,
const struct rte_pci_addr *addr2)
{
uint64_t dev_addr, dev_addr2;
if ((addr == NULL) || (addr2 == NULL))
return -1;
dev_addr = ((uint64_t)addr->domain << 24) |
(addr->bus << 16) | (addr->devid << 8) | addr->function;
dev_addr2 = ((uint64_t)addr2->domain << 24) |
(addr2->bus << 16) | (addr2->devid << 8) | addr2->function;
if (dev_addr > dev_addr2)
return 1;
else if (dev_addr < dev_addr2)
return -1;
else
return 0;
}
void
pci_name_set(struct rte_pci_device *dev)
{

View File

@ -240,19 +240,6 @@ struct mapped_pci_resource {
/** mapped pci device list */
TAILQ_HEAD(mapped_pci_res_list, mapped_pci_resource);
/**< Internal use only - Macro used by pci addr parsing functions **/
#define GET_PCIADDR_FIELD(in, fd, lim, dlm) \
do { \
unsigned long val; \
char *end; \
errno = 0; \
val = strtoul((in), &end, 16); \
if (errno != 0 || end[0] != (dlm) || val > (lim)) \
return -EINVAL; \
(fd) = (typeof (fd))val; \
(in) = end + 1; \
} while(0)
/**
* Utility function to produce a PCI Bus-Device-Function value
* given a string representation. Assumes that the BDF is provided without
@ -266,15 +253,7 @@ do { \
* @return
* 0 on success, negative on error.
*/
static inline int
eal_parse_pci_BDF(const char *input, struct rte_pci_addr *dev_addr)
{
dev_addr->domain = 0;
GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':');
GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.');
GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0);
return 0;
}
int eal_parse_pci_BDF(const char *input, struct rte_pci_addr *dev_addr);
/**
* Utility function to produce a PCI Bus-Device-Function value
@ -288,16 +267,7 @@ eal_parse_pci_BDF(const char *input, struct rte_pci_addr *dev_addr)
* @return
* 0 on success, negative on error.
*/
static inline int
eal_parse_pci_DomBDF(const char *input, struct rte_pci_addr *dev_addr)
{
GET_PCIADDR_FIELD(input, dev_addr->domain, UINT16_MAX, ':');
GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':');
GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.');
GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0);
return 0;
}
#undef GET_PCIADDR_FIELD
int eal_parse_pci_DomBDF(const char *input, struct rte_pci_addr *dev_addr);
/**
* Utility function to write a pci device name, this device name can later be
@ -311,17 +281,9 @@ eal_parse_pci_DomBDF(const char *input, struct rte_pci_addr *dev_addr)
* @param size
* The output buffer size
*/
static inline void
rte_pci_device_name(const struct rte_pci_addr *addr,
char *output, size_t size)
{
RTE_VERIFY(size >= PCI_PRI_STR_SIZE);
RTE_VERIFY(snprintf(output, size, PCI_PRI_FMT,
addr->domain, addr->bus,
addr->devid, addr->function) >= 0);
}
void rte_pci_device_name(const struct rte_pci_addr *addr, char *output,
size_t size);
/* Compare two PCI device addresses. */
/**
* Utility function to compare two PCI device addresses.
*
@ -334,27 +296,8 @@ rte_pci_device_name(const struct rte_pci_addr *addr,
* Positive on addr is greater than addr2.
* Negative on addr is less than addr2, or error.
*/
static inline int
rte_eal_compare_pci_addr(const struct rte_pci_addr *addr,
const struct rte_pci_addr *addr2)
{
uint64_t dev_addr, dev_addr2;
if ((addr == NULL) || (addr2 == NULL))
return -1;
dev_addr = ((uint64_t)addr->domain << 24) |
(addr->bus << 16) | (addr->devid << 8) | addr->function;
dev_addr2 = ((uint64_t)addr2->domain << 24) |
(addr2->bus << 16) | (addr2->devid << 8) | addr2->function;
if (dev_addr > dev_addr2)
return 1;
else if (dev_addr < dev_addr2)
return -1;
else
return 0;
}
int rte_eal_compare_pci_addr(const struct rte_pci_addr *addr,
const struct rte_pci_addr *addr2);
/**
* Scan the content of the PCI bus, and the devices in the devices

View File

@ -241,8 +241,11 @@ EXPERIMENTAL {
DPDK_17.11 {
global:
eal_parse_pci_BDF;
eal_parse_pci_DomBDF;
rte_eal_create_uio_dev;
rte_bus_get_iommu_class;
rte_eal_compare_pci_addr;
rte_eal_has_pci;
rte_eal_iova_mode;
rte_eal_mbuf_default_mempool_ops;
@ -250,6 +253,7 @@ DPDK_17.11 {
rte_eal_vfio_intr_mode;
rte_lcore_has_role;
rte_memcpy_ptr;
rte_pci_device_name;
rte_pci_get_iommu_class;
rte_pci_match;
vfio_enable;