diff options
-rw-r--r-- | debian/patches/ext2fs_large_stores_pthread.patch | 346 | ||||
-rw-r--r-- | debian/patches/series | 1 |
2 files changed, 347 insertions, 0 deletions
diff --git a/debian/patches/ext2fs_large_stores_pthread.patch b/debian/patches/ext2fs_large_stores_pthread.patch new file mode 100644 index 00000000..292d7690 --- /dev/null +++ b/debian/patches/ext2fs_large_stores_pthread.patch @@ -0,0 +1,346 @@ +commit 93691ae1ae88c2d66d240b50e3ea5827f8a96c22 +Author: Richard Braun <rbraun@sceen.net> +Date: Mon Sep 3 22:19:16 2012 +0200 + + Move large storage patch to pthreads + +diff --git a/ext2fs/ext2fs.h b/ext2fs/ext2fs.h +index 71fba04..8cd8c5a 100644 +--- a/ext2fs/ext2fs.h ++++ b/ext2fs/ext2fs.h +@@ -260,7 +260,7 @@ extern hurd_ihash_t disk_cache_bptr; + /* Metadata about cached block. */ + extern struct disk_cache_info *disk_cache_info; + /* Lock for these mappings */ +-extern struct mutex disk_cache_lock; ++extern pthread_mutex_t disk_cache_lock; + /* Fired when a re-association is done. */ + extern struct condition disk_cache_reassociation; + +@@ -345,9 +345,9 @@ EXT2FS_EI char * + boffs_ptr (off_t offset) + { + block_t block = boffs_block (offset); +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + char *ptr = hurd_ihash_find (disk_cache_bptr, block); +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + assert (ptr); + ptr += offset % block_size; + ext2_debug ("(%Ld) = %p", offset, ptr); +@@ -361,12 +361,12 @@ bptr_offs (void *ptr) + vm_offset_t mem_offset = (char *)ptr - (char *)disk_cache; + off_t offset; + assert (mem_offset < disk_cache_size); +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + offset = (off_t) disk_cache_info[boffs_block (mem_offset)].block + << log2_block_size; + assert (offset || mem_offset < block_size); + offset += mem_offset % block_size; +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + ext2_debug ("(%p) = %Ld", ptr, offset); + return offset; + } +diff --git a/ext2fs/pager.c b/ext2fs/pager.c +index 2bec88d..67c9922 100644 +--- a/ext2fs/pager.c ++++ b/ext2fs/pager.c +@@ -418,7 +418,7 @@ disk_pager_read_page (vm_offset_t page, void **buf, int *writelock) + size_t length = vm_page_size, read = 0; + store_offset_t offset = page, dev_end = store->size; + +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + int index = offset >> log2_block_size; + offset = ((store_offset_t) disk_cache_info[index].block << log2_block_size) + + offset % block_size; +@@ -430,7 +430,7 @@ disk_pager_read_page (vm_offset_t page, void **buf, int *writelock) + = disk_cache_info[index].block ^ DISK_CACHE_LAST_READ_XOR; + #endif + ext2_debug ("(%Ld)", offset >> log2_block_size); +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + + if (offset + vm_page_size > dev_end) + length = dev_end - offset; +@@ -454,7 +454,7 @@ disk_pager_write_page (vm_offset_t page, void *buf) + size_t length = vm_page_size, amount; + store_offset_t offset = page, dev_end = store->size; + +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + int index = offset >> log2_block_size; + assert (disk_cache_info[index].block != DC_NO_BLOCK); + offset = ((store_offset_t) disk_cache_info[index].block << log2_block_size) +@@ -465,7 +465,7 @@ disk_pager_write_page (vm_offset_t page, void *buf) + assert (disk_cache_info[index].last_read + == disk_cache_info[index].block); + #endif +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + + if (offset + vm_page_size > dev_end) + length = dev_end - offset; +@@ -526,9 +526,9 @@ disk_pager_notify_evict (vm_offset_t page) + + ext2_debug ("(block %u)", index); + +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + disk_cache_info[index].flags &= ~DC_INCORE; +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + } + + /* Satisfy a pager read request for either the disk pager or file pager +@@ -835,7 +835,7 @@ struct disk_cache_info *disk_cache_info; + /* Hint index for which cache block to reuse next. */ + int disk_cache_hint; + /* Lock for these structures. */ +-struct mutex disk_cache_lock; ++pthread_mutex_t disk_cache_lock; + /* Fired when a re-association is done. */ + struct condition disk_cache_reassociation; + +@@ -847,7 +847,7 @@ disk_cache_init (void) + ext2_panic ("Block size %d != vm_page_size %d", + block_size, vm_page_size); + +- mutex_init (&disk_cache_lock); ++ pthread_mutex_init (&disk_cache_lock, NULL); + condition_init (&disk_cache_reassociation); + + /* Allocate space for block num -> in-memory pointer mapping. */ +@@ -904,7 +904,7 @@ disk_cache_return_unused (void) + + /* Return unused pages that are in core. */ + int pending_begin = -1, pending_end = -1; +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + for (index = 0; index < disk_cache_blocks; index++) + if (! (disk_cache_info[index].flags & (DC_DONT_REUSE & ~DC_INCORE)) + && ! disk_cache_info[index].ref_count) +@@ -916,13 +916,13 @@ disk_cache_return_unused (void) + /* Return previous region, if there is such, ... */ + if (pending_end >= 0) + { +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + pager_return_some (diskfs_disk_pager, + pending_begin * vm_page_size, + (pending_end - pending_begin) + * vm_page_size, + 1); +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + } + /* ... and start new region. */ + pending_begin = index; +@@ -930,7 +930,7 @@ disk_cache_return_unused (void) + pending_end = index + 1; + } + +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + + /* Return last region, if there is such. */ + if (pending_end >= 0) +@@ -958,7 +958,7 @@ disk_cache_block_ref (block_t block) + + ext2_debug ("(%u)", block); + +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + + bptr = hurd_ihash_find (disk_cache_bptr, block); + if (bptr) +@@ -971,7 +971,7 @@ disk_cache_block_ref (block_t block) + { + /* Wait re-association to finish. */ + condition_wait (&disk_cache_reassociation, &disk_cache_lock); +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + + #if 0 + printf ("Re-association -- wait finished.\n"); +@@ -991,7 +991,7 @@ disk_cache_block_ref (block_t block) + disk_cache_info[index].ref_count, + disk_cache_info[index].flags, bptr); + +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + + return bptr; + } +@@ -1030,7 +1030,7 @@ disk_cache_block_ref (block_t block) + { + ext2_debug ("flush %u -> %d", disk_cache_info[index].block, index); + +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + + disk_cache_return_unused (); + +@@ -1050,9 +1050,9 @@ disk_cache_block_ref (block_t block) + + #if 0 /* XXX: Let's see if this is needed at all. */ + +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + pager_return_some (diskfs_disk_pager, bptr - disk_cache, vm_page_size, 1); +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + + /* Has someone used our bptr? Has someone mapped requested block + while we have unlocked disk_cache_lock? If so, environment has +@@ -1060,7 +1060,7 @@ disk_cache_block_ref (block_t block) + if ((! (disk_cache_info[index].flags & DC_UNTOUCHED)) + || hurd_ihash_find (disk_cache_bptr, block)) + { +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + return disk_cache_block_ref (block); /* tail recursion */ + } + +@@ -1068,15 +1068,15 @@ disk_cache_block_ref (block_t block) + + /* XXX: Use libpager internals. */ + +- mutex_lock (&diskfs_disk_pager->interlock); ++ pthread_mutex_lock (&diskfs_disk_pager->interlock); + int page = (bptr - disk_cache) / vm_page_size; + assert (page >= 0); + int is_incore = (page < diskfs_disk_pager->pagemapsize + && (diskfs_disk_pager->pagemap[page] & PM_INCORE)); +- mutex_unlock (&diskfs_disk_pager->interlock); ++ pthread_mutex_unlock (&diskfs_disk_pager->interlock); + if (is_incore) + { +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + printf ("INCORE\n"); + return disk_cache_block_ref (block); /* tail recursion */ + } +@@ -1096,13 +1096,13 @@ disk_cache_block_ref (block_t block) + disk_cache_info[index].ref_count = 1; + + /* All data structures are set up. */ +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + + /* Try to read page. */ + *(volatile char *) bptr; + + /* Check if it's actually read. */ +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + if (disk_cache_info[index].flags & DC_UNTOUCHED) + /* It's not read. */ + { +@@ -1111,7 +1111,7 @@ disk_cache_block_ref (block_t block) + disk_cache_info[index].block = DC_NO_BLOCK; + disk_cache_info[index].flags &=~ DC_UNTOUCHED; + disk_cache_info[index].ref_count = 0; +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + + /* Prepare next time association of this page to succeed. */ + pager_flush_some (diskfs_disk_pager, bptr - disk_cache, +@@ -1124,7 +1124,7 @@ disk_cache_block_ref (block_t block) + /* Try again. */ + return disk_cache_block_ref (block); /* tail recursion */ + } +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + + /* Re-association was successful. */ + condition_broadcast (&disk_cache_reassociation); +@@ -1138,7 +1138,7 @@ disk_cache_block_ref_ptr (void *ptr) + { + int index; + +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + index = bptr_index (ptr); + assert (disk_cache_info[index].ref_count >= 1); + assert (disk_cache_info[index].ref_count + 1 +@@ -1149,7 +1149,7 @@ disk_cache_block_ref_ptr (void *ptr) + ptr, + disk_cache_info[index].ref_count, + disk_cache_info[index].flags); +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + } + + void +@@ -1159,7 +1159,7 @@ disk_cache_block_deref (void *ptr) + + assert (disk_cache <= ptr && ptr <= disk_cache + disk_cache_size); + +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + index = bptr_index (ptr); + ext2_debug ("(%p) (ref_count = %d, flags = 0x%x)", + ptr, +@@ -1168,7 +1168,7 @@ disk_cache_block_deref (void *ptr) + assert (! (disk_cache_info[index].flags & DC_UNTOUCHED)); + assert (disk_cache_info[index].ref_count >= 1); + disk_cache_info[index].ref_count--; +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + } + + /* Not used. */ +@@ -1178,13 +1178,13 @@ disk_cache_block_is_ref (block_t block) + int ref; + void *ptr; + +- mutex_lock (&disk_cache_lock); ++ pthread_mutex_lock (&disk_cache_lock); + ptr = hurd_ihash_find (disk_cache_bptr, block); + if (! ptr) + ref = 0; + else /* XXX: Should check for DC_UNTOUCHED too. */ + ref = disk_cache_info[bptr_index (ptr)].ref_count; +- mutex_unlock (&disk_cache_lock); ++ pthread_mutex_unlock (&disk_cache_lock); + + return ref; + } +diff --git a/libpager/data-return.c b/libpager/data-return.c +index 24533e7..0d71db7 100644 +--- a/libpager/data-return.c ++++ b/libpager/data-return.c +@@ -243,9 +243,9 @@ _pager_do_write_request (mach_port_t object, + /* Clear any error that is left. Notification on eviction + is used only to change association of page, so any + error may no longer be valid. */ +- mutex_lock (&p->interlock); ++ pthread_mutex_lock (&p->interlock); + *pm_entry = SET_PM_ERROR (SET_PM_NEXTERROR (*pm_entry, 0), 0); +- mutex_unlock (&p->interlock); ++ pthread_mutex_unlock (&p->interlock); + } + } + +diff --git a/libpager/lock-object.c b/libpager/lock-object.c +index 93c89f0..c022d0c 100644 +--- a/libpager/lock-object.c ++++ b/libpager/lock-object.c +@@ -65,11 +65,11 @@ _pager_lock_object (struct pager *p, + } + } + +- mutex_unlock (&p->interlock); ++ pthread_mutex_unlock (&p->interlock); + memory_object_lock_request (p->memobjcntl, offset, size, should_return, + should_flush, lock_value, + sync ? p->port.port_right : MACH_PORT_NULL); +- mutex_lock (&p->interlock); ++ pthread_mutex_lock (&p->interlock); + + if (sync) + { diff --git a/debian/patches/series b/debian/patches/series index 5372552b..b1769c82 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,5 +1,6 @@ diskfs_no_inherit_dir_group.patch ext2fs_large_stores.patch +ext2fs_large_stores_pthread.patch hurd_console_startup.patch init_try_runsystem.gnu.patch install-msgids.diff |