pci: add option --create-uio-dev to run without hotplug
When the user specifies --create-uio-dev in dpdk eal start options, the DPDK will create the /dev/uioX instead of waiting that a program does it (which is usually hotplug). This option is useful in embedded environments where there is no hotplug to do the work. Signed-off-by: Olivier Matz <olivier.matz@6wind.com> Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
This commit is contained in:
parent
61410438da
commit
f7f97c1604
@ -94,6 +94,7 @@
|
|||||||
#define OPT_SYSLOG "syslog"
|
#define OPT_SYSLOG "syslog"
|
||||||
#define OPT_BASE_VIRTADDR "base-virtaddr"
|
#define OPT_BASE_VIRTADDR "base-virtaddr"
|
||||||
#define OPT_XEN_DOM0 "xen-dom0"
|
#define OPT_XEN_DOM0 "xen-dom0"
|
||||||
|
#define OPT_CREATE_UIO_DEV "create-uio-dev"
|
||||||
|
|
||||||
#define RTE_EAL_BLACKLIST_SIZE 0x100
|
#define RTE_EAL_BLACKLIST_SIZE 0x100
|
||||||
|
|
||||||
@ -355,6 +356,7 @@ eal_usage(const char *prgname)
|
|||||||
" --"OPT_VMWARE_TSC_MAP": use VMware TSC map instead of "
|
" --"OPT_VMWARE_TSC_MAP": use VMware TSC map instead of "
|
||||||
"native RDTSC\n"
|
"native RDTSC\n"
|
||||||
" --"OPT_BASE_VIRTADDR": specify base virtual address\n"
|
" --"OPT_BASE_VIRTADDR": specify base virtual address\n"
|
||||||
|
" --"OPT_CREATE_UIO_DEV": create /dev/uioX (usually done by hotplug)\n"
|
||||||
"\nEAL options for DEBUG use only:\n"
|
"\nEAL options for DEBUG use only:\n"
|
||||||
" --"OPT_NO_HUGE" : use malloc instead of hugetlbfs\n"
|
" --"OPT_NO_HUGE" : use malloc instead of hugetlbfs\n"
|
||||||
" --"OPT_NO_PCI" : disable pci\n"
|
" --"OPT_NO_PCI" : disable pci\n"
|
||||||
@ -638,6 +640,7 @@ eal_parse_args(int argc, char **argv)
|
|||||||
{OPT_SYSLOG, 1, NULL, 0},
|
{OPT_SYSLOG, 1, NULL, 0},
|
||||||
{OPT_BASE_VIRTADDR, 1, 0, 0},
|
{OPT_BASE_VIRTADDR, 1, 0, 0},
|
||||||
{OPT_XEN_DOM0, 0, 0, 0},
|
{OPT_XEN_DOM0, 0, 0, 0},
|
||||||
|
{OPT_CREATE_UIO_DEV, 1, NULL, 0},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
struct shared_driver *solib;
|
struct shared_driver *solib;
|
||||||
@ -797,6 +800,9 @@ eal_parse_args(int argc, char **argv)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (!strcmp(lgopts[option_index].name, OPT_CREATE_UIO_DEV)) {
|
||||||
|
internal_config.create_uio_dev = 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -460,6 +460,47 @@ pci_uio_map_secondary(struct rte_pci_device *dev)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pci_mknod_uio_dev(const char *sysfs_uio_path, unsigned uio_num)
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
char filename[PATH_MAX];
|
||||||
|
int ret;
|
||||||
|
unsigned major, minor;
|
||||||
|
dev_t dev;
|
||||||
|
|
||||||
|
/* get the name of the sysfs file that contains the major and minor
|
||||||
|
* of the uio device and read its content */
|
||||||
|
rte_snprintf(filename, sizeof(filename), "%s/dev", sysfs_uio_path);
|
||||||
|
|
||||||
|
f = fopen(filename, "r");
|
||||||
|
if (f == NULL) {
|
||||||
|
RTE_LOG(ERR, EAL, "%s(): cannot open sysfs to get major:minor\n",
|
||||||
|
__func__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = fscanf(f, "%d:%d", &major, &minor);
|
||||||
|
if (ret != 2) {
|
||||||
|
RTE_LOG(ERR, EAL, "%s(): cannot parse sysfs to get major:minor\n",
|
||||||
|
__func__);
|
||||||
|
fclose(f);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
/* create the char device "mknod /dev/uioX c major minor" */
|
||||||
|
rte_snprintf(filename, sizeof(filename), "/dev/uio%u", uio_num);
|
||||||
|
dev = makedev(major, minor);
|
||||||
|
ret = mknod(filename, S_IFCHR | S_IRUSR | S_IWUSR, dev);
|
||||||
|
if (f == NULL) {
|
||||||
|
RTE_LOG(ERR, EAL, "%s(): mknod() failed %s\n",
|
||||||
|
__func__, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the uioX char device used for a pci device. On success, return
|
* Return the uioX char device used for a pci device. On success, return
|
||||||
* the UIO number and fill dstbuf string with the path of the device in
|
* the UIO number and fill dstbuf string with the path of the device in
|
||||||
@ -529,7 +570,11 @@ static int pci_get_uio_dev(struct rte_pci_device *dev, char *dstbuf,
|
|||||||
if (e == NULL)
|
if (e == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
/* create uio device if we've been asked to */
|
||||||
|
if (internal_config.create_uio_dev && pci_mknod_uio_dev(dstbuf, uio_num) < 0)
|
||||||
|
RTE_LOG(WARNING, EAL, "Cannot create /dev/uio%u\n", uio_num);
|
||||||
|
|
||||||
|
return uio_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* map the PCI resource of a PCI device in virtual memory */
|
/* map the PCI resource of a PCI device in virtual memory */
|
||||||
|
@ -69,6 +69,7 @@ struct internal_config {
|
|||||||
volatile unsigned vmware_tsc_map; /**< true to use VMware TSC mapping
|
volatile unsigned vmware_tsc_map; /**< true to use VMware TSC mapping
|
||||||
* instead of native TSC */
|
* instead of native TSC */
|
||||||
volatile unsigned no_shconf; /**< true if there is no shared config */
|
volatile unsigned no_shconf; /**< true if there is no shared config */
|
||||||
|
volatile unsigned create_uio_dev; /**< true to create /dev/uioX devices */
|
||||||
volatile enum rte_proc_type_t process_type; /**< multi-process proc type */
|
volatile enum rte_proc_type_t process_type; /**< multi-process proc type */
|
||||||
/** true to try allocating memory on specific sockets */
|
/** true to try allocating memory on specific sockets */
|
||||||
volatile unsigned force_sockets;
|
volatile unsigned force_sockets;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user