On 11/9/23 10:21 AM, Alexander Motin wrote:
The branch main has been updated by mav:
URL:
https://cgit.FreeBSD.org/src/commit/?id=7c566d6cfc7bfb913bad89d87386fa21dce8c2e6
commit 7c566d6cfc7bfb913bad89d87386fa21dce8c2e6
Author: Alexander Motin <[email protected]>
AuthorDate: 2023-11-09 18:07:46 +0000
Commit: Alexander Motin <[email protected]>
CommitDate: 2023-11-09 18:07:46 +0000
uma: Micro-optimize memory trashing
Use u_long for memory accesses instead of uint32_t. On my tests on
amd64 this by ~30% reduces time spent in those functions thanks to
bigger 64bit accesses. i386 still uses 32bit accesses.
MFC after: 1 month
---
sys/vm/uma_dbg.c | 62 ++++++++++++++++++++++++--------------------------------
1 file changed, 26 insertions(+), 36 deletions(-)
diff --git a/sys/vm/uma_dbg.c b/sys/vm/uma_dbg.c
index 36567f3b3968..76dd2bfde2fe 100644
--- a/sys/vm/uma_dbg.c
+++ b/sys/vm/uma_dbg.c
@@ -64,27 +64,20 @@ static const uint32_t uma_junk = 0xdeadc0de;
int
trash_ctor(void *mem, int size, void *arg, int flags)
{
- int cnt;
- uint32_t *p;
+ u_long *p = mem, *e;
#ifdef DEBUG_MEMGUARD
if (is_memguard_addr(mem))
return (0);
#endif
- cnt = size / sizeof(uma_junk);
-
- for (p = mem; cnt > 0; cnt--, p++)
- if (*p != uma_junk) {
-#ifdef INVARIANTS
- panic("Memory modified after free %p(%d) val=%x @ %p\n",
- mem, size, *p, p);
-#else
- printf("Memory modified after free %p(%d) val=%x @
%p\n",
- mem, size, *p, p);
-#endif
- return (0);
- }
+ e = p + size / sizeof(*p);
+ for (; p < e; p++) {
+ if (__predict_true(*p == uma_junk))
+ continue;
+ panic("Memory modified after free %p(%d) val=%lx @ %p\n",
+ mem, size, *p, p);
+ }
return (0);
For future reference, switching from printf to panic here for the !INVARIANTS
case
is a good change I think, but it was probably worth calling out in the commit
log
(or possibly doing as a separate commit before/after this one).
--
John Baldwin