From b26d0ef3fd31bdc5fab50b2f54fbb57e478d116a Mon Sep 17 00:00:00 2001 From: aCaB Date: Sat, 8 Nov 2008 05:34:25 +0000 Subject: [PATCH] mpool opt git-svn: trunk@4354 --- ChangeLog | 5 + contrib/mpoolparse/mpoolparse.pl | 17 ++ libclamav/mpool.c | 485 ++++++++++++++++--------------- 3 files changed, 270 insertions(+), 237 deletions(-) create mode 100644 contrib/mpoolparse/mpoolparse.pl diff --git a/ChangeLog b/ChangeLog index 09ba733ff..f5408996d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Nov 8 05:27:43 CET 2008 (acab) +----------------------------------- + * libclamav/mpool.c: slightly optimized (we're now faster and more compact + than malloc() - it's just because we cheat more :) + Fri Nov 7 19:37:38 EET 2008 (edwin) ------------------------------------ * clamd/, libclamav/, libclamunrar/, unit_tests/: fix more compiler diff --git a/contrib/mpoolparse/mpoolparse.pl b/contrib/mpoolparse/mpoolparse.pl new file mode 100644 index 000000000..70b1ad892 --- /dev/null +++ b/contrib/mpoolparse/mpoolparse.pl @@ -0,0 +1,17 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +my %frags = (); + +while (<>) { + chomp; + next unless /^LibClamAV Warning: [mc]alloc .* size (\d+) .*$/; + $frags{$1}++; +} + +foreach (sort {$a<=>$b} (keys(%frags))) { + print "$_, /* ($frags{$_}) */\n"; +} + diff --git a/libclamav/mpool.c b/libclamav/mpool.c index cb0aa1bd8..3eb084651 100644 --- a/libclamav/mpool.c +++ b/libclamav/mpool.c @@ -44,9 +44,8 @@ #include #define MPOOLMAGIC 0x5adeada5 -/*#define DEBUGMPOOL /\* DO NOT define *\/ */ +/* #define DEBUGMPOOL /\* DO NOT define *\/ */ #ifdef DEBUGMPOOL -FILE *lfd = NULL; #define spam(...) cli_warnmsg( __VA_ARGS__) #else #define spam @@ -68,85 +67,94 @@ FILE *lfd = NULL; #if SIZEOF_VOID_P==8 static const unsigned int fragsz[] = { -24, /* (33067) */ -32, /* (93970) */ -40, /* (731473) */ -48, /* (35342) */ -56, /* (6967) */ -64, /* (442053) */ -72, /* (2706) */ -80, /* (2281) */ -88, /* (3658) */ -96, /* (2620) */ -104, /* (3705) */ -112, /* (3722) */ -120, /* (4012) */ -128, /* (5161) */ -136, /* (22458) */ -144, /* (4339) */ -152, /* (4315) */ -160, /* (12195) */ -168, /* (18042) */ -/* 176, /\* (341) *\/ */ -/* 184, /\* (329) *\/ */ -192, /* (202) */ -/* 200, /\* (238) *\/ */ -/* 208, /\* (166) *\/ */ -/* 216, /\* (179) *\/ */ -224, /* (216) */ -/* 232, /\* (189) *\/ */ -/* 240, /\* (157) *\/ */ -/* 248, /\* (178) *\/ */ -256, /* (133) */ -/* 264, /\* (157) *\/ */ -/* 272, /\* (140) *\/ */ -/* 280, /\* (161) *\/ */ -/* 288, /\* (125) *\/ */ -/* 296, /\* (141) *\/ */ -304, /* (100) */ -/* 312, /\* (114) *\/ */ -/* 320, /\* (70) *\/ */ -/* 328, /\* (13) *\/ */ -/* 336, /\* (21) *\/ */ -/* 344, /\* (21) *\/ */ -352, /* (13) */ -/* 360, /\* (26) *\/ */ -/* 368, /\* (8) *\/ */ -/* 376, /\* (14) *\/ */ -/* 384, /\* (5) *\/ */ -/* 392, /\* (6) *\/ */ -/* 400, /\* (4) *\/ */ -/* 408, /\* (2) *\/ */ -/* 416, /\* (6) *\/ */ -424, /* (20) */ +16, /* (37189) */ +24, /* (94629) */ +32, /* (756188) */ +40, /* (35658) */ +48, /* (6989) */ +56, /* (454597) */ +64, /* (2736) */ +72, /* (2298) */ +80, /* (3664) */ +88, /* (2636) */ +96, /* (3715) */ +104, /* (3732) */ +112, /* (4021) */ +120, /* (5165) */ +128, /* (22788) */ +136, /* (4343) */ +144, /* (4321) */ +152, /* (12196) */ +160, /* (18044) */ +/* 168, /\* (344) *\/ */ +/* 176, /\* (335) *\/ */ +/* 184, /\* (204) *\/ */ +192, /* (226) */ +/* 200, /\* (185) *\/ */ +/* 208, /\* (181) *\/ */ +/* 216, /\* (217) *\/ */ +224, /* (172) */ +/* 232, /\* (175) *\/ */ +/* 240, /\* (178) *\/ */ +/* 248, /\* (135) *\/ */ +256, /* (140) */ +/* 264, /\* (158) *\/ */ +/* 272, /\* (161) *\/ */ +/* 280, /\* (126) *\/ */ +/* 288, /\* (141) *\/ */ +296, /* (101) */ +/* 304, /\* (97) *\/ */ +/* 312, /\* (85) *\/ */ +/* 320, /\* (14) *\/ */ +/* 328, /\* (21) *\/ */ +336, /* (21) */ +/* 344, /\* (12) *\/ */ +/* 352, /\* (10) *\/ */ +/* 360, /\* (7) *\/ */ +/* 368, /\* (14) *\/ */ +376, /* (21) */ +/* 384, /\* (6) *\/ */ +/* 392, /\* (4) *\/ */ +/* 400, /\* (3) *\/ */ +/* 408, /\* (6) *\/ */ +/* 416, /\* (5) *\/ */ +/* 424, /\* (5) *\/ */ /* 432, /\* (4) *\/ */ -/* 440, /\* (4) *\/ */ -/* 448, /\* (4) *\/ */ -/* 464, /\* (2) *\/ */ -/* 472, /\* (2) *\/ */ -/* 480, /\* (1) *\/ */ -/* 496, /\* (1) *\/ */ -/* 512, /\* (2) *\/ */ -528, /* (15) */ -/* 536, /\* (1) *\/ */ -/* 544, /\* (2) *\/ */ -/* 552, /\* (1) *\/ */ -/* 584, /\* (3) *\/ */ -/* 600, /\* (1) *\/ */ -/* 624, /\* (1) *\/ */ +440, /* (19) */ +/* 456, /\* (2) *\/ */ +/* 464, /\* (8) *\/ */ +/* 472, /\* (3) *\/ */ +/* 488, /\* (1) *\/ */ +/* 496, /\* (4) *\/ */ +/* 504, /\* (3) *\/ */ +/* 512, /\* (1) *\/ */ +/* 520, /\* (2) *\/ */ +/* 528, /\* (6) *\/ */ +/* 536, /\* (3) *\/ */ +544, /* (16) */ +/* 560, /\* (4) *\/ */ +/* 576, /\* (3) *\/ */ +/* 592, /\* (8) *\/ */ +/* 616, /\* (2) *\/ */ +/* 624, /\* (5) *\/ */ +/* 648, /\* (1) *\/ */ /* 656, /\* (1) *\/ */ -/* 784, /\* (2) *\/ */ -1040, /* (15) */ -/* 2064, /\* (7456) *\/ */ -2072, /* (14) */ -4112, /* (14) */ -8208, /* (9) */ -16400, /* (6) */ -32784, /* (4) */ -63512, /* (7) */ -134408, /* (2) */ -507984, /* (7) */ -1051040, /* (1) */ +/* 680, /\* (1) *\/ */ +/* 704, /\* (1) *\/ */ +/* 720, /\* (1) *\/ */ +/* 776, /\* (2) *\/ */ +1056, /* (15) */ +2056, /* (7585) */ +/* 2064, /\* (14) *\/ */ +2088, /* (14) */ +4128, /* (14) */ +8224, /* (9) */ +16416, /* (6) */ +32800, /* (4) */ +63504, /* (7) */ +136352, /* (1) */ +507976, /* (7) */ +1051032, /* (1) */ 2097152 /* ^^ This shouldn't be reached but it's a good fall back * MAX_ALLOCATION is 184549376 but that's really not need here */ @@ -155,150 +163,149 @@ static const unsigned int fragsz[] = { #else static const unsigned int fragsz[] = { -12, /* (2297) */ -16, /* (30785) */ -20, /* (41460) */ -24, /* (69214) */ -28, /* (639488) */ -32, /* (107920) */ -36, /* (454213) */ -40, /* (11497) */ -44, /* (1688) */ -48, /* (5294) */ -52, /* (1496) */ -56, /* (3738) */ -60, /* (1719) */ -64, /* (918) */ -68, /* (956) */ -72, /* (1324) */ -76, /* (1905) */ -80, /* (1745) */ -84, /* (1053) */ -88, /* (1566) */ -92, /* (2081) */ -96, /* (20851) */ -100, /* (1882) */ -104, /* (1848) */ -108, /* (1931) */ -112, /* (2079) */ -116, /* (1736) */ -120, /* (3425) */ -124, /* (2115) */ -128, /* (1298) */ -132, /* (2307) */ -136, /* (2033) */ -140, /* (2837) */ -144, /* (1479) */ -148, /* (1607) */ -152, /* (10587) */ -156, /* (2719) */ -160, /* (15311) */ -164, /* (196) */ -168, /* (145) */ -172, /* (211) */ -176, /* (140) */ -180, /* (116) */ -/* 184, /\* (86) *\/ */ -188, /* (119) */ -192, /* (104) */ -/* 196, /\* (99) *\/ */ -/* 200, /\* (84) *\/ */ -/* 204, /\* (94) *\/ */ -/* 208, /\* (86) *\/ */ -212, /* (136) */ -/* 216, /\* (80) *\/ */ -/* 220, /\* (75) *\/ */ -/* 224, /\* (97) *\/ */ -/* 228, /\* (99) *\/ */ -/* 232, /\* (74) *\/ */ -236, /* (114) */ -/* 240, /\* (64) *\/ */ -/* 244, /\* (73) *\/ */ -/* 248, /\* (62) *\/ */ -/* 252, /\* (71) *\/ */ -/* 256, /\* (69) *\/ */ -/* 260, /\* (85) *\/ */ -/* 264, /\* (71) *\/ */ -268, /* (92) */ -/* 272, /\* (69) *\/ */ -/* 276, /\* (56) *\/ */ -/* 280, /\* (69) *\/ */ -/* 284, /\* (71) *\/ */ -/* 288, /\* (70) *\/ */ -/* 292, /\* (62) *\/ */ -/* 296, /\* (39) *\/ */ -/* 300, /\* (54) *\/ */ -/* 304, /\* (43) *\/ */ -/* 308, /\* (54) *\/ */ -312, /* (30) */ -/* 316, /\* (8) *\/ */ -/* 320, /\* (5) *\/ */ -/* 324, /\* (7) *\/ */ -/* 328, /\* (14) *\/ */ -/* 332, /\* (13) *\/ */ -/* 336, /\* (8) *\/ */ -/* 340, /\* (7) *\/ */ -/* 344, /\* (6) *\/ */ -/* 348, /\* (2) *\/ */ -/* 352, /\* (7) *\/ */ -/* 356, /\* (18) *\/ */ -/* 360, /\* (5) *\/ */ -364, /* (12) */ -/* 368, /\* (2) *\/ */ -/* 372, /\* (4) *\/ */ -/* 376, /\* (2) *\/ */ -/* 380, /\* (5) *\/ */ -/* 384, /\* (1) *\/ */ -/* 392, /\* (4) *\/ */ -/* 396, /\* (3) *\/ */ -/* 404, /\* (4) *\/ */ -/* 408, /\* (2) *\/ */ -/* 412, /\* (3) *\/ */ -/* 416, /\* (2) *\/ */ -/* 420, /\* (3) *\/ */ -/* 424, /\* (2) *\/ */ -428, /* (16) */ -/* 432, /\* (4) *\/ */ -/* 436, /\* (1) *\/ */ -/* 440, /\* (3) *\/ */ -/* 452, /\* (1) *\/ */ -/* 456, /\* (2) *\/ */ -/* 460, /\* (8) *\/ */ -/* 468, /\* (1) *\/ */ -/* 472, /\* (2) *\/ */ -/* 484, /\* (1) *\/ */ -/* 492, /\* (4) *\/ */ -/* 500, /\* (1) *\/ */ -/* 504, /\* (2) *\/ */ -/* 508, /\* (1) *\/ */ -/* 516, /\* (2) *\/ */ -/* 524, /\* (5) *\/ */ -532, /* (15) */ -/* 536, /\* (3) *\/ */ -/* 540, /\* (1) *\/ */ -/* 556, /\* (4) *\/ */ -/* 576, /\* (3) *\/ */ -/* 588, /\* (8) *\/ */ +8, /* (6381) */ +12, /* (30903) */ +16, /* (41616) */ +20, /* (69507) */ +24, /* (646497) */ +28, /* (108677) */ +32, /* (458074) */ +36, /* (11537) */ +40, /* (1690) */ +44, /* (5326) */ +48, /* (1505) */ +52, /* (3777) */ +56, /* (1730) */ +60, /* (943) */ +64, /* (963) */ +68, /* (1345) */ +72, /* (1909) */ +76, /* (1765) */ +80, /* (1060) */ +84, /* (1586) */ +88, /* (2082) */ +92, /* (21009) */ +96, /* (1886) */ +100, /* (1869) */ +104, /* (1936) */ +108, /* (2097) */ +112, /* (1736) */ +116, /* (3442) */ +120, /* (2117) */ +124, /* (1317) */ +128, /* (2307) */ +132, /* (2051) */ +136, /* (2839) */ +140, /* (1497) */ +144, /* (1607) */ +148, /* (10604) */ +152, /* (2719) */ +156, /* (15328) */ +160, /* (197) */ +/* 164, /\* (161) *\/ */ +/* 168, /\* (195) *\/ */ +172, /* (156) */ +/* 176, /\* (132) *\/ */ +/* 180, /\* (86) *\/ */ +/* 184, /\* (120) *\/ */ +188, /* (122) */ +/* 192, /\* (84) *\/ */ +/* 196, /\* (84) *\/ */ +/* 200, /\* (95) *\/ */ +/* 204, /\* (86) *\/ */ +208, /* (137) */ +/* 212, /\* (95) *\/ */ +/* 216, /\* (75) *\/ */ +/* 220, /\* (97) *\/ */ +/* 224, /\* (84) *\/ */ +/* 228, /\* (74) *\/ */ +232, /* (114) */ +/* 236, /\* (79) *\/ */ +/* 240, /\* (73) *\/ */ +/* 244, /\* (62) *\/ */ +/* 248, /\* (71) *\/ */ +/* 252, /\* (69) *\/ */ +256, /* (70) */ +/* 260, /\* (86) *\/ */ +/* 264, /\* (92) *\/ */ +/* 268, /\* (69) *\/ */ +/* 272, /\* (56) *\/ */ +/* 276, /\* (70) *\/ */ +280, /* (71) */ +/* 284, /\* (70) *\/ */ +/* 288, /\* (62) *\/ */ +/* 292, /\* (54) *\/ */ +/* 296, /\* (54) *\/ */ +/* 300, /\* (43) *\/ */ +/* 304, /\* (39) *\/ */ +308, /* (30) */ +/* 312, /\* (9) *\/ */ +/* 316, /\* (5) *\/ */ +/* 320, /\* (7) *\/ */ +/* 324, /\* (14) *\/ */ +/* 328, /\* (13) *\/ */ +332, /* (23) */ +/* 336, /\* (6) *\/ */ +/* 340, /\* (6) *\/ */ +/* 344, /\* (3) *\/ */ +/* 348, /\* (7) *\/ */ +/* 352, /\* (3) *\/ */ +/* 356, /\* (4) *\/ */ +/* 360, /\* (12) *\/ */ +/* 364, /\* (2) *\/ */ +/* 368, /\* (3) *\/ */ +372, /* (17) */ +/* 376, /\* (5) *\/ */ +/* 380, /\* (1) *\/ */ +/* 388, /\* (4) *\/ */ +/* 392, /\* (3) *\/ */ +/* 400, /\* (4) *\/ */ +/* 404, /\* (2) *\/ */ +/* 408, /\* (3) *\/ */ +/* 412, /\* (2) *\/ */ +/* 416, /\* (3) *\/ */ +/* 420, /\* (2) *\/ */ +/* 428, /\* (4) *\/ */ +/* 432, /\* (1) *\/ */ +436, /* (18) */ +/* 452, /\* (2) *\/ */ +/* 456, /\* (8) *\/ */ +/* 464, /\* (1) *\/ */ +/* 468, /\* (2) *\/ */ +/* 480, /\* (1) *\/ */ +/* 488, /\* (4) *\/ */ +/* 496, /\* (1) *\/ */ +/* 500, /\* (2) *\/ */ +/* 504, /\* (1) *\/ */ +/* 512, /\* (2) *\/ */ +/* 520, /\* (6) *\/ */ +/* 532, /\* (3) *\/ */ +/* 536, /\* (1) *\/ */ +540, /* (15) */ +/* 552, /\* (4) *\/ */ +/* 572, /\* (3) *\/ */ +/* 584, /\* (7) *\/ */ +/* 588, /\* (1) *\/ */ +/* 608, /\* (1) *\/ */ /* 612, /\* (1) *\/ */ -/* 616, /\* (1) *\/ */ -/* 620, /\* (5) *\/ */ +/* 616, /\* (5) *\/ */ +/* 644, /\* (1) *\/ */ /* 648, /\* (1) *\/ */ -/* 652, /\* (1) *\/ */ -/* 680, /\* (1) *\/ */ -/* 704, /\* (1) *\/ */ -/* 716, /\* (1) *\/ */ +/* 676, /\* (1) *\/ */ +/* 700, /\* (1) *\/ */ +/* 712, /\* (1) *\/ */ +/* 768, /\* (1) *\/ */ /* 772, /\* (1) *\/ */ -/* 776, /\* (1) *\/ */ -1032, /* (7549) */ -/* 1044, /\* (14) *\/ */ -2076, /* (14) */ -4116, /* (9) */ -8212, /* (6) */ -16404, /* (4) */ -63504, /* (7) */ -135636, /* (2) */ -253992, /* (7) */ -1050864, /* (1) */ +1028, /* (7585) */ +1032, /* (14) */ +2084, /* (14) */ +4124, /* (9) */ +8220, /* (6) */ +16412, /* (4) */ +63500, /* (7) */ +136348, /* (1) */ +253988, /* (7) */ +1050860, /* (1) */ 2097152 }; #endif @@ -317,8 +324,10 @@ struct MP { }; struct FRAG { - struct FRAG *next; - unsigned int sbits; + union { + struct FRAG *next; + unsigned int sbits; + } u; #ifdef CL_DEBUG unsigned int magic; #endif @@ -349,9 +358,6 @@ struct MP *mp_create() { unsigned int sz; memset(&mp, 0, sizeof(mp)); mp.psize = getpagesize(); -#ifdef DEBUGMPOOL - lfd = fopen("mmpool_log", "w"); -#endif sz = align_to_pagesize(&mp, MIN_FRAGSIZE); mp.mpm.usize = align_to_voidptr(sizeof(struct MPMAP)); mp.mpm.size = sz - align_to_voidptr(sizeof(mp)); @@ -425,7 +431,8 @@ void *mp_malloc(struct MP *mp, size_t size) { /* Case 1: We have a free'd frag */ if((f = mp->avail[sbits])) { spam("malloc %p size %u (freed)\n", f, mp_roundup(size)); - mp->avail[sbits] = f->next; + mp->avail[sbits] = f->u.next; + f->u.sbits = sbits; #ifdef CL_DEBUG f->magic = MPOOLMAGIC; #endif @@ -443,7 +450,7 @@ void *mp_malloc(struct MP *mp, size_t size) { f = (struct FRAG *)((void *)mpm + mpm->usize); spam("malloc %p size %u (hole)\n", f, mp_roundup(size)); mpm->usize += needed; - f->sbits = sbits; + f->u.sbits = sbits; #ifdef CL_DEBUG f->magic = MPOOLMAGIC; #endif @@ -469,7 +476,7 @@ void *mp_malloc(struct MP *mp, size_t size) { mp->mpm.next = mpm; f = (struct FRAG *)((void *)mpm + align_to_voidptr(sizeof(*mpm))); spam("malloc %p size %u (new map)\n", f, mp_roundup(size)); - f->sbits = sbits; + f->u.sbits = sbits; #ifdef CL_DEBUG f->magic = MPOOLMAGIC; #endif @@ -478,14 +485,16 @@ void *mp_malloc(struct MP *mp, size_t size) { void mp_free(struct MP *mp, void *ptr) { struct FRAG *f = (struct FRAG *)(ptr - FRAG_OVERHEAD); + unsigned int sbits; if (!ptr) return; #ifdef CL_DEBUG assert(f->magic == MPOOLMAGIC && "Attempt to mp_free a pointer we did not allocate!"); #endif - f->next = mp->avail[f->sbits]; - mp->avail[f->sbits] = f; + sbits = f->u.sbits; + f->u.next = mp->avail[sbits]; + mp->avail[sbits] = f; spam("free @ %p\n", f); } @@ -501,17 +510,18 @@ void *mp_calloc(struct MP *mp, size_t nmemb, size_t size) { void *mp_realloc(struct MP *mp, void *ptr, size_t size) { struct FRAG *f = (struct FRAG *)(ptr - FRAG_OVERHEAD); - unsigned int csize; + unsigned int csize, sbits; void *new_ptr; if (!ptr) return mp_malloc(mp, size); - spam("realloc @ %p (size %u -> %u))\n", f, from_bits(f->sbits), size); - if(!size || !(csize = from_bits(f->sbits))) { + spam("realloc @ %p (size %u -> %u))\n", f, from_bits(f->u.sbits), size); + if(!size || !(csize = from_bits(f->u.sbits))) { cli_errmsg("mp_realloc(): Attempt to allocate %lu bytes. Please report to http://bugs.clamav.net\n", (unsigned long int) size); return NULL; } csize -= FRAG_OVERHEAD; - if (csize >= size) return ptr; + if (csize >= size && (!f->u.sbits || from_bits(f->u.sbits-1)-FRAG_OVERHEAD < size)) + return ptr; if (!(new_ptr = mp_malloc(mp, size))) return NULL; memcpy(new_ptr, ptr, csize); @@ -525,14 +535,15 @@ void *mp_realloc2(struct MP *mp, void *ptr, size_t size) { void *new_ptr; if (!ptr) return mp_malloc(mp, size); - spam("realloc @ %p (size %u -> %u))\n", f, from_bits(f->sbits), size); - if(!size || !(csize = from_bits(f->sbits))) { + spam("realloc @ %p (size %u -> %u))\n", f, from_bits(f->u.sbits), size); + if(!size || !(csize = from_bits(f->u.sbits))) { cli_errmsg("mp_realloc2(): Attempt to allocate %lu bytes. Please report to http://bugs.clamav.net\n", (unsigned long int) size); mp_free(mp, ptr); return NULL; } csize -= FRAG_OVERHEAD; - if (csize >= size) return ptr; + if (csize >= size && (!f->u.sbits || from_bits(f->u.sbits-1)-FRAG_OVERHEAD < size)) + return ptr; if ((new_ptr = mp_malloc(mp, size))) memcpy(new_ptr, ptr, csize); mp_free(mp, ptr);