DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] contigmem: zero all pages during mmap
@ 2016-08-15 18:17 Jim Harris
  2016-08-16 12:32 ` Sergio Gonzalez Monroy
  0 siblings, 1 reply; 2+ messages in thread
From: Jim Harris @ 2016-08-15 18:17 UTC (permalink / raw)
  To: dev

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

Reported-by: Daniel Verkamp <daniel.verkamp@intel.com>
Tested-by: Daniel Verkamp <daniel.verkamp@intel.com>
Signed-off-by: Jim Harris <james.r.harris@intel.com>
---
 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);
 

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [dpdk-dev] [PATCH] contigmem: zero all pages during mmap
  2016-08-15 18:17 [dpdk-dev] [PATCH] contigmem: zero all pages during mmap Jim Harris
@ 2016-08-16 12:32 ` Sergio Gonzalez Monroy
  0 siblings, 0 replies; 2+ messages in thread
From: Sergio Gonzalez Monroy @ 2016-08-16 12:32 UTC (permalink / raw)
  To: Jim Harris, dev

On 15/08/2016 19:17, Jim Harris wrote:
> 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
>
> Reported-by: Daniel Verkamp <daniel.verkamp@intel.com>
> Tested-by: Daniel Verkamp <daniel.verkamp@intel.com>
> Signed-off-by: Jim Harris <james.r.harris@intel.com>
> ---
>   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);
>   
>
>

I think you should include the Fixes line:
Fixes: b78c9175118f ("mem: do not zero out memory on zmalloc")

Other than that:

Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-08-16 12:32 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-15 18:17 [dpdk-dev] [PATCH] contigmem: zero all pages during mmap Jim Harris
2016-08-16 12:32 ` Sergio Gonzalez Monroy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).