diff -ru mysql-5.0.22/innobase/buf/buf0buf.c mysql-5.0.22-scale/innobase/buf/buf0buf.c
--- mysql-5.0.22/innobase/buf/buf0buf.c	2006-05-25 10:56:43.000000000 +0200
+++ mysql-5.0.22-scale/innobase/buf/buf0buf.c	2006-08-03 21:13:42.000000000 +0200
@@ -490,6 +490,7 @@
 	rw_lock_create(&(block->lock));
 	ut_ad(rw_lock_validate(&(block->lock)));
 
+        mutex_create(&(block->blockmutex));
 #ifdef UNIV_SYNC_DEBUG
 	rw_lock_create(&(block->debug_latch));
 	rw_lock_set_level(&(block->debug_latch), SYNC_NO_ORDER_CHECK);
@@ -1162,11 +1163,13 @@
 		buf_awe_map_page_to_frame(block, TRUE);
 	}
 	
+	mutex_enter(&(block->blockmutex));
 #ifdef UNIV_SYNC_DEBUG
 	buf_block_buf_fix_inc_debug(block, file, line);
 #else
 	buf_block_buf_fix_inc(block);
 #endif
+	mutex_exit(&(block->blockmutex));
 	buf_block_make_young(block);
 
 	/* Check if this is the first access to the page */
@@ -1203,13 +1206,13 @@
 		}
 
 		if (!success) {
-			mutex_enter(&(buf_pool->mutex));
+			mutex_enter(&(block->blockmutex));
 
 			block->buf_fix_count--;
 #ifdef UNIV_SYNC_DEBUG
 			rw_lock_s_unlock(&(block->debug_latch));
 #endif			
-			mutex_exit(&(buf_pool->mutex));
+			mutex_exit(&(block->blockmutex));
 
 			return(NULL);
 		}
@@ -1220,18 +1223,18 @@
 			completes */
 
 		        for (;;) {
-			        mutex_enter(&(buf_pool->mutex));
+				mutex_enter(&(block->blockmutex));
 
 		                if (block->io_fix == BUF_IO_READ) {
 
-				        mutex_exit(&(buf_pool->mutex));
+					mutex_exit(&(block->blockmutex));
 				  
 				        /* Sleep 20 milliseconds */
 
 				        os_thread_sleep(20000);
 				} else {
 				  
-				       mutex_exit(&(buf_pool->mutex));
+				       mutex_exit(&(block->blockmutex));
 
 				       break;
 				}
@@ -1290,14 +1293,14 @@
 	ut_ad(mtr && block);
 	ut_ad((rw_latch == RW_S_LATCH) || (rw_latch == RW_X_LATCH));
 	
-	mutex_enter(&(buf_pool->mutex));
+	mutex_enter(&(block->blockmutex));
 
 	/* If AWE is used, block may have a different frame now, e.g., NULL */
 	
 	if (UNIV_UNLIKELY(block->state != BUF_BLOCK_FILE_PAGE)
 			|| UNIV_UNLIKELY(block->frame != guess)) {
 	exit_func:
-		mutex_exit(&(buf_pool->mutex));
+		mutex_exit(&(block->blockmutex));
 
 		return(FALSE);
 	}
@@ -1307,15 +1310,22 @@
 #else
 	buf_block_buf_fix_inc(block);
 #endif
-	buf_block_make_young(block);
-
-	/* Check if this is the first access to the page */
-
 	accessed = block->accessed;
 
 	block->accessed = TRUE;
 
-	mutex_exit(&(buf_pool->mutex));
+	mutex_exit(&(block->blockmutex));
+
+	if (ut_rnd_interval(1,50) == 5)
+	{
+		mutex_enter(&(buf_pool->mutex));	
+
+		buf_block_make_young(block);
+
+		mutex_exit(&(buf_pool->mutex));
+	}
+	/* Check if this is the first access to the page */
+
 
 	ut_ad(!ibuf_inside() || ibuf_page(block->space, block->offset));
 
@@ -1330,7 +1340,7 @@
 	}
 
 	if (UNIV_UNLIKELY(!success)) {
-		mutex_enter(&(buf_pool->mutex));
+		mutex_enter(&(block->blockmutex));
 		
 		block->buf_fix_count--;
 #ifdef UNIV_SYNC_DEBUG
@@ -1349,7 +1359,7 @@
 			rw_lock_x_unlock(&(block->lock));
 		}
 
