Browse code

tuned granularity - amd64 only (for now) - VIRT 114 / RES 95

git-svn-id: file:///var/lib/svn/clamav-devel/branches/mpool@4300 77e5149b-7576-45b1-b177-96237e5ba77b

aCaB authored on 2008/10/29 05:57:54
Showing 2 changed files
... ...
@@ -39,7 +39,7 @@
39 39
 #include <stddef.h>
40 40
 
41 41
 
42
-/* #define DEBUGMPOOL */
42
+#define DEBUGMPOOL
43 43
 #ifdef DEBUGMPOOL
44 44
 #include <stdio.h>
45 45
 FILE *lfd = NULL;
... ...
@@ -50,16 +50,16 @@ FILE *lfd = NULL;
50 50
 
51 51
 #include "mpool.h"
52 52
 
53
-//#define MIN_FRAGSIZE 4096	/* 1m2.282s */
54
-//#define MIN_FRAGSIZE 8192	/* 0m46.652s */
55
-//#define MIN_FRAGSIZE 16384	/* 0m8.365s */
56
-//#define MIN_FRAGSIZE 32768	/* 0m3.788s */
57
-//#define MIN_FRAGSIZE 65536	/* 0m2.759s */
58
-//#define MIN_FRAGSIZE 131072	/* 0m2.445s */
53
+/* #define MIN_FRAGSIZE 4096	/\* 1m2.282s *\/ */
54
+/* #define MIN_FRAGSIZE 8192	/\* 0m46.652s *\/ */
55
+/* #define MIN_FRAGSIZE 16384	/\* 0m8.365s *\/ */
56
+/* #define MIN_FRAGSIZE 32768	/\* 0m3.788s *\/ */
57
+/* #define MIN_FRAGSIZE 65536	/\* 0m2.759s *\/ */
58
+/* #define MIN_FRAGSIZE 131072	/\* 0m2.445s *\/ */
59 59
 #define MIN_FRAGSIZE 262144	/* 0m2.343s */
60
-//#define MIN_FRAGSIZE 524288	/* 0m2.387s */
61
-//#define MIN_FRAGSIZE 1048576	/* 0m2.392s */
62
-//#define MIN_FRAGSIZE 2097152	/* 0m2.402s */
60
+/* #define MIN_FRAGSIZE 524288	/\* 0m2.387s *\/ */
61
+/* #define MIN_FRAGSIZE 1048576	/\* 0m2.392s *\/ */
62
+/* #define MIN_FRAGSIZE 2097152	/\* 0m2.402s *\/ */
63 63
 
64 64
 
