Module Name:    src
Committed By:   jmcneill
Date:           Thu May 27 10:44:29 UTC 2021

Modified Files:
        src/sys/dev/usb: usb_mem.c

Log Message:
Honour USBMALLOC_ZERO when reusing blocks from the freelist.

>From sc.dying on tech-kern


To generate a diff of this commit:
cvs rdiff -u -r1.80 -r1.81 src/sys/dev/usb/usb_mem.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/usb_mem.c
diff -u src/sys/dev/usb/usb_mem.c:1.80 src/sys/dev/usb/usb_mem.c:1.81
--- src/sys/dev/usb/usb_mem.c:1.80	Tue Jan  5 18:00:21 2021
+++ src/sys/dev/usb/usb_mem.c	Thu May 27 10:44:29 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: usb_mem.c,v 1.80 2021/01/05 18:00:21 skrll Exp $	*/
+/*	$NetBSD: usb_mem.c,v 1.81 2021/05/27 10:44:29 jmcneill Exp $	*/
 
 /*
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb_mem.c,v 1.80 2021/01/05 18:00:21 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb_mem.c,v 1.81 2021/05/27 10:44:29 jmcneill Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -118,8 +118,13 @@ usb_block_allocmem(bus_dma_tag_t tag, si
 	KASSERT(size != 0);
 	KASSERT(mutex_owned(&usb_blk_lock));
 
+#ifdef USB_FRAG_DMA_WORKAROUND
+	flags |= USBMALLOC_ZERO;
+#endif
+
 	bool multiseg = (flags & USBMALLOC_MULTISEG) != 0;
 	bool coherent = (flags & USBMALLOC_COHERENT) != 0;
+	bool zero = (flags & USBMALLOC_ZERO) != 0;
 	u_int dmaflags = coherent ? USB_DMA_COHERENT : 0;
 
 	/* First check the free list. */
@@ -134,6 +139,11 @@ usb_block_allocmem(bus_dma_tag_t tag, si
 			LIST_REMOVE(b, next);
 			usb_blk_nfree--;
 			*dmap = b;
+			if (zero) {
+				memset(b->kaddr, 0, b->size);
+				bus_dmamap_sync(b->tag, b->map, 0, b->size,
+				    BUS_DMASYNC_PREWRITE);
+			}
 			DPRINTFN(6, "free list size=%ju", b->size, 0, 0, 0);
 			return 0;
 		}
@@ -180,10 +190,7 @@ usb_block_allocmem(bus_dma_tag_t tag, si
 
 	*dmap = b;
 
-#ifdef USB_FRAG_DMA_WORKAROUND
-	flags |= USBMALLOC_ZERO;
-#endif
-	if ((flags & USBMALLOC_ZERO) != 0) {
+	if (zero) {
 		memset(b->kaddr, 0, b->size);
 		bus_dmamap_sync(b->tag, b->map, 0, b->size,
 		    BUS_DMASYNC_PREWRITE);

Reply via email to