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);