]> git.pld-linux.org Git - packages/mysql.git/blob - mysql-split_buf_pool_mutex_fixed_optimistic_safe.patch
- up to 5.1.44
[packages/mysql.git] / mysql-split_buf_pool_mutex_fixed_optimistic_safe.patch
1 diff -ruN mysql-5.1.29-rc_orig/storage/innobase/buf/buf0buf.c mysql-5.1.29-rc/storage/innobase/buf/buf0buf.c
2 --- mysql-5.1.29-rc_orig/storage/innobase/buf/buf0buf.c 2008-10-12 06:54:12.000000000 +0900
3 +++ mysql-5.1.29-rc/storage/innobase/buf/buf0buf.c      2008-11-18 15:44:00.000000000 +0900
4 @@ -596,6 +596,15 @@
5         ---------------------------- */
6         mutex_create(&buf_pool->mutex, SYNC_BUF_POOL);
7  
8 +       mutex_create(&(buf_pool->flush_list_mutex), SYNC_NO_ORDER_CHECK);
9 +       mutex_create(&(buf_pool->LRU_mutex), SYNC_NO_ORDER_CHECK);
10 +       mutex_create(&(buf_pool->free_mutex), SYNC_NO_ORDER_CHECK);
11 +       mutex_create(&(buf_pool->hash_mutex), SYNC_NO_ORDER_CHECK);
12 +
13 +       mutex_enter(&(buf_pool->LRU_mutex));
14 +       mutex_enter(&(buf_pool->flush_list_mutex));
15 +       mutex_enter(&(buf_pool->free_mutex));
16 +       mutex_enter(&(buf_pool->hash_mutex));
17         mutex_enter(&(buf_pool->mutex));
18  
19         if (srv_use_awe) {
20 @@ -773,6 +782,10 @@
21                 block->in_free_list = TRUE;
22         }
23  
24 +       mutex_exit(&(buf_pool->LRU_mutex));
25 +       mutex_exit(&(buf_pool->flush_list_mutex));
26 +       mutex_exit(&(buf_pool->free_mutex));
27 +       mutex_exit(&(buf_pool->hash_mutex));
28         mutex_exit(&(buf_pool->mutex));
29  
30         if (srv_use_adaptive_hash_indexes) {
31 @@ -905,12 +918,12 @@
32  
33         if (buf_block_peek_if_too_old(block)) {
34  
35 -               mutex_enter(&buf_pool->mutex);
36 +               mutex_enter(&(buf_pool->LRU_mutex));
37                 /* There has been freeing activity in the LRU list:
38                 best to move to the head of the LRU list */
39  
40                 buf_LRU_make_block_young(block);
41 -               mutex_exit(&buf_pool->mutex);
42 +               mutex_exit(&(buf_pool->LRU_mutex));
43         }
44  }
45  
46 @@ -926,7 +939,7 @@
47  {
48         buf_block_t*    block;
49  
50 -       mutex_enter(&(buf_pool->mutex));
51 +       mutex_enter(&(buf_pool->LRU_mutex));
52  
53         block = buf_block_align(frame);
54  
55 @@ -934,7 +947,7 @@
56  
57         buf_LRU_make_block_young(block);
58  
59 -       mutex_exit(&(buf_pool->mutex));
60 +       mutex_exit(&(buf_pool->LRU_mutex));
61  }
62  
63  /************************************************************************
64 @@ -945,7 +958,7 @@
65  /*===========*/
66         buf_block_t*    block)  /* in, own: block to be freed */
67  {
68 -       mutex_enter(&(buf_pool->mutex));
69 +       mutex_enter(&(buf_pool->free_mutex));
70  
71         mutex_enter(&block->mutex);
72  
73 @@ -955,7 +968,7 @@
74  
75         mutex_exit(&block->mutex);
76  
77 -       mutex_exit(&(buf_pool->mutex));
78 +       mutex_exit(&(buf_pool->free_mutex));
79  }
80  
81  /*************************************************************************
82 @@ -996,11 +1009,11 @@
83  {
84         buf_block_t*    block;
85  
86 -       mutex_enter_fast(&(buf_pool->mutex));
87 +       mutex_enter_fast(&(buf_pool->hash_mutex));
88  
89         block = buf_page_hash_get(space, offset);
90  
91 -       mutex_exit(&(buf_pool->mutex));
92 +       mutex_exit(&(buf_pool->hash_mutex));
93  
94         return(block);
95  }
96 @@ -1017,7 +1030,7 @@
97  {
98         buf_block_t*    block;
99  
100 -       mutex_enter_fast(&(buf_pool->mutex));
101 +       mutex_enter_fast(&(buf_pool->hash_mutex));
102  
103         block = buf_page_hash_get(space, offset);
104  
105 @@ -1025,7 +1038,7 @@
106                 block->check_index_page_at_flush = FALSE;
107         }
108  
109 -       mutex_exit(&(buf_pool->mutex));
110 +       mutex_exit(&(buf_pool->hash_mutex));
111  }
112  
113  /************************************************************************
114 @@ -1044,7 +1057,7 @@
115         buf_block_t*    block;
116         ibool           is_hashed;
117  
118 -       mutex_enter_fast(&(buf_pool->mutex));
119 +       mutex_enter_fast(&(buf_pool->hash_mutex));
120  
121         block = buf_page_hash_get(space, offset);
122  
123 @@ -1054,7 +1067,7 @@
124                 is_hashed = block->is_hashed;
125         }
126  
127 -       mutex_exit(&(buf_pool->mutex));
128 +       mutex_exit(&(buf_pool->hash_mutex));
129  
130         return(is_hashed);
131  }
132 @@ -1096,7 +1109,7 @@
133  {
134         buf_block_t*    block;
135  
136 -       mutex_enter_fast(&(buf_pool->mutex));
137 +       mutex_enter_fast(&(buf_pool->hash_mutex));
138  
139         block = buf_page_hash_get(space, offset);
140  
141 @@ -1104,7 +1117,7 @@
142                 block->file_page_was_freed = TRUE;
143         }
144  
145 -       mutex_exit(&(buf_pool->mutex));
146 +       mutex_exit(&(buf_pool->hash_mutex));
147  
148         return(block);
149  }
150 @@ -1125,7 +1138,7 @@
151  {
152         buf_block_t*    block;
153  
154 -       mutex_enter_fast(&(buf_pool->mutex));
155 +       mutex_enter_fast(&(buf_pool->hash_mutex));
156  
157         block = buf_page_hash_get(space, offset);
158  
159 @@ -1133,7 +1146,7 @@
160                 block->file_page_was_freed = FALSE;
161         }
162  
163 -       mutex_exit(&(buf_pool->mutex));
164 +       mutex_exit(&(buf_pool->hash_mutex));
165  
166         return(block);
167  }
168 @@ -1174,26 +1187,33 @@
169         buf_pool->n_page_gets++;
170  loop:
171         block = NULL;
172 -       mutex_enter_fast(&(buf_pool->mutex));
173 +       // mutex_enter_fast(&(buf_pool->mutex));
174  
175         if (guess) {
176                 block = buf_block_align(guess);
177  
178 +               mutex_enter(&block->mutex);
179                 if ((offset != block->offset) || (space != block->space)
180                     || (block->state != BUF_BLOCK_FILE_PAGE)) {
181  
182 +                       mutex_exit(&block->mutex);
183                         block = NULL;
184                 }
185         }
186  
187         if (block == NULL) {
188 +               mutex_enter_fast(&(buf_pool->hash_mutex));
189                 block = buf_page_hash_get(space, offset);
190 +               if(block) {
191 +                       mutex_enter(&block->mutex);
192 +               }
193 +               mutex_exit(&(buf_pool->hash_mutex));
194         }
195  
196         if (block == NULL) {
197                 /* Page not in buf_pool: needs to be read from file */
198  
199 -               mutex_exit(&(buf_pool->mutex));
200 +               // mutex_exit(&(buf_pool->mutex));
201  
202                 if (mode == BUF_GET_IF_IN_POOL) {
203  
204 @@ -1212,7 +1232,7 @@
205                 goto loop;
206         }
207  
208 -       mutex_enter(&block->mutex);
209 +       // mutex_enter(&block->mutex);
210  
211         ut_a(block->state == BUF_BLOCK_FILE_PAGE);
212  
213 @@ -1224,7 +1244,7 @@
214  
215                 if (mode == BUF_GET_IF_IN_POOL) {
216                         /* The page is only being read to buffer */
217 -                       mutex_exit(&buf_pool->mutex);
218 +                       // mutex_exit(&buf_pool->mutex);
219                         mutex_exit(&block->mutex);
220  
221                         return(NULL);
222 @@ -1241,7 +1261,9 @@
223                 LRU list and we must put it to awe_LRU_free_mapped list once
224                 mapped to a frame */
225  
226 +               mutex_enter_fast(&(buf_pool->mutex));
227                 buf_awe_map_page_to_frame(block, TRUE);
228 +               mutex_exit(&buf_pool->mutex);
229         }
230  
231  #ifdef UNIV_SYNC_DEBUG
232 @@ -1249,7 +1271,7 @@
233  #else
234         buf_block_buf_fix_inc(block);
235  #endif
236 -       mutex_exit(&buf_pool->mutex);
237 +       // mutex_exit(&buf_pool->mutex);
238  
239         /* Check if this is the first access to the page */
240  
241 @@ -1747,7 +1769,8 @@
242  
243         ut_a(block);
244  
245 -       mutex_enter(&(buf_pool->mutex));
246 +       mutex_enter(&(buf_pool->LRU_mutex));
247 +       mutex_enter(&(buf_pool->hash_mutex));
248         mutex_enter(&block->mutex);
249  
250         if (fil_tablespace_deleted_or_being_deleted_in_mem(
251 @@ -1763,7 +1786,8 @@
252                 already in buf_pool, return */
253  
254                 mutex_exit(&block->mutex);
255 -               mutex_exit(&(buf_pool->mutex));
256 +               mutex_exit(&(buf_pool->LRU_mutex));
257 +               mutex_exit(&(buf_pool->hash_mutex));
258  
259                 buf_block_free(block);
260  
261 @@ -1778,10 +1802,14 @@
262         ut_ad(block);
263  
264         buf_page_init(space, offset, block);
265 +       mutex_exit(&(buf_pool->hash_mutex));
266  
267         /* The block must be put to the LRU list, to the old blocks */
268  
269         buf_LRU_add_block(block, TRUE);         /* TRUE == to old blocks */
270 +       mutex_exit(&(buf_pool->LRU_mutex));
271 +
272 +       mutex_enter(&(buf_pool->mutex)); /* for consistency about aio */
273  
274         block->io_fix = BUF_IO_READ;
275  
276 @@ -1830,7 +1858,8 @@
277  
278         free_block = buf_LRU_get_free_block();
279  
280 -       mutex_enter(&(buf_pool->mutex));
281 +       mutex_enter(&(buf_pool->LRU_mutex));
282 +       mutex_enter(&(buf_pool->hash_mutex));
283  
284         block = buf_page_hash_get(space, offset);
285  
286 @@ -1841,7 +1870,8 @@
287                 block->file_page_was_freed = FALSE;
288  
289                 /* Page can be found in buf_pool */
290 -               mutex_exit(&(buf_pool->mutex));
291 +               mutex_exit(&(buf_pool->LRU_mutex));
292 +               mutex_exit(&(buf_pool->hash_mutex));
293  
294                 buf_block_free(free_block);
295  
296 @@ -1864,6 +1894,7 @@
297         mutex_enter(&block->mutex);
298  
299         buf_page_init(space, offset, block);
300 +       mutex_exit(&(buf_pool->hash_mutex));
301  
302         /* The block must be put to the LRU list */
303         buf_LRU_add_block(block, FALSE);
304 @@ -1875,7 +1906,7 @@
305  #endif
306         buf_pool->n_pages_created++;
307  
308 -       mutex_exit(&(buf_pool->mutex));
309 +       mutex_exit(&(buf_pool->LRU_mutex));
310  
311         mtr_memo_push(mtr, block, MTR_MEMO_BUF_FIX);
312  
313 @@ -1889,7 +1920,7 @@
314         ibuf_merge_or_delete_for_page(NULL, space, offset, TRUE);
315  
316         /* Flush pages from the end of the LRU list if necessary */
317 -       buf_flush_free_margin();
318 +       buf_flush_free_margin(FALSE);
319  
320         frame = block->frame;
321  
322 @@ -1928,6 +1959,7 @@
323         buf_block_t*    block)  /* in: pointer to the block in question */
324  {
325         ulint           io_type;
326 +       ulint           flush_type;
327  
328         ut_ad(block);
329  
330 @@ -2040,9 +2072,6 @@
331                 }
332         }
333  
334 -       mutex_enter(&(buf_pool->mutex));
335 -       mutex_enter(&block->mutex);
336 -
337  #ifdef UNIV_IBUF_DEBUG
338         ut_a(ibuf_count_get(block->space, block->offset) == 0);
339  #endif
340 @@ -2051,9 +2080,12 @@
341         removes the newest lock debug record, without checking the thread
342         id. */
343  
344 -       block->io_fix = 0;
345 -
346         if (io_type == BUF_IO_READ) {
347 +               mutex_enter(&block->mutex);
348 +               mutex_enter(&(buf_pool->mutex));
349 +
350 +               block->io_fix = 0;
351 +
352                 /* NOTE that the call to ibuf may have moved the ownership of
353                 the x-latch to this OS thread: do not let this confuse you in
354                 debugging! */
355 @@ -2064,6 +2096,8 @@
356  
357                 rw_lock_x_unlock_gen(&(block->lock), BUF_IO_READ);
358  
359 +               mutex_exit(&(buf_pool->mutex));
360 +               mutex_exit(&block->mutex);
361  #ifdef UNIV_DEBUG
362                 if (buf_debug_prints) {
363                         fputs("Has read ", stderr);
364 @@ -2072,15 +2106,33 @@
365         } else {
366                 ut_ad(io_type == BUF_IO_WRITE);
367  
368 +               flush_type = block->flush_type;
369 +               if (flush_type == BUF_FLUSH_LRU) { /* optimistic! */
370 +                       mutex_enter(&(buf_pool->LRU_mutex));
371 +               }
372 +               mutex_enter(&(buf_pool->flush_list_mutex));
373 +               mutex_enter(&block->mutex);
374 +               mutex_enter(&(buf_pool->mutex));
375 +
376 +               block->io_fix = 0;
377 +
378                 /* Write means a flush operation: call the completion
379                 routine in the flush system */
380  
381                 buf_flush_write_complete(block);
382  
383 +               mutex_exit(&(buf_pool->flush_list_mutex));
384 +               if (flush_type == BUF_FLUSH_LRU) { /* optimistic! */
385 +                       mutex_exit(&(buf_pool->LRU_mutex));
386 +               }
387 +
388                 rw_lock_s_unlock_gen(&(block->lock), BUF_IO_WRITE);
389  
390                 buf_pool->n_pages_written++;
391  
392 +               mutex_exit(&(buf_pool->mutex));
393 +               mutex_exit(&block->mutex);
394 +
395  #ifdef UNIV_DEBUG
396                 if (buf_debug_prints) {
397                         fputs("Has written ", stderr);
398 @@ -2088,9 +2140,6 @@
399  #endif /* UNIV_DEBUG */
400         }
401  
402 -       mutex_exit(&block->mutex);
403 -       mutex_exit(&(buf_pool->mutex));
404 -
405  #ifdef UNIV_DEBUG
406         if (buf_debug_prints) {
407                 fprintf(stderr, "page space %lu page no %lu\n",
408 @@ -2118,11 +2167,11 @@
409                 freed = buf_LRU_search_and_free_block(100);
410         }
411  
412 -       mutex_enter(&(buf_pool->mutex));
413 +       mutex_enter(&(buf_pool->LRU_mutex));
414  
415         ut_ad(UT_LIST_GET_LEN(buf_pool->LRU) == 0);
416  
417 -       mutex_exit(&(buf_pool->mutex));
418 +       mutex_exit(&(buf_pool->LRU_mutex));
419  }
420  
421  #ifdef UNIV_DEBUG
422 @@ -2142,10 +2191,22 @@
423         ulint           n_flush         = 0;
424         ulint           n_free          = 0;
425         ulint           n_page          = 0;
426 +       ulint           n_single_flush_tmp      = 0;
427 +       ulint           n_lru_flush_tmp         = 0;
428 +       ulint           n_list_flush_tmp        = 0;
429  
430         ut_ad(buf_pool);
431  
432 +       mutex_enter(&(buf_pool->LRU_mutex));
433 +       mutex_enter(&(buf_pool->flush_list_mutex));
434 +       mutex_enter(&(buf_pool->free_mutex));
435 +       mutex_enter(&(buf_pool->hash_mutex));
436 +
437         mutex_enter(&(buf_pool->mutex));
438 +       n_single_flush_tmp = buf_pool->n_flush[BUF_FLUSH_SINGLE_PAGE];
439 +       n_list_flush_tmp = buf_pool->n_flush[BUF_FLUSH_LIST];
440 +       n_lru_flush_tmp = buf_pool->n_flush[BUF_FLUSH_LRU];
441 +       mutex_exit(&(buf_pool->mutex));
442  
443         for (i = 0; i < buf_pool->curr_size; i++) {
444  
445 @@ -2216,11 +2277,14 @@
446         }
447         ut_a(UT_LIST_GET_LEN(buf_pool->flush_list) == n_flush);
448  
449 -       ut_a(buf_pool->n_flush[BUF_FLUSH_SINGLE_PAGE] == n_single_flush);
450 -       ut_a(buf_pool->n_flush[BUF_FLUSH_LIST] == n_list_flush);
451 -       ut_a(buf_pool->n_flush[BUF_FLUSH_LRU] == n_lru_flush);
452 -
453 -       mutex_exit(&(buf_pool->mutex));
454 +       ut_a(n_single_flush_tmp == n_single_flush);
455 +       ut_a(n_list_flush_tmp == n_list_flush);
456 +       ut_a(n_lru_flush_tmp == n_lru_flush);
457 +       
458 +       mutex_exit(&(buf_pool->LRU_mutex));
459 +       mutex_exit(&(buf_pool->flush_list_mutex));
460 +       mutex_exit(&(buf_pool->free_mutex));
461 +       mutex_exit(&(buf_pool->hash_mutex));
462  
463         ut_a(buf_LRU_validate());
464         ut_a(buf_flush_validate());
465 @@ -2252,7 +2316,9 @@
466         index_ids = mem_alloc(sizeof(dulint) * size);
467         counts = mem_alloc(sizeof(ulint) * size);
468  
469 -       mutex_enter(&(buf_pool->mutex));
470 +       mutex_enter(&(buf_pool->LRU_mutex));
471 +       mutex_enter(&(buf_pool->flush_list_mutex));
472 +       mutex_enter(&(buf_pool->free_mutex));
473  
474         fprintf(stderr,
475                 "buf_pool size %lu\n"
476 @@ -2305,7 +2371,9 @@
477                 }
478         }
479  
480 -       mutex_exit(&(buf_pool->mutex));
481 +       mutex_exit(&(buf_pool->LRU_mutex));
482 +       mutex_exit(&(buf_pool->flush_list_mutex));
483 +       mutex_exit(&(buf_pool->free_mutex));
484  
485         for (i = 0; i < n_found; i++) {
486                 index = dict_index_get_if_in_cache(index_ids[i]);
487 @@ -2339,8 +2407,6 @@
488         ulint           i;
489         ulint           fixed_pages_number = 0;
490  
491 -       mutex_enter(&(buf_pool->mutex));
492 -
493         for (i = 0; i < buf_pool->curr_size; i++) {
494  
495                 block = buf_pool_get_nth_block(buf_pool, i);
496 @@ -2356,7 +2422,6 @@
497                 }
498         }
499  
500 -       mutex_exit(&(buf_pool->mutex));
501  
502         return(fixed_pages_number);
503  }
504 @@ -2385,7 +2450,9 @@
505  {
506         ulint   ratio;
507  
508 -       mutex_enter(&(buf_pool->mutex));
509 +       mutex_enter(&(buf_pool->LRU_mutex));
510 +       mutex_enter(&(buf_pool->flush_list_mutex));
511 +       mutex_enter(&(buf_pool->free_mutex));
512  
513         ratio = (100 * UT_LIST_GET_LEN(buf_pool->flush_list))
514                 / (1 + UT_LIST_GET_LEN(buf_pool->LRU)
515 @@ -2393,7 +2460,9 @@
516  
517         /* 1 + is there to avoid division by zero */
518  
519 -       mutex_exit(&(buf_pool->mutex));
520 +       mutex_exit(&(buf_pool->LRU_mutex));
521 +       mutex_exit(&(buf_pool->flush_list_mutex));
522 +       mutex_exit(&(buf_pool->free_mutex));
523  
524         return(ratio);
525  }
526 @@ -2413,6 +2482,9 @@
527         ut_ad(buf_pool);
528         size = buf_pool->curr_size;
529  
530 +       mutex_enter(&(buf_pool->LRU_mutex));
531 +       mutex_enter(&(buf_pool->flush_list_mutex));
532 +       mutex_enter(&(buf_pool->free_mutex));
533         mutex_enter(&(buf_pool->mutex));
534  
535         if (srv_use_awe) {
536 @@ -2487,6 +2559,9 @@
537         buf_pool->n_pages_written_old = buf_pool->n_pages_written;
538         buf_pool->n_pages_awe_remapped_old = buf_pool->n_pages_awe_remapped;
539  
540 +       mutex_exit(&(buf_pool->LRU_mutex));
541 +       mutex_exit(&(buf_pool->flush_list_mutex));
542 +       mutex_exit(&(buf_pool->free_mutex));
543         mutex_exit(&(buf_pool->mutex));
544  }
545  
546 @@ -2517,8 +2592,6 @@
547  
548         ut_ad(buf_pool);
549  
550 -       mutex_enter(&(buf_pool->mutex));
551 -
552         for (i = 0; i < buf_pool->curr_size; i++) {
553  
554                 block = buf_pool_get_nth_block(buf_pool, i);
555 @@ -2540,8 +2613,6 @@
556                 mutex_exit(&block->mutex);
557         }
558  
559 -       mutex_exit(&(buf_pool->mutex));
560 -
561         return(TRUE);
562  }
563  
564 @@ -2580,11 +2651,11 @@
565  {
566         ulint   len;
567  
568 -       mutex_enter(&(buf_pool->mutex));
569 +       mutex_enter(&(buf_pool->free_mutex));
570  
571         len = UT_LIST_GET_LEN(buf_pool->free);
572  
573 -       mutex_exit(&(buf_pool->mutex));
574 +       mutex_exit(&(buf_pool->free_mutex));
575  
576         return(len);
577  }
578 diff -ruN mysql-5.1.29-rc_orig/storage/innobase/buf/buf0flu.c mysql-5.1.29-rc/storage/innobase/buf/buf0flu.c
579 --- mysql-5.1.29-rc_orig/storage/innobase/buf/buf0flu.c 2008-10-12 06:54:12.000000000 +0900
580 +++ mysql-5.1.29-rc/storage/innobase/buf/buf0flu.c      2008-11-18 15:26:07.000000000 +0900
581 @@ -109,13 +109,15 @@
582         ut_ad(mutex_own(&(buf_pool->mutex)));
583         ut_ad(mutex_own(&block->mutex));
584         if (block->state != BUF_BLOCK_FILE_PAGE) {
585 +               /* It is permited not to own LRU_mutex..  */
586 +/*
587                 ut_print_timestamp(stderr);
588                 fprintf(stderr,
589                         "  InnoDB: Error: buffer block state %lu"
590                         " in the LRU list!\n",
591                         (ulong)block->state);
592                 ut_print_buf(stderr, block, sizeof(buf_block_t));
593 -
594 +*/
595                 return(FALSE);
596         }
597  
598 @@ -546,18 +548,20 @@
599         ut_ad(flush_type == BUF_FLUSH_LRU || flush_type == BUF_FLUSH_LIST
600               || flush_type == BUF_FLUSH_SINGLE_PAGE);
601  
602 -       mutex_enter(&(buf_pool->mutex));
603 +       mutex_enter(&(buf_pool->hash_mutex));
604  
605         block = buf_page_hash_get(space, offset);
606  
607         ut_a(!block || block->state == BUF_BLOCK_FILE_PAGE);
608  
609         if (!block) {
610 -               mutex_exit(&(buf_pool->mutex));
611 +               mutex_exit(&(buf_pool->hash_mutex));
612                 return(0);
613         }
614  
615         mutex_enter(&block->mutex);
616 +       mutex_enter(&(buf_pool->mutex));
617 +       mutex_exit(&(buf_pool->hash_mutex));
618  
619         if (flush_type == BUF_FLUSH_LIST
620             && buf_flush_ready_for_flush(block, flush_type)) {
621 @@ -755,7 +759,7 @@
622                 high = fil_space_get_size(space);
623         }
624  
625 -       mutex_enter(&(buf_pool->mutex));
626 +       mutex_enter(&(buf_pool->hash_mutex));
627  
628         for (i = low; i < high; i++) {
629  
630 @@ -789,7 +793,7 @@
631  
632                                 mutex_exit(&block->mutex);
633  
634 -                               mutex_exit(&(buf_pool->mutex));
635 +                               mutex_exit(&(buf_pool->hash_mutex));
636  
637                                 /* Note: as we release the buf_pool mutex
638                                 above, in buf_flush_try_page we cannot be sure
639 @@ -800,14 +804,14 @@
640                                 count += buf_flush_try_page(space, i,
641                                                             flush_type);
642  
643 -                               mutex_enter(&(buf_pool->mutex));
644 +                               mutex_enter(&(buf_pool->hash_mutex));
645                         } else {
646                                 mutex_exit(&block->mutex);
647                         }
648                 }
649         }
650  
651 -       mutex_exit(&(buf_pool->mutex));
652 +       mutex_exit(&(buf_pool->hash_mutex));
653  
654         return(count);
655  }
656 @@ -863,6 +867,13 @@
657  
658         (buf_pool->init_flush)[flush_type] = TRUE;
659  
660 +       mutex_exit(&(buf_pool->mutex));
661 +
662 +       if (flush_type == BUF_FLUSH_LRU) {
663 +               mutex_enter(&(buf_pool->LRU_mutex));
664 +       }
665 +       mutex_enter(&(buf_pool->flush_list_mutex));
666 +
667         for (;;) {
668                 /* If we have flushed enough, leave the loop */
669                 if (page_count >= min_n) {
670 @@ -908,7 +919,10 @@
671                                 offset = block->offset;
672  
673                                 mutex_exit(&block->mutex);
674 -                               mutex_exit(&(buf_pool->mutex));
675 +                               if (flush_type == BUF_FLUSH_LRU) {
676 +                                       mutex_exit(&(buf_pool->LRU_mutex));
677 +                               }
678 +                               mutex_exit(&(buf_pool->flush_list_mutex));
679  
680                                 old_page_count = page_count;
681  
682 @@ -920,7 +934,10 @@
683                                 flush_type, offset,
684                                 page_count - old_page_count); */
685  
686 -                               mutex_enter(&(buf_pool->mutex));
687 +                               if (flush_type == BUF_FLUSH_LRU) {
688 +                                       mutex_enter(&(buf_pool->LRU_mutex));
689 +                               }
690 +                               mutex_enter(&(buf_pool->flush_list_mutex));
691  
692                         } else if (flush_type == BUF_FLUSH_LRU) {
693  
694 @@ -943,6 +960,13 @@
695                 }
696         }
697  
698 +       if (flush_type == BUF_FLUSH_LRU) {
699 +               mutex_exit(&(buf_pool->LRU_mutex));
700 +       }
701 +       mutex_exit(&(buf_pool->flush_list_mutex));
702 +
703 +       mutex_enter(&(buf_pool->mutex));
704 +
705         (buf_pool->init_flush)[flush_type] = FALSE;
706  
707         if ((buf_pool->n_flush[flush_type] == 0)
708 @@ -1001,10 +1025,14 @@
709         ulint           n_replaceable;
710         ulint           distance        = 0;
711  
712 -       mutex_enter(&(buf_pool->mutex));
713 +       /* optimistic search... */
714 +       //mutex_enter(&(buf_pool->LRU_mutex));
715 +       //mutex_enter(&(buf_pool->free_mutex));
716  
717         n_replaceable = UT_LIST_GET_LEN(buf_pool->free);
718  
719 +       //mutex_exit(&(buf_pool->free_mutex));
720 +
721         block = UT_LIST_GET_LAST(buf_pool->LRU);
722  
723         while ((block != NULL)
724 @@ -1025,7 +1053,7 @@
725                 block = UT_LIST_GET_PREV(LRU, block);
726         }
727  
728 -       mutex_exit(&(buf_pool->mutex));
729 +       //mutex_exit(&(buf_pool->LRU_mutex));
730  
731         if (n_replaceable >= BUF_FLUSH_FREE_BLOCK_MARGIN) {
732  
733 @@ -1044,8 +1072,9 @@
734  immediately, without waiting. */
735  
736  void
737 -buf_flush_free_margin(void)
738 +buf_flush_free_margin(
739  /*=======================*/
740 +       ibool   wait)
741  {
742         ulint   n_to_flush;
743         ulint   n_flushed;
744 @@ -1055,7 +1084,7 @@
745         if (n_to_flush > 0) {
746                 n_flushed = buf_flush_batch(BUF_FLUSH_LRU, n_to_flush,
747                                             ut_dulint_zero);
748 -               if (n_flushed == ULINT_UNDEFINED) {
749 +               if (wait && n_flushed == ULINT_UNDEFINED) {
750                         /* There was an LRU type flush batch already running;
751                         let us wait for it to end */
752  
753 @@ -1105,11 +1134,11 @@
754  {
755         ibool   ret;
756  
757 -       mutex_enter(&(buf_pool->mutex));
758 +       mutex_enter(&(buf_pool->flush_list_mutex));
759  
760         ret = buf_flush_validate_low();
761  
762 -       mutex_exit(&(buf_pool->mutex));
763 +       mutex_exit(&(buf_pool->flush_list_mutex));
764  
765         return(ret);
766  }
767 diff -ruN mysql-5.1.29-rc_orig/storage/innobase/buf/buf0lru.c mysql-5.1.29-rc/storage/innobase/buf/buf0lru.c
768 --- mysql-5.1.29-rc_orig/storage/innobase/buf/buf0lru.c 2008-10-12 06:54:12.000000000 +0900
769 +++ mysql-5.1.29-rc/storage/innobase/buf/buf0lru.c      2008-11-18 15:09:58.000000000 +0900
770 @@ -79,7 +79,10 @@
771         ibool           all_freed;
772  
773  scan_again:
774 -       mutex_enter(&(buf_pool->mutex));
775 +       mutex_enter(&(buf_pool->LRU_mutex));
776 +       mutex_enter(&(buf_pool->flush_list_mutex));
777 +       mutex_enter(&(buf_pool->free_mutex));
778 +       mutex_enter(&(buf_pool->hash_mutex));
779  
780         all_freed = TRUE;
781  
782 @@ -119,7 +122,10 @@
783  
784                                 mutex_exit(&block->mutex);
785  
786 -                               mutex_exit(&(buf_pool->mutex));
787 +                               mutex_exit(&(buf_pool->LRU_mutex));
788 +                               mutex_exit(&(buf_pool->flush_list_mutex));
789 +                               mutex_exit(&(buf_pool->free_mutex));
790 +                               mutex_exit(&(buf_pool->hash_mutex));
791  
792                                 /* Note that the following call will acquire
793                                 an S-latch on the page */
794 @@ -149,7 +155,10 @@
795                 block = prev_block;
796         }
797  
798 -       mutex_exit(&(buf_pool->mutex));
799 +       mutex_exit(&(buf_pool->LRU_mutex));
800 +       mutex_exit(&(buf_pool->flush_list_mutex));
801 +       mutex_exit(&(buf_pool->free_mutex));
802 +       mutex_exit(&(buf_pool->hash_mutex));
803  
804         if (!all_freed) {
805                 os_thread_sleep(20000);
806 @@ -172,14 +181,14 @@
807         ulint           len;
808         ulint           limit;
809  
810 -       mutex_enter(&(buf_pool->mutex));
811 +       mutex_enter(&(buf_pool->LRU_mutex));
812  
813         len = UT_LIST_GET_LEN(buf_pool->LRU);
814  
815         if (len < BUF_LRU_OLD_MIN_LEN) {
816                 /* The LRU list is too short to do read-ahead */
817  
818 -               mutex_exit(&(buf_pool->mutex));
819 +               mutex_exit(&(buf_pool->LRU_mutex));
820  
821                 return(0);
822         }
823 @@ -188,7 +197,7 @@
824  
825         limit = block->LRU_position - len / BUF_LRU_INITIAL_RATIO;
826  
827 -       mutex_exit(&(buf_pool->mutex));
828 +       mutex_exit(&(buf_pool->LRU_mutex));
829  
830         return(limit);
831  }
832 @@ -212,13 +221,15 @@
833         ulint           distance = 0;
834         ibool           freed;
835  
836 -       mutex_enter(&(buf_pool->mutex));
837 +       /* optimistic search... */
838 +       //mutex_enter(&(buf_pool->LRU_mutex));
839  
840 +retry:
841         freed = FALSE;
842         block = UT_LIST_GET_LAST(buf_pool->LRU);
843  
844         while (block != NULL) {
845 -               ut_a(block->in_LRU_list);
846 +               //ut_a(block->in_LRU_list); /* optimistic */
847  
848                 mutex_enter(&block->mutex);
849  
850 @@ -234,9 +245,17 @@
851                         }
852  #endif /* UNIV_DEBUG */
853  
854 +                       mutex_exit(&block->mutex);
855 +
856 +                       mutex_enter(&(buf_pool->LRU_mutex));/* optimistic */
857 +
858 +                       mutex_enter(&(buf_pool->hash_mutex));
859 +                       mutex_enter(&block->mutex);
860 +                       if(block->in_LRU_list && buf_flush_ready_for_replace(block)) {
861                         buf_LRU_block_remove_hashed_page(block);
862 +                       mutex_exit(&(buf_pool->hash_mutex));
863  
864 -                       mutex_exit(&(buf_pool->mutex));
865 +                       mutex_exit(&(buf_pool->LRU_mutex));
866                         mutex_exit(&block->mutex);
867  
868                         /* Remove possible adaptive hash index built on the
869 @@ -257,14 +276,25 @@
870  
871                         ut_a(block->buf_fix_count == 0);
872  
873 -                       mutex_enter(&(buf_pool->mutex));
874 +                       mutex_enter(&(buf_pool->free_mutex));
875                         mutex_enter(&block->mutex);
876  
877                         buf_LRU_block_free_hashed_page(block);
878                         freed = TRUE;
879 +                       mutex_exit(&(buf_pool->free_mutex));
880                         mutex_exit(&block->mutex);
881  
882                         break;
883 +                       } else { /* someone may interrupt...??? */
884 +                       mutex_exit(&(buf_pool->LRU_mutex));/* optimistic */
885 +
886 +                       mutex_exit(&(buf_pool->hash_mutex));
887 +
888 +                       if (!(block->in_LRU_list)) {
889 +                               mutex_exit(&block->mutex);
890 +                               goto retry;
891 +                       }
892 +                       }
893                 }
894  
895                 mutex_exit(&block->mutex);
896 @@ -275,13 +305,21 @@
897                 if (!freed && n_iterations <= 10
898                     && distance > 100 + (n_iterations * buf_pool->curr_size)
899                     / 10) {
900 -                       buf_pool->LRU_flush_ended = 0;
901  
902 +                       mutex_enter(&(buf_pool->mutex));
903 +                       buf_pool->LRU_flush_ended = 0;
904                         mutex_exit(&(buf_pool->mutex));
905  
906 +                       //mutex_exit(&(buf_pool->LRU_mutex));
907 +
908                         return(FALSE);
909                 }
910         }
911 +       if (!freed) {
912 +               //mutex_exit(&(buf_pool->LRU_mutex));
913 +       }
914 +
915 +       mutex_enter(&(buf_pool->mutex));
916         if (buf_pool->LRU_flush_ended > 0) {
917                 buf_pool->LRU_flush_ended--;
918         }
919 @@ -333,7 +371,8 @@
920  {
921         ibool   ret     = FALSE;
922  
923 -       mutex_enter(&(buf_pool->mutex));
924 +       mutex_enter(&(buf_pool->LRU_mutex));
925 +       mutex_enter(&(buf_pool->free_mutex));
926  
927         if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free)
928             + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 4) {
929 @@ -341,7 +380,8 @@
930                 ret = TRUE;
931         }
932  
933 -       mutex_exit(&(buf_pool->mutex));
934 +       mutex_exit(&(buf_pool->LRU_mutex));
935 +       mutex_exit(&(buf_pool->free_mutex));
936  
937         return(ret);
938  }
939 @@ -364,7 +404,7 @@
940         ibool           mon_value_was   = FALSE;
941         ibool           started_monitor = FALSE;
942  loop:
943 -       mutex_enter(&(buf_pool->mutex));
944 +       mutex_enter(&(buf_pool->free_mutex)); /* LRU info:optimistic */
945  
946         if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free)
947             + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 20) {
948 @@ -461,7 +501,7 @@
949  
950                 mutex_exit(&block->mutex);
951  
952 -               mutex_exit(&(buf_pool->mutex));
953 +               mutex_exit(&(buf_pool->free_mutex));
954  
955                 if (started_monitor) {
956                         srv_print_innodb_monitor = mon_value_was;
957 @@ -473,7 +513,7 @@
958         /* If no block was in the free list, search from the end of the LRU
959         list and try to free a block there */
960  
961 -       mutex_exit(&(buf_pool->mutex));
962 +       mutex_exit(&(buf_pool->free_mutex));
963  
964         freed = buf_LRU_search_and_free_block(n_iterations);
965  
966 @@ -517,7 +557,7 @@
967  
968         /* No free block was found: try to flush the LRU list */
969  
970 -       buf_flush_free_margin();
971 +       buf_flush_free_margin(TRUE);
972         ++srv_buf_pool_wait_free;
973  
974         os_aio_simulated_wake_handler_threads();
975 @@ -988,7 +1028,7 @@
976         ulint           LRU_pos;
977  
978         ut_ad(buf_pool);
979 -       mutex_enter(&(buf_pool->mutex));
980 +       mutex_enter(&(buf_pool->LRU_mutex));
981  
982         if (UT_LIST_GET_LEN(buf_pool->LRU) >= BUF_LRU_OLD_MIN_LEN) {
983  
984 @@ -1033,6 +1073,9 @@
985                 ut_a(buf_pool->LRU_old_len == old_len);
986         }
987  
988 +       mutex_exit(&(buf_pool->LRU_mutex));
989 +       mutex_enter(&(buf_pool->free_mutex));
990 +
991         UT_LIST_VALIDATE(free, buf_block_t, buf_pool->free);
992  
993         block = UT_LIST_GET_FIRST(buf_pool->free);
994 @@ -1043,7 +1086,7 @@
995                 block = UT_LIST_GET_NEXT(free, block);
996         }
997  
998 -       mutex_exit(&(buf_pool->mutex));
999 +       mutex_exit(&(buf_pool->free_mutex));
1000         return(TRUE);
1001  }
1002  
1003 @@ -1059,7 +1102,7 @@
1004         ulint           len;
1005  
1006         ut_ad(buf_pool);
1007 -       mutex_enter(&(buf_pool->mutex));
1008 +       mutex_enter(&(buf_pool->LRU_mutex));
1009  
1010         fprintf(stderr, "Pool ulint clock %lu\n",
1011                 (ulong) buf_pool->ulint_clock);
1012 @@ -1105,6 +1148,6 @@
1013                 }
1014         }
1015  
1016 -       mutex_exit(&(buf_pool->mutex));
1017 +       mutex_exit(&(buf_pool->LRU_mutex));
1018  }
1019  #endif /* UNIV_DEBUG */
1020 diff -ruN mysql-5.1.29-rc_orig/storage/innobase/buf/buf0rea.c mysql-5.1.29-rc/storage/innobase/buf/buf0rea.c
1021 --- mysql-5.1.29-rc_orig/storage/innobase/buf/buf0rea.c 2008-10-12 06:54:12.000000000 +0900
1022 +++ mysql-5.1.29-rc/storage/innobase/buf/buf0rea.c      2008-11-18 15:28:13.000000000 +0900
1023 @@ -219,10 +219,12 @@
1024  
1025                 return(0);
1026         }
1027 +       mutex_exit(&(buf_pool->mutex));
1028  
1029         /* Count how many blocks in the area have been recently accessed,
1030         that is, reside near the start of the LRU list. */
1031  
1032 +       mutex_enter(&(buf_pool->hash_mutex));
1033         for (i = low; i < high; i++) {
1034                 block = buf_page_hash_get(space, i);
1035  
1036 @@ -233,8 +235,9 @@
1037                         recent_blocks++;
1038                 }
1039         }
1040 +       mutex_exit(&(buf_pool->hash_mutex));
1041  
1042 -       mutex_exit(&(buf_pool->mutex));
1043 +       // mutex_exit(&(buf_pool->mutex));
1044  
1045         if (recent_blocks < BUF_READ_AHEAD_RANDOM_THRESHOLD) {
1046                 /* Do nothing */
1047 @@ -334,7 +337,7 @@
1048         }
1049  
1050         /* Flush pages from the end of the LRU list if necessary */
1051 -       buf_flush_free_margin();
1052 +       buf_flush_free_margin(FALSE);
1053  
1054         return(count + count2);
1055  }
1056 @@ -432,6 +435,7 @@
1057  
1058                 return(0);
1059         }
1060 +       mutex_exit(&(buf_pool->mutex));
1061  
1062         /* Check that almost all pages in the area have been accessed; if
1063         offset == low, the accesses must be in a descending order, otherwise,
1064 @@ -445,6 +449,7 @@
1065  
1066         fail_count = 0;
1067  
1068 +       mutex_enter(&(buf_pool->hash_mutex));
1069         for (i = low; i < high; i++) {
1070                 block = buf_page_hash_get(space, i);
1071  
1072 @@ -462,12 +467,13 @@
1073                         pred_block = block;
1074                 }
1075         }
1076 +       mutex_exit(&(buf_pool->hash_mutex));
1077  
1078         if (fail_count > BUF_READ_AHEAD_LINEAR_AREA
1079             - BUF_READ_AHEAD_LINEAR_THRESHOLD) {
1080                 /* Too many failures: return */
1081  
1082 -               mutex_exit(&(buf_pool->mutex));
1083 +               //mutex_exit(&(buf_pool->mutex));
1084  
1085                 return(0);
1086         }
1087 @@ -475,10 +481,11 @@
1088         /* If we got this far, we know that enough pages in the area have
1089         been accessed in the right order: linear read-ahead can be sensible */
1090  
1091 +       mutex_enter(&(buf_pool->hash_mutex));
1092         block = buf_page_hash_get(space, offset);
1093  
1094         if (block == NULL) {
1095 -               mutex_exit(&(buf_pool->mutex));
1096 +               mutex_exit(&(buf_pool->hash_mutex));
1097  
1098                 return(0);
1099         }
1100 @@ -494,7 +501,7 @@
1101         pred_offset = fil_page_get_prev(frame);
1102         succ_offset = fil_page_get_next(frame);
1103  
1104 -       mutex_exit(&(buf_pool->mutex));
1105 +       mutex_exit(&(buf_pool->hash_mutex));
1106  
1107         if ((offset == low) && (succ_offset == offset + 1)) {
1108  
1109 @@ -573,7 +580,7 @@
1110         os_aio_simulated_wake_handler_threads();
1111  
1112         /* Flush pages from the end of the LRU list if necessary */
1113 -       buf_flush_free_margin();
1114 +       buf_flush_free_margin(FALSE);
1115  
1116  #ifdef UNIV_DEBUG
1117         if (buf_debug_prints && (count > 0)) {
1118 @@ -639,7 +646,7 @@
1119         os_aio_simulated_wake_handler_threads();
1120  
1121         /* Flush pages from the end of the LRU list if necessary */
1122 -       buf_flush_free_margin();
1123 +       buf_flush_free_margin(FALSE);
1124  
1125  #ifdef UNIV_DEBUG
1126         if (buf_debug_prints) {
1127 @@ -716,7 +723,7 @@
1128         os_aio_simulated_wake_handler_threads();
1129  
1130         /* Flush pages from the end of the LRU list if necessary */
1131 -       buf_flush_free_margin();
1132 +       buf_flush_free_margin(FALSE);
1133  
1134  #ifdef UNIV_DEBUG
1135         if (buf_debug_prints) {
1136 diff -ruN mysql-5.1.29-rc_orig/storage/innobase/include/buf0buf.h mysql-5.1.29-rc/storage/innobase/include/buf0buf.h
1137 --- mysql-5.1.29-rc_orig/storage/innobase/include/buf0buf.h     2008-10-12 06:54:13.000000000 +0900
1138 +++ mysql-5.1.29-rc/storage/innobase/include/buf0buf.h  2008-11-18 15:09:58.000000000 +0900
1139 @@ -926,6 +926,7 @@
1140                                         currently always the same as
1141                                         max_size */
1142         hash_table_t*   page_hash;      /* hash table of the file pages */
1143 +       mutex_t         hash_mutex;
1144  
1145         ulint           n_pend_reads;   /* number of pending read operations */
1146  
1147 @@ -958,6 +959,7 @@
1148         UT_LIST_BASE_NODE_T(buf_block_t) flush_list;
1149                                         /* base node of the modified block
1150                                         list */
1151 +       mutex_t         flush_list_mutex;
1152         ibool           init_flush[BUF_FLUSH_LIST + 1];
1153                                         /* this is TRUE when a flush of the
1154                                         given type is being initialized */
1155 @@ -991,8 +993,10 @@
1156                                         in the case of AWE, at the start are
1157                                         always free blocks for which the
1158                                         physical memory is mapped to a frame */
1159 +       mutex_t         free_mutex;
1160         UT_LIST_BASE_NODE_T(buf_block_t) LRU;
1161                                         /* base node of the LRU list */
1162 +       mutex_t         LRU_mutex;
1163         buf_block_t*    LRU_old;        /* pointer to the about 3/8 oldest
1164                                         blocks in the LRU list; NULL if LRU
1165                                         length less than BUF_LRU_OLD_MIN_LEN */
1166 diff -ruN mysql-5.1.29-rc_orig/storage/innobase/include/buf0buf.ic mysql-5.1.29-rc/storage/innobase/include/buf0buf.ic
1167 --- mysql-5.1.29-rc_orig/storage/innobase/include/buf0buf.ic    2008-10-12 06:54:13.000000000 +0900
1168 +++ mysql-5.1.29-rc/storage/innobase/include/buf0buf.ic 2008-11-18 15:09:58.000000000 +0900
1169 @@ -104,7 +104,7 @@
1170         buf_block_t*    block;
1171         dulint          lsn;
1172  
1173 -       mutex_enter(&(buf_pool->mutex));
1174 +       mutex_enter(&(buf_pool->flush_list_mutex));
1175  
1176         block = UT_LIST_GET_LAST(buf_pool->flush_list);
1177  
1178 @@ -114,7 +114,7 @@
1179                 lsn = block->oldest_modification;
1180         }
1181  
1182 -       mutex_exit(&(buf_pool->mutex));
1183 +       mutex_exit(&(buf_pool->flush_list_mutex));
1184  
1185         return(lsn);
1186  }
1187 @@ -388,18 +388,18 @@
1188                                 /* out: TRUE if io going on */
1189         buf_block_t*    block)  /* in: buf_pool block, must be bufferfixed */
1190  {
1191 -       mutex_enter(&(buf_pool->mutex));
1192 +       mutex_enter(&block->mutex);
1193  
1194         ut_ad(block->state == BUF_BLOCK_FILE_PAGE);
1195         ut_ad(block->buf_fix_count > 0);
1196  
1197         if (block->io_fix != 0) {
1198 -               mutex_exit(&(buf_pool->mutex));
1199 +               mutex_exit(&block->mutex);
1200  
1201                 return(TRUE);
1202         }
1203  
1204 -       mutex_exit(&(buf_pool->mutex));
1205 +       mutex_exit(&block->mutex);
1206  
1207         return(FALSE);
1208  }
1209 @@ -421,7 +421,7 @@
1210  
1211         block = buf_block_align(frame);
1212  
1213 -       mutex_enter(&(buf_pool->mutex));
1214 +       mutex_enter(&block->mutex);
1215  
1216         if (block->state == BUF_BLOCK_FILE_PAGE) {
1217                 lsn = block->newest_modification;
1218 @@ -429,7 +429,7 @@
1219                 lsn = ut_dulint_zero;
1220         }
1221  
1222 -       mutex_exit(&(buf_pool->mutex));
1223 +       mutex_exit(&block->mutex);
1224  
1225         return(lsn);
1226  }
1227 @@ -624,9 +624,9 @@
1228         ut_a(block->buf_fix_count > 0);
1229  
1230         if (rw_latch == RW_X_LATCH && mtr->modifications) {
1231 -               mutex_enter(&buf_pool->mutex);
1232 +               mutex_enter(&buf_pool->flush_list_mutex);
1233                 buf_flush_note_modification(block, mtr);
1234 -               mutex_exit(&buf_pool->mutex);
1235 +               mutex_exit(&buf_pool->flush_list_mutex);
1236         }
1237  
1238         mutex_enter(&block->mutex);
1239 diff -ruN mysql-5.1.29-rc_orig/storage/innobase/include/buf0flu.h mysql-5.1.29-rc/storage/innobase/include/buf0flu.h
1240 --- mysql-5.1.29-rc_orig/storage/innobase/include/buf0flu.h     2008-10-12 06:54:13.000000000 +0900
1241 +++ mysql-5.1.29-rc/storage/innobase/include/buf0flu.h  2008-11-18 15:09:58.000000000 +0900
1242 @@ -26,8 +26,9 @@
1243  a margin of replaceable pages there. */
1244  
1245  void
1246 -buf_flush_free_margin(void);
1247 +buf_flush_free_margin(
1248  /*=======================*/
1249 +       ibool   wait);
1250  /************************************************************************
1251  Initializes a page for writing to the tablespace. */
1252  
1253 diff -ruN mysql-5.1.29-rc_orig/storage/innobase/include/buf0flu.ic mysql-5.1.29-rc/storage/innobase/include/buf0flu.ic
1254 --- mysql-5.1.29-rc_orig/storage/innobase/include/buf0flu.ic    2008-10-12 06:54:13.000000000 +0900
1255 +++ mysql-5.1.29-rc/storage/innobase/include/buf0flu.ic 2008-11-18 15:09:58.000000000 +0900
1256 @@ -84,7 +84,7 @@
1257         ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX));
1258  #endif /* UNIV_SYNC_DEBUG */
1259  
1260 -       mutex_enter(&(buf_pool->mutex));
1261 +       mutex_enter(&(buf_pool->flush_list_mutex));
1262  
1263         ut_ad(ut_dulint_cmp(block->newest_modification, end_lsn) <= 0);
1264  
1265 @@ -102,5 +102,5 @@
1266                                     start_lsn) <= 0);
1267         }
1268  
1269 -       mutex_exit(&(buf_pool->mutex));
1270 +       mutex_exit(&(buf_pool->flush_list_mutex));
1271  }
1272 diff -ruN mysql-5.1.29-rc_orig/patch_info/split_buf_pool_mutex_fixed_optimistic_safe.info mysql-5.1.29-rc/patch_info/split_buf_pool_mutex_fixed_optimistic_safe.info
1273 --- /dev/null   1970-01-01 09:00:00.000000000 +0900
1274 +++ mysql-5.1.29-rc/patch_info/split_buf_pool_mutex_fixed_optimistic_safe.info  2008-11-18 15:09:58.000000000 +0900
1275 @@ -0,0 +1,6 @@
1276 +File=split_buf_pool_mutex_fixed_optimistic_safe.patch
1277 +Name=InnoDB patch to fix buffer pool scalability
1278 +Version=1.0
1279 +Author=Yasufumi Kinoshita
1280 +License=BSD
1281 +Comment=
This page took 0.12127 seconds and 3 git commands to generate.