@@ -55,142 +55,15 @@ parse_sysfs_uuid(const char *filename, rte_uuid_t uu)
return 0;
}
-static int
-get_sysfs_string(const char *filename, char *buf, size_t buflen)
-{
- char *cp;
- FILE *f;
-
- f = fopen(filename, "r");
- if (f == NULL) {
- VMBUS_LOG(ERR, "cannot open sysfs value %s:%s",
- filename, strerror(errno));
- return -1;
- }
-
- if (fgets(buf, buflen, f) == NULL) {
- VMBUS_LOG(ERR, "cannot read sysfs value %s",
- filename);
- fclose(f);
- return -1;
- }
- fclose(f);
-
- /* remove trailing newline */
- cp = memchr(buf, '\n', buflen);
- if (cp)
- *cp = '\0';
-
- return 0;
-}
-
-static int
-vmbus_get_uio_dev(const struct rte_vmbus_device *dev,
- char *dstbuf, size_t buflen)
-{
- char dirname[PATH_MAX];
- unsigned int uio_num;
- struct dirent *e;
- DIR *dir;
-
- /* Assume recent kernel where uio is in uio/uioX */
- snprintf(dirname, sizeof(dirname),
- SYSFS_VMBUS_DEVICES "/%s/uio", dev->device.name);
-
- dir = opendir(dirname);
- if (dir == NULL)
- return -1; /* Not a UIO device */
-
- /* take the first file starting with "uio" */
- while ((e = readdir(dir)) != NULL) {
- const int prefix_len = 3;
- char *endptr;
-
- if (strncmp(e->d_name, "uio", prefix_len) != 0)
- continue;
-
- /* try uio%d */
- errno = 0;
- uio_num = strtoull(e->d_name + prefix_len, &endptr, 10);
- if (errno == 0 && endptr != (e->d_name + prefix_len)) {
- snprintf(dstbuf, buflen, "%s/uio%u", dirname, uio_num);
- break;
- }
- }
- closedir(dir);
-
- if (e == NULL)
- return -1;
-
- return uio_num;
-}
-
-/* Check map names with kernel names */
-static const char *map_names[VMBUS_MAX_RESOURCE] = {
- [HV_TXRX_RING_MAP] = "txrx_rings",
- [HV_INT_PAGE_MAP] = "int_page",
- [HV_MON_PAGE_MAP] = "monitor_page",
- [HV_RECV_BUF_MAP] = "recv:",
- [HV_SEND_BUF_MAP] = "send:",
-};
-
-
/* map the resources of a vmbus device in virtual memory */
int
rte_vmbus_map_device(struct rte_vmbus_device *dev)
{
- char uioname[PATH_MAX], filename[PATH_MAX];
- char dirname[PATH_MAX], mapname[64];
- int i;
-
- dev->uio_num = vmbus_get_uio_dev(dev, uioname, sizeof(uioname));
if (dev->uio_num < 0) {
VMBUS_LOG(DEBUG, "Not managed by UIO driver, skipped");
return 1;
}
- /* Extract resource value */
- for (i = 0; i < VMBUS_MAX_RESOURCE; i++) {
- struct rte_mem_resource *res = &dev->resource[i];
- unsigned long len, gpad = 0;
- char *cp;
-
- snprintf(dirname, sizeof(dirname),
- "%s/maps/map%d", uioname, i);
-
- snprintf(filename, sizeof(filename),
- "%s/name", dirname);
-
- if (get_sysfs_string(filename, mapname, sizeof(mapname)) < 0) {
- VMBUS_LOG(ERR, "could not read %s", filename);
- return -1;
- }
-
- if (strncmp(map_names[i], mapname, strlen(map_names[i])) != 0) {
- VMBUS_LOG(ERR,
- "unexpected resource %s (expected %s)",
- mapname, map_names[i]);
- return -1;
- }
-
- snprintf(filename, sizeof(filename),
- "%s/size", dirname);
- if (eal_parse_sysfs_value(filename, &len) < 0) {
- VMBUS_LOG(ERR,
- "could not read %s", filename);
- return -1;
- }
- res->len = len;
-
- /* both send and receive buffers have gpad in name */
- cp = memchr(mapname, ':', sizeof(mapname));
- if (cp)
- gpad = strtoul(cp+1, NULL, 0);
-
- /* put the GPAD value in physical address */
- res->phys_addr = gpad;
- }
-
return vmbus_uio_map_resource(dev);
}