On Mon, Dec 08, 2014 at 02:46:51AM +0000, Qiu, Michael wrote: > On 12/5/2014 11:25 PM, Neil Horman wrote: > > On Fri, Dec 05, 2014 at 03:02:33PM +0000, Bruce Richardson wrote: > >> On Fri, Dec 05, 2014 at 09:22:05AM -0500, Neil Horman wrote: > >>> On Fri, Dec 05, 2014 at 04:31:47PM +0800, Chao Zhu wrote: > >>>> On 2014/12/4 17:12, Michael Qiu wrote: > >>>>> lib/librte_eal/linuxapp/eal/eal_memory.c:324:4: error: comparison > >>>>> is always false due to limited range of data type [-Werror=type-limits] > >>>>> || (hugepage_sz == RTE_PGSIZE_16G)) { > >>>>> ^ > >>>>> cc1: all warnings being treated as errors > >>>>> > >>>>> lib/librte_eal/linuxapp/eal/eal.c(461): error #2259: non-pointer > >>>>> conversion from "long long" to "void *" may lose significant bits > >>>>> RTE_PTR_ALIGN_CEIL((uintptr_t)addr, RTE_PGSIZE_16M); > >>>>> > >>>>> This was introuduced by commit b77b5639: > >>>>> mem: add huge page sizes for IBM Power > >>>>> > >>>>> The root cause is that size_t and uintptr_t are 32-bit in i686 > >>>>> platform, but RTE_PGSIZE_16M and RTE_PGSIZE_16G are always 64-bit. > >>>>> > >>>>> Define RTE_PGSIZE_16G only in 64 bit platform to avoid > >>>>> this issue. > >>>>> > >>>>> Signed-off-by: Michael Qiu <michael.qiu at intel.com> > >>>>> --- > >>>>> v3 ---> v2 > >>>>> Change RTE_PGSIZE_16G from ULL to UL > >>>>> to keep all entries consistent > >>>>> > >>>>> V2 ---> v1 > >>>>> Change two type entries to one, and > >>>>> leave RTE_PGSIZE_16G only valid for > >>>>> 64-bit platform > >>>>> > >>> NACK, this is the wrong way to fix this problem. Pagesizes are > >>> independent of > >>> architecutre. While a system can't have a hugepage size that exceeds its > >>> virtual address limit, theres no need to do per-architecture special > >>> casing of > >>> page sizes here. Instead of littering the code with ifdef RTE_ARCH_64 > >>> everytime you want to check a page size, just convert the size_t to a > >>> uint64_t > >>> and you can allow all of the enumerated page types on all architecutres, > >>> and > >>> save yourself some ifdeffing in the process. > >>> > >>> Neil > >> While I get your point, I find it distasteful to use a uint64_t for memory > >> sizes, > >> when there is the size_t type defined for that particular purpose. > >> However, I suppose that reducing the number of #ifdefs compared to using > >> the > >> "correct" datatypes for objects is a more practical optino - however > >> distastful > >> I find it. > > size_t isn't defined for memory sizes in the sense that we're using them > > here. > > size_t is meant to address the need for a type to describe object sizes on a > > particular system, and it itself is sized accordingly (32 bits on a 32 bit > > arch, > > 64 on 64), so that you can safely store a size that the system in question > > might > > maximally allocate/return. In this situation we are describing memory sizes > > that might occur no a plurality of arches, and so size_t is inappropriate > > because it as a type is not sized for anything other than the arch it is > > being > > built for. The pragmatic benefits of ennumerating page sizes in a single > > canonical location far outweigh the desire to use a misappropriated type to > > describe them. > > Neil, > > This patch fix two compile issues, and we need to do *dpdk testing > affairs*, if it is blocked in build stage, we can do *nothing* for testing. > > I've get you mind and your concern. But we should take care of changing > the type of "hugepage_sz", because lots of places using it. > > Would you mind if we consider this as hot fix, and we can post a better > fix later(like in dpdk 2.0)? Otherwise all test cycle are blocked. > Honestly, no. Because intels testing schedule shouldn't drive the inclusion of upstream fixes. Also, I'm not asking for a major redesign of anything, I'm asking for a proper fix for a very straightforward problem. I've attached the proper fix below.
Regards Neil diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c index 412b432..31a391c 100644 --- a/lib/librte_eal/common/eal_common_memory.c +++ b/lib/librte_eal/common/eal_common_memory.c @@ -96,7 +96,7 @@ rte_dump_physmem_layout(FILE *f) fprintf(f, "Segment %u: phys:0x%"PRIx64", len:%zu, " "virt:%p, socket_id:%"PRId32", " - "hugepage_sz:%zu, nchannel:%"PRIx32", " + "hugepage_sz:%llu, nchannel:%"PRIx32", " "nrank:%"PRIx32"\n", i, mcfg->memseg[i].phys_addr, mcfg->memseg[i].len, diff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/librte_eal/common/eal_internal_cfg.h index aac6abf..e2ecb0d 100644 --- a/lib/librte_eal/common/eal_internal_cfg.h +++ b/lib/librte_eal/common/eal_internal_cfg.h @@ -49,7 +49,7 @@ * mount points of hugepages */ struct hugepage_info { - size_t hugepage_sz; /**< size of a huge page */ + uint64_t hugepage_sz; /**< size of a huge page */ const char *hugedir; /**< dir where hugetlbfs is mounted */ uint32_t num_pages[RTE_MAX_NUMA_NODES]; /**< number of hugepages of that size on each socket */ diff --git a/lib/librte_eal/common/include/rte_memory.h b/lib/librte_eal/common/include/rte_memory.h index 1990833..7f8103f 100644 --- a/lib/librte_eal/common/include/rte_memory.h +++ b/lib/librte_eal/common/include/rte_memory.h @@ -92,7 +92,7 @@ struct rte_memseg { phys_addr_t ioremap_addr; /**< Real physical address inside the VM */ #endif size_t len; /**< Length of the segment. */ - size_t hugepage_sz; /**< The pagesize of underlying memory */ + uint64_t hugepage_sz; /**< The pagesize of underlying memory */ int32_t socket_id; /**< NUMA socket ID. */ uint32_t nchannel; /**< Number of channels. */ uint32_t nrank; /**< Number of ranks. */ diff --git a/lib/librte_eal/common/include/rte_memzone.h b/lib/librte_eal/common/include/rte_memzone.h index 7d47bff..3006e81 100644 --- a/lib/librte_eal/common/include/rte_memzone.h +++ b/lib/librte_eal/common/include/rte_memzone.h @@ -83,7 +83,7 @@ struct rte_memzone { #endif size_t len; /**< Length of the memzone. */ - size_t hugepage_sz; /**< The page size of underlying memory */ + uint64_t hugepage_sz; /**< The page size of underlying memory */ int32_t socket_id; /**< NUMA socket ID. */ diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c index e6cb919..bae2507 100644 --- a/lib/librte_eal/linuxapp/eal/eal_memory.c +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c @@ -300,7 +300,7 @@ map_all_hugepages(struct hugepage_file *hugepg_tbl, #endif for (i = 0; i < hpi->num_pages[0]; i++) { - size_t hugepage_sz = hpi->hugepage_sz; + uint64_t hugepage_sz = hpi->hugepage_sz; if (orig) { hugepg_tbl[i].file_id = i;