Date: Wed, 5 Dec 2012 18:29:00 GMT From: Brooks Davis <brooks@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 219886 for review Message-ID: <201212051829.qB5IT0Vb078243@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@219886?ac=10 Change 219886 by brooks@brooks_zenith on 2012/12/05 18:28:12 Improve the stub malloc to allocated 32-byte aligned chunks with size data and red zone padding in front of each allocation. ~1% performance improvement. Don't verify the readzones for now. It's slower and there's a bug I've not yet tracked down in the case of files smaller than a page. Affected files ... .. //depot/projects/ctsrd/cheribsd/src/ctsrd/minifile/cheri/malloc.c#2 edit Differences ... ==== //depot/projects/ctsrd/cheribsd/src/ctsrd/minifile/cheri/malloc.c#2 (text+ko) ==== @@ -34,6 +34,19 @@ #include <stdlib.h> #include <string.h> +#define CTASSERT(x) _Static_assert(x, "compile-time assertion failed"); + +static const uint64_t red0 = 0x0123456789ABCDEF; +static const uint64_t red1 = 0xFEDCBA9876543210; + +struct minfo { + uint64_t red0; + size_t size; + size_t rsize; + uint64_t red1; +}; +CTASSERT(sizeof(struct minfo) == 32); + void *_sb_heapbase; size_t _sb_heaplen; @@ -41,13 +54,22 @@ malloc(size_t size) { size_t rsize; + struct minfo *minfo; char *ptr; - rsize = roundup2(size, 4096); - if (_sb_heaplen < rsize) + rsize = roundup2(size, sizeof(minfo)); + if (_sb_heaplen < rsize + sizeof(minfo)) return (NULL); - ptr = _sb_heapbase; + minfo = _sb_heapbase; + *minfo = (struct minfo) { + .red0 = red0, + .size = size, + .rsize = rsize, + .red1 = red1 + }; + _sb_heaplen -= sizeof(minfo); + ptr = (char *)(minfo + 1); _sb_heaplen -= rsize; _sb_heapbase = ptr + rsize; @@ -67,22 +89,42 @@ } void -free(void *ptr __unused) +free(void *ptr) { +#ifdef CHECK_RZ + struct minfo *minfo; + minfo = ptr; + minfo--; + if (minfo->red0 != red0 || minfo->red1 != red1) + abort(); +#endif } void * realloc(void *ptr, size_t size) { char *nptr; + struct minfo *minfo; + + if (ptr == NULL) + return (malloc(size)); + + minfo = ptr; + minfo--; +#ifdef CHECK_RZ + if (minfo->red0 != red0 || minfo->red1 != red1) + abort(); +#endif - if (size <= 4096 && ptr != NULL) + if (size <= minfo->rsize) { + minfo->size = size; return (ptr); + } nptr = malloc(size); - if (nptr != NULL && ptr != NULL) { - memcpy(nptr, ptr, MIN(size, (size_t)nptr - (size_t)ptr)); + if (nptr != NULL) { + memcpy(nptr, ptr, minfo->size); free(ptr); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212051829.qB5IT0Vb078243>