Module Name: src
Committed By: msaitoh
Date: Tue Dec 10 00:41:30 UTC 2024
Modified Files:
src/sys/arch/arm/arm32: bus_dma.c
Log Message:
arm/bus_dma: Sprinkle error check with __predict_{true,false}.
Sprinkle error check in bus_dmamap_load*() and bus_dmamap_sync() with
__predict_{true,false} to improve performance.
To generate a diff of this commit:
cvs rdiff -u -r1.147 -r1.148 src/sys/arch/arm/arm32/bus_dma.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/arch/arm/arm32/bus_dma.c
diff -u src/sys/arch/arm/arm32/bus_dma.c:1.147 src/sys/arch/arm/arm32/bus_dma.c:1.148
--- src/sys/arch/arm/arm32/bus_dma.c:1.147 Sun Oct 20 15:37:37 2024
+++ src/sys/arch/arm/arm32/bus_dma.c Tue Dec 10 00:41:30 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_dma.c,v 1.147 2024/10/20 15:37:37 skrll Exp $ */
+/* $NetBSD: bus_dma.c,v 1.148 2024/12/10 00:41:30 msaitoh Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2020 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
#include "opt_cputypes.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.147 2024/10/20 15:37:37 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.148 2024/12/10 00:41:30 msaitoh Exp $");
#include <sys/param.h>
@@ -216,7 +216,7 @@ _bus_dmamap_load_paddr(bus_dma_tag_t t,
/* XXX cache last result? */
const struct arm32_dma_range * const dr =
_bus_dma_paddr_inrange(t->_ranges, t->_nranges, paddr);
- if (dr == NULL) {
+ if (__predict_false(dr == NULL)) {
STAT_INCR(inrange_fail);
return EINVAL;
}
@@ -264,7 +264,7 @@ _bus_dmamap_load_paddr(bus_dma_tag_t t,
(segs[nseg - 1].ds_addr & bmask) == (curaddr & bmask))) {
/* coalesce */
segs[nseg - 1].ds_len += sgsize;
- } else if (nseg >= map->_dm_segcnt) {
+ } else if (__predict_false(nseg >= map->_dm_segcnt)) {
return EFBIG;
} else {
/* new segment */
@@ -311,7 +311,7 @@ _bus_dma_load_bouncebuf(bus_dma_tag_t t,
*/
if ((cookie->id_flags & _BUS_DMA_HAS_BOUNCE) == 0) {
error = _bus_dma_alloc_bouncebuf(t, map, buflen, flags);
- if (error)
+ if (__predict_false(error))
return error;
}
@@ -332,7 +332,7 @@ _bus_dma_load_bouncebuf(bus_dma_tag_t t,
cookie->id_origbuflen = buflen;
error = _bus_dmamap_load_buffer(t, map, cookie->id_bouncebuf,
buflen, vm, flags);
- if (error)
+ if (__predict_false(error))
return error;
STAT_INCR(bounced_loads);
@@ -546,7 +546,7 @@ _bus_dmamap_load(bus_dma_tag_t t, bus_dm
"dm_maxsegsz %" PRIuBUSSIZE " _dm_maxmaxsegsz %" PRIuBUSSIZE,
map->dm_maxsegsz, map->_dm_maxmaxsegsz);
- if (buflen > map->_dm_size)
+ if (__predict_false(buflen > map->_dm_size))
return EINVAL;
if (p != NULL) {
@@ -559,7 +559,7 @@ _bus_dmamap_load(bus_dma_tag_t t, bus_dm
map->_dm_flags |= _BUS_DMAMAP_COHERENT;
error = _bus_dmamap_load_buffer(t, map, buf, buflen, vm, flags);
- if (error == 0) {
+ if (__predict_true(error == 0)) {
map->dm_mapsize = buflen;
map->_dm_vmspace = vm;
map->_dm_origbuf = buf;
@@ -622,7 +622,7 @@ _bus_dmamap_load_mbuf(bus_dma_tag_t t, b
KASSERT(m0->m_flags & M_PKTHDR);
- if (m0->m_pkthdr.len > map->_dm_size)
+ if (__predict_false(m0->m_pkthdr.len > map->_dm_size))
return EINVAL;
/* _bus_dmamap_load_paddr() clears this if we're not... */
@@ -641,7 +641,7 @@ _bus_dmamap_load_mbuf(bus_dma_tag_t t, b
/*
* Don't allow reads in read-only mbufs.
*/
- if (M_ROMAP(m) && (flags & BUS_DMA_READ)) {
+ if (__predict_false(M_ROMAP(m) && (flags & BUS_DMA_READ))) {
error = EFAULT;
break;
}
@@ -682,7 +682,7 @@ _bus_dmamap_load_mbuf(bus_dma_tag_t t, b
error = _bus_dmamap_load_paddr(t, map,
paddr, size, false);
- if (error)
+ if (__predict_false(error))
break;
offset = 0;
remainbytes -= size;
@@ -702,7 +702,7 @@ _bus_dmamap_load_mbuf(bus_dma_tag_t t, b
m->m_len, vmspace_kernel(), flags);
}
}
- if (error == 0) {
+ if (__predict_true(error == 0)) {
map->dm_mapsize = m0->m_pkthdr.len;
map->_dm_origbuf = m0;
map->_dm_buftype = _BUS_DMA_BUFTYPE_MBUF;
@@ -766,7 +766,7 @@ _bus_dmamap_load_uio(bus_dma_tag_t t, bu
resid -= minlen;
}
- if (error == 0) {
+ if (__predict_true(error == 0)) {
map->dm_mapsize = uio->uio_resid;
map->_dm_origbuf = uio;
map->_dm_buftype = _BUS_DMA_BUFTYPE_UIO;
@@ -799,7 +799,7 @@ _bus_dmamap_load_raw(bus_dma_tag_t t, bu
map->dm_nsegs = 0;
KASSERT(map->dm_maxsegsz <= map->_dm_maxmaxsegsz);
- if (size0 > map->_dm_size)
+ if (__predict_false(size0 > map->_dm_size))
return EINVAL;
for (i = 0, size = size0; i < nsegs && size > 0; i++) {
@@ -813,12 +813,12 @@ _bus_dmamap_load_raw(bus_dma_tag_t t, bu
(ds->_ds_flags & _BUS_DMAMAP_COHERENT) != 0;
error = _bus_dmamap_load_paddr(t, map, ds->ds_addr,
sgsize, coherent);
- if (error != 0)
+ if (__predict_false(error != 0))
break;
size -= sgsize;
}
- if (error != 0) {
+ if (__predict_false(error != 0)) {
map->dm_mapsize = 0;
map->dm_nsegs = 0;
return error;
@@ -1107,9 +1107,9 @@ _bus_dmamap_sync(bus_dma_tag_t t, bus_dm
/*
* Mixing of PRE and POST operations is not allowed.
*/
- if ((ops & (BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE)) != 0 &&
- (ops & (BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE)) != 0)
- panic("%s: mix PRE and POST", __func__);
+ KASSERTMSG((((ops & (BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE)) == 0)
+ || ((ops & (BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE)) == 0)),
+ "%s: mix PRE and POST", __func__);
KASSERTMSG(offset < map->dm_mapsize,
"offset %" PRIxBUSADDR " mapsize %" PRIuBUSSIZE,
@@ -1675,7 +1675,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t t,
error = _bus_dmamap_load_paddr(t, map, curaddr, sgsize,
coherent);
- if (error)
+ if (__predict_false(error))
return error;
vaddr += sgsize;