doc: fix spelling reported by aspell in comments
[dpdk.git] / lib / librte_eal / linux / eal / eal_memory.c
index 1b96b57..416dad8 100644 (file)
@@ -50,6 +50,7 @@
 #include "eal_internal_cfg.h"
 #include "eal_filesystem.h"
 #include "eal_hugepages.h"
+#include "eal_options.h"
 
 #define PFN_MASK_SIZE  8
 
@@ -114,7 +115,7 @@ rte_mem_virt2phy(const void *virtaddr)
 
        fd = open("/proc/self/pagemap", O_RDONLY);
        if (fd < 0) {
-               RTE_LOG(ERR, EAL, "%s(): cannot open /proc/self/pagemap: %s\n",
+               RTE_LOG(INFO, EAL, "%s(): cannot open /proc/self/pagemap: %s\n",
                        __func__, strerror(errno));
                return RTE_BAD_IOVA;
        }
@@ -122,7 +123,7 @@ rte_mem_virt2phy(const void *virtaddr)
        virt_pfn = (unsigned long)virtaddr / page_size;
        offset = sizeof(uint64_t) * virt_pfn;
        if (lseek(fd, offset, SEEK_SET) == (off_t) -1) {
-               RTE_LOG(ERR, EAL, "%s(): seek error in /proc/self/pagemap: %s\n",
+               RTE_LOG(INFO, EAL, "%s(): seek error in /proc/self/pagemap: %s\n",
                                __func__, strerror(errno));
                close(fd);
                return RTE_BAD_IOVA;
@@ -131,11 +132,11 @@ rte_mem_virt2phy(const void *virtaddr)
        retval = read(fd, &page, PFN_MASK_SIZE);
        close(fd);
        if (retval < 0) {
-               RTE_LOG(ERR, EAL, "%s(): cannot read /proc/self/pagemap: %s\n",
+               RTE_LOG(INFO, EAL, "%s(): cannot read /proc/self/pagemap: %s\n",
                                __func__, strerror(errno));
                return RTE_BAD_IOVA;
        } else if (retval != PFN_MASK_SIZE) {
-               RTE_LOG(ERR, EAL, "%s(): read %d bytes from /proc/self/pagemap "
+               RTE_LOG(INFO, EAL, "%s(): read %d bytes from /proc/self/pagemap "
                                "but expected %d:\n",
                                __func__, retval, PFN_MASK_SIZE);
                return RTE_BAD_IOVA;
@@ -540,7 +541,7 @@ create_shared_memory(const char *filename, const size_t mem_size)
                return retval;
        }
 
-       fd = open(filename, O_CREAT | O_RDWR, 0666);
+       fd = open(filename, O_CREAT | O_RDWR, 0600);
        if (fd < 0)
                return NULL;
        if (ftruncate(fd, mem_size) < 0) {
@@ -1442,7 +1443,7 @@ eal_legacy_hugepage_init(void)
                if (mcfg->dma_maskbits &&
                    rte_mem_check_dma_mask_thread_unsafe(mcfg->dma_maskbits)) {
                        RTE_LOG(ERR, EAL,
-                               "%s(): couldnt allocate memory due to IOVA exceeding limits of current DMA mask.\n",
+                               "%s(): couldn't allocate memory due to IOVA exceeding limits of current DMA mask.\n",
                                __func__);
                        if (rte_eal_iova_mode() == RTE_IOVA_VA &&
                            rte_eal_using_phys_addrs())
@@ -1784,30 +1785,47 @@ eal_hugepage_init(void)
                        struct rte_memseg **pages;
                        struct hugepage_info *hpi = &used_hp[hp_sz_idx];
                        unsigned int num_pages = hpi->num_pages[socket_id];
-                       int num_pages_alloc, i;
+                       unsigned int num_pages_alloc;
 
                        if (num_pages == 0)
                                continue;
 
-                       pages = malloc(sizeof(*pages) * num_pages);
-
                        RTE_LOG(DEBUG, EAL, "Allocating %u pages of size %" PRIu64 "M on socket %i\n",
                                num_pages, hpi->hugepage_sz >> 20, socket_id);
 
-                       num_pages_alloc = eal_memalloc_alloc_seg_bulk(pages,
-                                       num_pages, hpi->hugepage_sz,
-                                       socket_id, true);
-                       if (num_pages_alloc < 0) {
+                       /* we may not be able to allocate all pages in one go,
+                        * because we break up our memory map into multiple
+                        * memseg lists. therefore, try allocating multiple
+                        * times and see if we can get the desired number of
+                        * pages from multiple allocations.
+                        */
+
+                       num_pages_alloc = 0;
+                       do {
+                               int i, cur_pages, needed;
+
+                               needed = num_pages - num_pages_alloc;
+
+                               pages = malloc(sizeof(*pages) * needed);
+
+                               /* do not request exact number of pages */
+                               cur_pages = eal_memalloc_alloc_seg_bulk(pages,
+                                               needed, hpi->hugepage_sz,
+                                               socket_id, false);
+                               if (cur_pages <= 0) {
+                                       free(pages);
+                                       return -1;
+                               }
+
+                               /* mark preallocated pages as unfreeable */
+                               for (i = 0; i < cur_pages; i++) {
+                                       struct rte_memseg *ms = pages[i];
+                                       ms->flags |= RTE_MEMSEG_FLAG_DO_NOT_FREE;
+                               }
                                free(pages);
-                               return -1;
-                       }
 
-                       /* mark preallocated pages as unfreeable */
-                       for (i = 0; i < num_pages_alloc; i++) {
-                               struct rte_memseg *ms = pages[i];
-                               ms->flags |= RTE_MEMSEG_FLAG_DO_NOT_FREE;
-                       }
-                       free(pages);
+                               num_pages_alloc += cur_pages;
+                       } while (num_pages_alloc != num_pages);
                }
        }
        /* if socket limits were specified, set them */
@@ -2088,7 +2106,8 @@ memseg_primary_init_32(void)
                socket_id = rte_socket_id_by_idx(i);
 
 #ifndef RTE_EAL_NUMA_AWARE_HUGEPAGES
-               if (socket_id > 0)
+               /* we can still sort pages by socket in legacy mode */
+               if (!internal_config.legacy_mem && socket_id > 0)
                        break;
 #endif
 
@@ -2269,7 +2288,8 @@ memseg_primary_init(void)
                        int socket_id = rte_socket_id_by_idx(i);
 
 #ifndef RTE_EAL_NUMA_AWARE_HUGEPAGES
-                       if (socket_id > 0)
+                       /* we can still sort pages by socket in legacy mode */
+                       if (!internal_config.legacy_mem && socket_id > 0)
                                break;
 #endif
                        memtypes[cur_type].page_sz = hugepage_sz;
@@ -2428,6 +2448,13 @@ rte_eal_memseg_init(void)
        } else {
                RTE_LOG(ERR, EAL, "Cannot get current resource limits\n");
        }
+#ifndef RTE_EAL_NUMA_AWARE_HUGEPAGES
+       if (!internal_config.legacy_mem && rte_socket_count() > 1) {
+               RTE_LOG(WARNING, EAL, "DPDK is running on a NUMA system, but is compiled without NUMA support.\n");
+               RTE_LOG(WARNING, EAL, "This will have adverse consequences for performance and usability.\n");
+               RTE_LOG(WARNING, EAL, "Please use --"OPT_LEGACY_MEM" option, or recompile with NUMA support.\n");
+       }
+#endif
 
        return rte_eal_process_type() == RTE_PROC_PRIMARY ?
 #ifndef RTE_ARCH_64