From: Keith Sklower Date: Thu, 13 Dec 1990 08:41:13 +0000 (-0800) Subject: update 7.12.1.1 to match 7.20 plus leak-fix from hibler abt X-Git-Tag: BSD-4_3_Reno-Snapshot-Development~62 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/ebde222481a3e288a0ab5758e821fc69d978e085 update 7.12.1.1 to match 7.20 plus leak-fix from hibler abt info returned while blocked in vmemall SCCS-vsn: sys/kern/kern_malloc.c 7.12.1.2 --- diff --git a/usr/src/sys/kern/kern_malloc.c b/usr/src/sys/kern/kern_malloc.c index 28a475f532..bcdee8bac1 100644 --- a/usr/src/sys/kern/kern_malloc.c +++ b/usr/src/sys/kern/kern_malloc.c @@ -4,7 +4,7 @@ * * %sccs.include.redist.c% * - * @(#)kern_malloc.c 7.21 (Berkeley) %G% + * @(#)kern_malloc.c 7.12.1.2 (Berkeley) %G% */ #include "param.h" @@ -21,6 +21,7 @@ struct kmembuckets bucket[MINBUCKET + 16]; struct kmemstats kmemstats[M_LAST]; struct kmemusage *kmemusage; +char *memname[] = INITKMEMNAMES; char *kmembase, *kmemlimit; char *memname[] = INITKMEMNAMES; long malloc_reentered; @@ -40,13 +41,12 @@ malloc(size, type, flags) register struct kmemusage *kup; long indx, npg, alloc, allocsize; int s; - caddr_t va, cp; + caddr_t va, cp, rp; #ifdef KMEMSTATS register struct kmemstats *ksp = &kmemstats[type]; if (((unsigned long)type) > M_LAST) panic("malloc - bogus type"); -#endif indx = BUCKETINDX(size); kbp = &bucket[indx]; @@ -97,9 +97,10 @@ malloc(size, type, flags) kup->ku_freecnt = kbp->kb_elmpercl; kbp->kb_totalfree += kbp->kb_elmpercl; #endif + rp = kbp->kb_next; /* returned while blocked in vmemall */ kbp->kb_next = va + (npg * NBPG) - allocsize; for (cp = kbp->kb_next; cp >= va; cp -= allocsize) { - ((caddr_t *)cp)[2] = (cp > va ? cp - allocsize : NULL); + ((caddr_t *)cp)[2] = (cp > va ? cp - allocsize : rp); if (indx == 7) { long *lp = (long *)cp; lp[0] = lp[1] = lp[3] = lp[4] = -1; @@ -145,6 +146,15 @@ long addrmask[] = { 0x00000000, }; #endif /* DIAGNOSTIC */ +#ifdef DIAGNOSTIC +long addrmask[] = { 0x00000000, + 0x00000001, 0x00000003, 0x00000007, 0x0000000f, + 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, + 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, + 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, +}; +#endif /* DIAGNOSTIC */ + /* * Free a block of memory allocated by malloc. */ @@ -173,6 +183,18 @@ free(addr, type) addr, size, type, alloc); panic("free: unaligned addr"); } +#endif /* DIAGNOSTIC */ + size = 1 << kup->ku_indx; +#ifdef DIAGNOSTIC + if (size > NBPG * CLSIZE) + alloc = addrmask[BUCKETINDX(NBPG * CLSIZE)]; + else + alloc = addrmask[kup->ku_indx]; + if (((u_long)addr & alloc) != 0) { + printf("free: unaligned addr 0x%x, size %d, type %d, mask %d\n", + addr, size, type, alloc); + panic("free: unaligned addr"); + } #endif /* DIAGNOSTIC */ kbp = &bucket[kup->ku_indx]; s = splimp();