On 12/8/2014 11:39 AM, Qiu, Michael wrote: > On 12/8/2014 11:00 AM, Neil Horman wrote: >> 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 > We test dpdk upstream now as 1,8 rc2 and rc3 released :) > > I know that what you mean. but lots of please using "hugepage_sz" do you
Sorry, please/places > confirm it will not affect other issue? > > On other hand, we use 32 bit address in 32 bit platform for better > performance(some of places also use uintptr_t for address check and > alignment). > > And it should not acceptable in 32 bit platform to use 64-bit platform > specification affairs(like RTE_PGSIZE_16G). > > Thanks, > Michael > >> >> 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; >> >