bus/pci: enable write combining during mapping
Write combining (WC) increases NIC performance by making better utilization of PCI bus, but cannot be used by all PMDs. It will be enabled only if RTE_PCI_DRV_WC_ACTIVATE will be set in drivers flags. For proper work also igb_uio driver must be loaded with wc_activate set to 1. When mapping PCI resources, firstly check if it support WC and then try to use it. In case of failure, it will fallback to normal mode. Signed-off-by: Rafal Kozik <rk@semihalf.com> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
This commit is contained in:
parent
1d20a073fa
commit
4a928ef9f6
@ -282,22 +282,19 @@ int
|
|||||||
pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx,
|
pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx,
|
||||||
struct mapped_pci_resource *uio_res, int map_idx)
|
struct mapped_pci_resource *uio_res, int map_idx)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd = -1;
|
||||||
char devname[PATH_MAX];
|
char devname[PATH_MAX];
|
||||||
void *mapaddr;
|
void *mapaddr;
|
||||||
struct rte_pci_addr *loc;
|
struct rte_pci_addr *loc;
|
||||||
struct pci_map *maps;
|
struct pci_map *maps;
|
||||||
|
int wc_activate = 0;
|
||||||
|
|
||||||
|
if (dev->driver != NULL)
|
||||||
|
wc_activate = dev->driver->drv_flags & RTE_PCI_DRV_WC_ACTIVATE;
|
||||||
|
|
||||||
loc = &dev->addr;
|
loc = &dev->addr;
|
||||||
maps = uio_res->maps;
|
maps = uio_res->maps;
|
||||||
|
|
||||||
/* update devname for mmap */
|
|
||||||
snprintf(devname, sizeof(devname),
|
|
||||||
"%s/" PCI_PRI_FMT "/resource%d",
|
|
||||||
rte_pci_get_sysfs_path(),
|
|
||||||
loc->domain, loc->bus, loc->devid,
|
|
||||||
loc->function, res_idx);
|
|
||||||
|
|
||||||
/* allocate memory to keep path */
|
/* allocate memory to keep path */
|
||||||
maps[map_idx].path = rte_malloc(NULL, strlen(devname) + 1, 0);
|
maps[map_idx].path = rte_malloc(NULL, strlen(devname) + 1, 0);
|
||||||
if (maps[map_idx].path == NULL) {
|
if (maps[map_idx].path == NULL) {
|
||||||
@ -309,12 +306,38 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx,
|
|||||||
/*
|
/*
|
||||||
* open resource file, to mmap it
|
* open resource file, to mmap it
|
||||||
*/
|
*/
|
||||||
|
if (wc_activate) {
|
||||||
|
/* update devname for mmap */
|
||||||
|
snprintf(devname, sizeof(devname),
|
||||||
|
"%s/" PCI_PRI_FMT "/resource%d_wc",
|
||||||
|
rte_pci_get_sysfs_path(),
|
||||||
|
loc->domain, loc->bus, loc->devid,
|
||||||
|
loc->function, res_idx);
|
||||||
|
|
||||||
|
if (access(devname, R_OK|W_OK) != -1) {
|
||||||
|
fd = open(devname, O_RDWR);
|
||||||
|
if (fd < 0)
|
||||||
|
RTE_LOG(INFO, EAL, "%s cannot be mapped. "
|
||||||
|
"Fall-back to non prefetchable mode.\n",
|
||||||
|
devname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wc_activate || fd < 0) {
|
||||||
|
snprintf(devname, sizeof(devname),
|
||||||
|
"%s/" PCI_PRI_FMT "/resource%d",
|
||||||
|
rte_pci_get_sysfs_path(),
|
||||||
|
loc->domain, loc->bus, loc->devid,
|
||||||
|
loc->function, res_idx);
|
||||||
|
|
||||||
|
/* then try to map resource file */
|
||||||
fd = open(devname, O_RDWR);
|
fd = open(devname, O_RDWR);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
RTE_LOG(ERR, EAL, "Cannot open %s: %s\n",
|
RTE_LOG(ERR, EAL, "Cannot open %s: %s\n",
|
||||||
devname, strerror(errno));
|
devname, strerror(errno));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* try mapping somewhere close to the end of hugepages */
|
/* try mapping somewhere close to the end of hugepages */
|
||||||
if (pci_map_addr == NULL)
|
if (pci_map_addr == NULL)
|
||||||
|
@ -135,6 +135,8 @@ struct rte_pci_bus {
|
|||||||
|
|
||||||
/** Device needs PCI BAR mapping (done with either IGB_UIO or VFIO) */
|
/** Device needs PCI BAR mapping (done with either IGB_UIO or VFIO) */
|
||||||
#define RTE_PCI_DRV_NEED_MAPPING 0x0001
|
#define RTE_PCI_DRV_NEED_MAPPING 0x0001
|
||||||
|
/** Device needs PCI BAR mapping with enabled write combining (wc) */
|
||||||
|
#define RTE_PCI_DRV_WC_ACTIVATE 0x0002
|
||||||
/** Device driver supports link state interrupt */
|
/** Device driver supports link state interrupt */
|
||||||
#define RTE_PCI_DRV_INTR_LSC 0x0008
|
#define RTE_PCI_DRV_INTR_LSC 0x0008
|
||||||
/** Device driver supports device removal interrupt */
|
/** Device driver supports device removal interrupt */
|
||||||
|
Loading…
Reference in New Issue
Block a user