From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 74469691A for ; Wed, 17 Aug 2016 00:46:47 +0200 (CEST) Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga102.jf.intel.com with ESMTP; 16 Aug 2016 15:46:46 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,529,1464678000"; d="scan'208";a="866573944" Received: from daijerry-mobl4.amr.corp.intel.com (HELO [127.0.0.1]) ([10.254.35.232]) by orsmga003.jf.intel.com with ESMTP; 16 Aug 2016 15:46:46 -0700 From: Jim Harris To: dev@dpdk.org Date: Tue, 16 Aug 2016 15:46:46 -0700 Message-ID: <20160816224646.1982.50720.stgit@jrharri1-mac> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: [dpdk-dev] [PATCH v2] contigmem: zero all pages during mmap X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Aug 2016 22:46:47 -0000 On Linux, all huge pages are zeroed by the kernel before first access by the DPDK application. But on FreeBSD, the contigmem driver would only zero the contiguous memory regions during initial driver load. DPDK commit b78c91751 eliminated the explicit memset() operation for rte_zmalloc(), which was OK on Linux because the kernel zeroes the pages during app start, but this broke FreeBSD. So this patch explicitly zeroes the pages before they are mmap'd, to ensure equivalent behavior to Linux Fixes: b78c9175118f ("mem: do not zero out memory on zmalloc") Reported-by: Daniel Verkamp Tested-by: Daniel Verkamp Acked-by: Sergio Gonzalez Monroy Signed-off-by: Jim Harris --- lib/librte_eal/bsdapp/contigmem/contigmem.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/librte_eal/bsdapp/contigmem/contigmem.c b/lib/librte_eal/bsdapp/contigmem/contigmem.c index c6ca3b9..da971de 100644 --- a/lib/librte_eal/bsdapp/contigmem/contigmem.c +++ b/lib/librte_eal/bsdapp/contigmem/contigmem.c @@ -216,15 +216,19 @@ static int contigmem_mmap_single(struct cdev *cdev, vm_ooffset_t *offset, vm_size_t size, struct vm_object **obj, int nprot) { + uint64_t buffer_index; + /* * The buffer index is encoded in the offset. Divide the offset by * PAGE_SIZE to get the index of the buffer requested by the user * app. */ - if ((*offset/PAGE_SIZE) >= contigmem_num_buffers) + buffer_index = *offset / PAGE_SIZE; + if (buffer_index >= contigmem_num_buffers) return EINVAL; - *offset = (vm_ooffset_t)vtophys(contigmem_buffers[*offset/PAGE_SIZE]); + memset(contigmem_buffers[buffer_index], 0, contigmem_buffer_size); + *offset = (vm_ooffset_t)vtophys(contigmem_buffers[buffer_index]); *obj = vm_pager_allocate(OBJT_DEVICE, cdev, size, nprot, *offset, curthread->td_ucred);