The contigmem module was using an "int" type for specifying the
size of blocks of memory to be reserved. A 2GB block was therefore
overflowing the signed 32-bit value, making 1GB the largest block
size that could be reserved as a single unit.
The fix is to change the type used for the buffer/block size to
an "int64_t" value.

Signed-off-by: Bruce Richardson <bruce.richardson at intel.com>
---
 lib/librte_eal/bsdapp/contigmem/contigmem.c   | 8 ++++----
 lib/librte_eal/bsdapp/eal/eal_hugepage_info.c | 9 +++++----
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/lib/librte_eal/bsdapp/contigmem/contigmem.c 
b/lib/librte_eal/bsdapp/contigmem/contigmem.c
index b1a23fa..6634daa 100644
--- a/lib/librte_eal/bsdapp/contigmem/contigmem.c
+++ b/lib/librte_eal/bsdapp/contigmem/contigmem.c
@@ -63,20 +63,20 @@ static d_mmap_single_t  contigmem_mmap_single;
 static d_open_t         contigmem_open;

 static int              contigmem_num_buffers = RTE_CONTIGMEM_DEFAULT_NUM_BUFS;
-static int              contigmem_buffer_size = RTE_CONTIGMEM_DEFAULT_BUF_SIZE;
+static int64_t          contigmem_buffer_size = RTE_CONTIGMEM_DEFAULT_BUF_SIZE;

 static eventhandler_tag contigmem_eh_tag;
 static void            *contigmem_buffers[RTE_CONTIGMEM_MAX_NUM_BUFS];
 static struct cdev     *contigmem_cdev = NULL;

 TUNABLE_INT("hw.contigmem.num_buffers", &contigmem_num_buffers);
-TUNABLE_INT("hw.contigmem.buffer_size", &contigmem_buffer_size);
+TUNABLE_QUAD("hw.contigmem.buffer_size", &contigmem_buffer_size);

 static SYSCTL_NODE(_hw, OID_AUTO, contigmem, CTLFLAG_RD, 0, "contigmem");

 SYSCTL_INT(_hw_contigmem, OID_AUTO, num_buffers, CTLFLAG_RD,
        &contigmem_num_buffers, 0, "Number of contigmem buffers allocated");
-SYSCTL_INT(_hw_contigmem, OID_AUTO, buffer_size, CTLFLAG_RD,
+SYSCTL_QUAD(_hw_contigmem, OID_AUTO, buffer_size, CTLFLAG_RD,
        &contigmem_buffer_size, 0, "Size of each contiguous buffer");

 static SYSCTL_NODE(_hw_contigmem, OID_AUTO, physaddr, CTLFLAG_RD, 0,
@@ -133,7 +133,7 @@ contigmem_load()

        if (contigmem_buffer_size < PAGE_SIZE ||
                        (contigmem_buffer_size & (contigmem_buffer_size - 1)) 
!= 0) {
-               printf("buffer size 0x%x is not greater than PAGE_SIZE and "
+               printf("buffer size 0x%lx is not greater than PAGE_SIZE and "
                                "power of two\n", contigmem_buffer_size);
                return (EINVAL);
        }
diff --git a/lib/librte_eal/bsdapp/eal/eal_hugepage_info.c 
b/lib/librte_eal/bsdapp/eal/eal_hugepage_info.c
index 24248fb..8a33c30 100644
--- a/lib/librte_eal/bsdapp/eal/eal_hugepage_info.c
+++ b/lib/librte_eal/bsdapp/eal/eal_hugepage_info.c
@@ -70,7 +70,8 @@ int
 eal_hugepage_info_init(void)
 {
        size_t sysctl_size;
-       int buffer_size, num_buffers, fd, error;
+       int num_buffers, fd, error;
+       int64_t buffer_size;
        /* re-use the linux "internal config" structure for our memory data */
        struct hugepage_info *hpi = &internal_config.hugepage_info[0];
        struct hugepage_info *tmp_hpi;
@@ -101,13 +102,13 @@ eal_hugepage_info_init(void)

        if (buffer_size >= 1<<30)
                RTE_LOG(INFO, EAL, "Contigmem driver has %d buffers, each of 
size %dGB\n",
-                               num_buffers, buffer_size>>30);
+                               num_buffers, (int)(buffer_size>>30));
        else if (buffer_size >= 1<<20)
                RTE_LOG(INFO, EAL, "Contigmem driver has %d buffers, each of 
size %dMB\n",
-                               num_buffers, buffer_size>>20);
+                               num_buffers, (int)(buffer_size>>20));
        else
                RTE_LOG(INFO, EAL, "Contigmem driver has %d buffers, each of 
size %dKB\n",
-                               num_buffers, buffer_size>>10);
+                               num_buffers, (int)(buffer_size>>10));

        internal_config.num_hugepage_sizes = 1;
        hpi->hugedir = CONTIGMEM_DEV;
-- 
2.1.0

Reply via email to