65 65
 struct FRAG {
... ...
@@ -69,37 +69,44 @@ struct FRAG {
69 69
 };
70 70
 #define FRAG_OVERHEAD (offsetof(struct FRAG, fake))
71 71
 
72
+#define align_to_voidptr(size) (((size) / sizeof(void *) + ((size) % sizeof(void *) != 0)) * sizeof(void *))
73
+#define roundup(size) (FRAG_OVERHEAD + align_to_voidptr(size))
72 74
 
73 75
 static unsigned int align_to_pagesize(struct MP *mp, unsigned int size) {
74 76
   return (size / mp->psize + (size % mp->psize != 0)) * mp->psize;
75 77
 }
76
-static unsigned int align_to_voidptr(unsigned int size) {
77
-  return (size / sizeof(void *) + (size % sizeof(void *) != 0)) * sizeof(void *);
78
-}
79 78
 
80
-/* FIXME: use instead a bit2size table so we can spare bits and offer a better granularity */
81 79
 static unsigned int to_bits(unsigned int size) {
82 80
   unsigned int i;
83
-  for(i=0; i<32; i++)
84
-    if((unsigned int)1<<i >= size) return i;
81
+  for(i=0; i<FRAGSBITS; i++)
82
+    if(fragsz[i] >= size) return i;
85 83
   return i; /* NOTREACHED */
86 84
 }
87 85
 static unsigned int from_bits(unsigned int bits) {
88
-  return 1<<bits;
86
+  return fragsz[bits];
89 87
 }
88
+/* static unsigned int to_bits(unsigned int size) { */
89
+/*   unsigned int i; */
90
+/*   for(i=0; i<32; i++) */
91
+/*     if((unsigned int)1<<i >= size) return i; */
92
+/*   return i; /\* NOTREACHED *\/ */
93
+/* } */
94
+/* static unsigned int from_bits(unsigned int bits) { */
95
+/*   return 1<<bits; */
96
+/* } */
90 97
 
91 98
 struct MP *mp_create() {
92 99
   struct MP mp, *mp_p;
100
+  unsigned int sz;
93 101
   memset(&mp, 0, sizeof(mp));
94 102
   mp.psize = getpagesize();
95 103
 #ifdef DEBUGMPOOL
96 104
   lfd = fopen("mmpool_log", "w");
97 105
 #endif
98
-  mp.fd = open("/dev/zero", O_RDWR, 0);
99
-  mp.top = align_to_pagesize(&mp, MIN_FRAGSIZE + 0*sizeof(mp));
106
+  sz = align_to_pagesize(&mp, MIN_FRAGSIZE);
100 107
   mp.mpm.usize = align_to_voidptr(sizeof(struct MPMAP));
101
-  mp.mpm.size = mp.top - align_to_voidptr(sizeof(mp));
102
-  if ((mp_p = (struct MP *)mmap(NULL, mp.top, PROT_READ | PROT_WRITE, MAP_PRIVATE, mp.fd, 0)) == MAP_FAILED)
108
+  mp.mpm.size = sz - align_to_voidptr(sizeof(mp));
109
+  if ((mp_p = (struct MP *)mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)) == MAP_FAILED)
103 110
     return NULL;
104 111
   memcpy(mp_p, &mp, sizeof(mp));
105 112
   spam("Map created @ %p->%p - size %u out of %u\n", mp_p, (void*)mp_p + mp.mpm.size, mp.mpm.usize, mp.mpm.size);
... ...
@@ -108,7 +115,6 @@ struct MP *mp_create() {
108 108
 
109 109
 void mp_destroy(struct MP *mp) {
110 110
   struct MPMAP *mpm_next = mp->mpm.next, *mpm;
111
-  close(mp->fd);
112 111
   while((mpm = mpm_next)) {
113 112
     mpm_next = mpm->next;
114 113
     munmap((void *)mpm, mpm->size);
... ...
@@ -148,19 +154,21 @@ void *mp_malloc(struct MP *mp, size_t size) {
148 148
   struct FRAG *f = NULL;
149 149
   struct MPMAP *mpm = &mp->mpm;
150 150
 
151
-  //  check_all(mp);
151
+  /*  check_all(mp); */
152 152
   if (!size) return NULL;
153 153
 
154 154
   j = sbits+2;
155 155
   if (j<7) j = 7;
156 156
   if (j > 32) j = 32;
157 157
 
158
+  j=sbits;
159
+
158 160
   for (i=sbits; i<j; i++)
159 161
     if((f = mp->avail[i])) break;
160 162
 
161 163
   /* Case 1: We have a free'd frag */
162 164
   if(f) {
163
-    spam("malloc %p size %u (freed)\n"), f, size;
165
+    spam("malloc %p size %u (freed)\n", f, roundup(size));
164 166
     mp->avail[i] = f->next;
165 167
     return &f->fake;
166 168
   }
... ...
@@ -171,7 +179,7 @@ void *mp_malloc(struct MP *mp, size_t size) {
171 171
   while(mpm) {
172 172
     if(mpm->size - mpm->usize >= needed) {
173 173
       f = (struct FRAG *)((void *)mpm + mpm->usize);
174
-      spam("malloc %p size %u (hole)\n", f, size);
174
+      spam("malloc %p size %u (hole)\n", f, roundup(size));
175 175
       mpm->usize += needed;
176 176
       f->sbits = sbits;
177 177
       return &f->fake;
... ...
@@ -185,17 +193,16 @@ void *mp_malloc(struct MP *mp, size_t size) {
185 185
   else
186 186
   i = align_to_pagesize(mp, MIN_FRAGSIZE);
187 187
   
188
-  if ((mpm = (struct MPMAP *)mmap(NULL, i, PROT_READ | PROT_WRITE, MAP_PRIVATE, mp->fd, mp->top)) == MAP_FAILED) {
188
+  if ((mpm = (struct MPMAP *)mmap(NULL, i, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)) == MAP_FAILED) {
189 189
     spam("failed to alloc %u bytes (%u requested)\n", i, size);
190 190
     return NULL;
191 191
   }
192
-  mp->top += i;
193 192
   mpm->size = i;
194 193
   mpm->usize = needed + align_to_voidptr(sizeof(*mpm));
195 194
   mpm->next = mp->mpm.next;
196 195
   mp->mpm.next = mpm;
197 196
   f = (struct FRAG *)((void *)mpm + align_to_voidptr(sizeof(*mpm)));
198
-  spam("malloc %p size %u (new map)\n", f, size);
197
+  spam("malloc %p size %u (new map)\n", f, roundup(size));
199 198
   f->sbits = sbits;
200 199
   return &f->fake;
201 200
 }
... ...
@@ -22,6 +22,92 @@
22 22
 #define MPOOL_H
23 23
 
24 24
 #ifdef USE_MPOOL
25
+
26
+static const unsigned int fragsz[] = {
27
+24, /* (33067) */
28
+32, /* (93876) */
29
+40, /* (731459) */
30
+48, /* (35286) */
31
+56, /* (6930) */
32
+64, /* (442013) */
33
+72, /* (2706) */
34
+80, /* (2252) */
35
+88, /* (3631) */
36
+96, /* (2594) */
37
+104, /* (3679) */
38
+112, /* (3697) */
39
+120, /* (3991) */
40
+128, /* (5141) */
41
+136, /* (22458) */
42
+144, /* (4320) */
43
+152, /* (4296) */
44
+160, /* (12177) */
45
+168, /* (18024) */
46
+/* 176, /\* (323) *\/ */
47
+/* 184, /\* (329) *\/ */
48
+/* 192, /\* (202) *\/ */
49
+/* 200, /\* (221) *\/ */
50
+/* 208, /\* (166) *\/ */
51
+/* 216, /\* (179) *\/ */
52
+/* 224, /\* (216) *\/ */
53
+/* 232, /\* (172) *\/ */
54
+/* 240, /\* (157) *\/ */
55
+/* 248, /\* (178) *\/ */
56
+256, /* (133) */
57
+/* 264, /\* (157) *\/ */
58
+/* 272, /\* (140) *\/ */
59
+/* 280, /\* (161) *\/ */
60
+/* 288, /\* (125) *\/ */
61
+/* 296, /\* (141) *\/ */
62
+/* 304, /\* (100) *\/ */
63
+/* 312, /\* (97) *\/ */
64
+/* 320, /\* (70) *\/ */
65
+/* 328, /\* (13) *\/ */
66
+/* 336, /\* (21) *\/ */
67
+/* 344, /\* (21) *\/ */
68
+/* 352, /\* (13) *\/ */
69
+/* 360, /\* (9) *\/ */
70
+/* 368, /\* (8) *\/ */
71
+/* 376, /\* (14) *\/ */
72
+/* 384, /\* (5) *\/ */
73
+/* 392, /\* (6) *\/ */
74
+/* 400, /\* (4) *\/ */
75
+/* 408, /\* (2) *\/ */
76
+/* 416, /\* (6) *\/ */
77
+/* 424, /\* (5) *\/ */
78
+/* 432, /\* (4) *\/ */
79
+/* 440, /\* (4) *\/ */
80
+/* 448, /\* (4) *\/ */
81
+/* 464, /\* (2) *\/ */
82
+/* 472, /\* (2) *\/ */
83
+/* 480, /\* (1) *\/ */
84
+/* 496, /\* (1) *\/ */
85
+/* 512, /\* (2) *\/ */
86
+520, /* (11) */
87
+/* 536, /\* (1) *\/ */
88
+/* 544, /\* (2) *\/ */
89
+/* 552, /\* (1) *\/ */
90
+/* 584, /\* (3) *\/ */
91
+/* 600, /\* (1) *\/ */
92
+/* 624, /\* (1) *\/ */
93
+/* 656, /\* (1) *\/ */
94
+/* 784, /\* (2) *\/ */
95
+1032, /* (11) */
96
+/* 2056, /\* (14) *\/ */
97
+2064, /* (7456) */
98
+4104, /* (14) */
99
+8200, /* (9) */
100
+16392, /* (6) */
101
+32776, /* (4) */
102
+63512, /* (7) */
103
+134408, /* (1) */
104
+507984, /* (7) */
105
+1051040, /* (1) */
106
+2097152
107
+};
108
+
109
+#define FRAGSBITS (sizeof(fragsz)/sizeof(fragsz[0]))
110
+
25 111
 struct MPMAP {
26 112
   struct MPMAP *next;
27 113
   unsigned int size;
... ...
@@ -29,10 +115,8 @@ struct MPMAP {
29 29
 };
30 30
 
31 31
 struct MP {
32
-  int fd;
33 32
   unsigned int psize;
34
-  unsigned int top;
35
-  struct FRAG *avail[32];
33
+  struct FRAG *avail[FRAGSBITS];
36 34
   struct MPMAP mpm;
37 35
 };
38 36