X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Flinuxapp%2Feal%2Feal_ivshmem.c;h=2deaeb7305058a9c24264f535886fe49c5eeeb6c;hb=a2348166ea186506d45b61d5073d16ad974e79bb;hp=4ad76a7928d35ab063d4dfb564dabd2562233712;hpb=3031749c2df04a63cdcef186dcce3781e61436e8;p=dpdk.git diff --git a/lib/librte_eal/linuxapp/eal/eal_ivshmem.c b/lib/librte_eal/linuxapp/eal/eal_ivshmem.c index 4ad76a7928..2deaeb7305 100644 --- a/lib/librte_eal/linuxapp/eal/eal_ivshmem.c +++ b/lib/librte_eal/linuxapp/eal/eal_ivshmem.c @@ -50,9 +50,9 @@ #include #include #include +#include #include #include -#include #include "eal_internal_cfg.h" #include "eal_private.h" @@ -61,7 +61,6 @@ #define PCI_DEVICE_ID_IVSHMEM 0x1110 #define IVSHMEM_MAGIC 0x0BADC0DE -#define IVSHMEM_METADATA_SIZE 0x1000 #define IVSHMEM_RESOURCE_PATH "/sys/bus/pci/devices/%04x:%02x:%02x.%x/resource2" #define IVSHMEM_CONFIG_PATH "/var/run/.%s_ivshmem_config" @@ -101,7 +100,7 @@ static int memseg_idx; static int pagesz; /* Tailq heads to add rings to */ -TAILQ_HEAD(rte_ring_list, rte_ring); +TAILQ_HEAD(rte_ring_list, rte_tailq_entry); /* * Utility functions @@ -364,7 +363,7 @@ read_metadata(char * path, int path_len, int fd, uint64_t flen) sizeof(struct rte_ivshmem_metadata_entry)); /* copy path */ - rte_snprintf(ivshmem_config->segment[idx].path, path_len, "%s", path); + snprintf(ivshmem_config->segment[idx].path, path_len, "%s", path); idx++; } @@ -469,7 +468,7 @@ create_shared_config(void) int fd; /* build ivshmem config file path */ - rte_snprintf(path, sizeof(path), IVSHMEM_CONFIG_PATH, + snprintf(path, sizeof(path), IVSHMEM_CONFIG_PATH, internal_config.hugefile_prefix); fd = open(path, O_CREAT | O_RDWR, 0600); @@ -520,7 +519,7 @@ open_shared_config(void) int fd; /* build ivshmem config file path */ - rte_snprintf(path, sizeof(path), IVSHMEM_CONFIG_PATH, + snprintf(path, sizeof(path), IVSHMEM_CONFIG_PATH, internal_config.hugefile_prefix); fd = open(path, O_RDONLY); @@ -754,6 +753,7 @@ rte_eal_ivshmem_obj_init(void) struct ivshmem_segment * seg; struct rte_memzone * mz; struct rte_ring * r; + struct rte_tailq_entry *te; unsigned i, ms, idx; uint64_t offset; @@ -763,8 +763,8 @@ rte_eal_ivshmem_obj_init(void) return 0; /* check that we have an initialised ring tail queue */ - if ((ring_list = - RTE_TAILQ_LOOKUP_BY_IDX(RTE_TAILQ_RING, rte_ring_list)) == NULL) { + ring_list = RTE_TAILQ_LOOKUP(RTE_TAILQ_RING_NAME, rte_ring_list); + if (ring_list == NULL) { RTE_LOG(ERR, EAL, "No rte_ring tailq found!\n"); return -1; } @@ -808,6 +808,8 @@ rte_eal_ivshmem_obj_init(void) mcfg->memzone_idx++; } + rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); + /* find rings */ for (i = 0; i < mcfg->memzone_idx; i++) { mz = &mcfg->memzone[i]; @@ -819,10 +821,19 @@ rte_eal_ivshmem_obj_init(void) r = (struct rte_ring*) (mz->addr_64); - TAILQ_INSERT_TAIL(ring_list, r, next); + te = rte_zmalloc("RING_TAILQ_ENTRY", sizeof(*te), 0); + if (te == NULL) { + RTE_LOG(ERR, EAL, "Cannot allocate ring tailq entry!\n"); + return -1; + } + + te->data = (void *) r; + + TAILQ_INSERT_TAIL(ring_list, te, next); RTE_LOG(DEBUG, EAL, "Found ring: '%s' at %p\n", r->name, mz->addr); } + rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); #ifdef RTE_LIBRTE_IVSHMEM_DEBUG rte_memzone_dump(stdout); @@ -869,7 +880,7 @@ int rte_eal_ivshmem_init(void) continue; /* construct pci device path */ - rte_snprintf(path, sizeof(path), IVSHMEM_RESOURCE_PATH, + snprintf(path, sizeof(path), IVSHMEM_RESOURCE_PATH, dev->addr.domain, dev->addr.bus, dev->addr.devid, dev->addr.function); @@ -916,9 +927,9 @@ int rte_eal_ivshmem_init(void) dev->addr.bus, dev->addr.devid, dev->addr.function); ivshmem_config->pci_devs[ivshmem_config->pci_devs_idx].ioremap_addr = res->phys_addr; - rte_snprintf(ivshmem_config->pci_devs[ivshmem_config->pci_devs_idx].path, + snprintf(ivshmem_config->pci_devs[ivshmem_config->pci_devs_idx].path, sizeof(ivshmem_config->pci_devs[ivshmem_config->pci_devs_idx].path), - path); + "%s", path); ivshmem_config->pci_devs_idx++; }