-		mutex_enter(&(buf_pool->mutex));
+		mutex_enter(&(block->blockmutex));
 		
 		block->buf_fix_count--;
 #ifdef UNIV_SYNC_DEBUG
@@ -1412,9 +1422,9 @@
 	ut_ad(mtr);
 	ut_ad((rw_latch == RW_S_LATCH) || (rw_latch == RW_X_LATCH));
 	
-	mutex_enter(&(buf_pool->mutex));
 
 	block = buf_block_align(guess);
+	mutex_enter(&(block->blockmutex));
 
 	if (block->state == BUF_BLOCK_REMOVE_HASH) {
 	        /* Another thread is just freeing the block from the LRU list
@@ -1424,7 +1434,7 @@
 		we have already removed it from the page address hash table
 		of the buffer pool. */
 
-	        mutex_exit(&(buf_pool->mutex));
+	        mutex_exit(&(block->blockmutex));
 
 		return(FALSE);
 	}
@@ -1436,6 +1446,8 @@
 #else
 	buf_block_buf_fix_inc(block);
 #endif
+	mutex_exit(&(block->blockmutex));
+	mutex_enter(&(buf_pool->mutex));
 	if (mode == BUF_MAKE_YOUNG) {
 		buf_block_make_young(block);
 	}
@@ -1455,13 +1467,13 @@
 	}
 	
 	if (!success) {
-		mutex_enter(&(buf_pool->mutex));
+		mutex_enter(&(block->blockmutex));
 		
 		block->buf_fix_count--;
 #ifdef UNIV_SYNC_DEBUG
 		rw_lock_s_unlock(&(block->debug_latch));
 #endif		
-		mutex_exit(&(buf_pool->mutex));
+		mutex_exit(&(block->blockmutex));
 
 		return(FALSE);
 	}
diff -ru mysql-5.0.22/innobase/include/buf0buf.h mysql-5.0.22-scale/innobase/include/buf0buf.h
--- mysql-5.0.22/innobase/include/buf0buf.h	2006-05-25 10:56:47.000000000 +0200
+++ mysql-5.0.22-scale/innobase/include/buf0buf.h	2006-08-03 14:24:40.000000000 +0200
@@ -735,6 +735,7 @@
 					record lock hash table */
 	rw_lock_t	lock;		/* read-write lock of the buffer
 					frame */
+	mutex_t		blockmutex;
 	buf_block_t*	hash;		/* node used in chaining to the page
 					hash table */
 	ibool		check_index_page_at_flush;
diff -ru mysql-5.0.22/innobase/include/buf0buf.ic mysql-5.0.22-scale/innobase/include/buf0buf.ic
--- mysql-5.0.22/innobase/include/buf0buf.ic	2006-05-25 10:56:54.000000000 +0200
+++ mysql-5.0.22-scale/innobase/include/buf0buf.ic	2006-08-03 14:24:40.000000000 +0200
@@ -618,8 +618,10 @@
 	
 	ut_ad(block);
 
-	mutex_enter_fast(&(buf_pool->mutex));
+	mutex_enter_fast(&(block->blockmutex));
 
+	
+//	fprintf(stderr, "release block %px\n", block);
 	ut_a(block->state == BUF_BLOCK_FILE_PAGE);
 	ut_a(block->buf_fix_count > 0);
 
@@ -634,7 +636,7 @@
 	buf_fix_count = block->buf_fix_count;
 	block->buf_fix_count = buf_fix_count - 1;
 
-	mutex_exit(&(buf_pool->mutex));
+	mutex_exit(&(block->blockmutex));
 
 	if (rw_latch == RW_S_LATCH) {
 		rw_lock_s_unlock(&(block->lock));
