diff options
Diffstat (limited to 'debian/patches/ext2fs-two-pagers.patch')
-rw-r--r-- | debian/patches/ext2fs-two-pagers.patch | 243 |
1 files changed, 0 insertions, 243 deletions
diff --git a/debian/patches/ext2fs-two-pagers.patch b/debian/patches/ext2fs-two-pagers.patch deleted file mode 100644 index 6d9d6dee..00000000 --- a/debian/patches/ext2fs-two-pagers.patch +++ /dev/null @@ -1,243 +0,0 @@ -commit 6c2cd694f8bb88181bf9a808fc63a5e6463f0386 -Author: Justus Winter <4winter@informatik.uni-hamburg.de> -Date: Sat Apr 26 19:48:18 2014 +0200 - - ext2fs: use two distinct pager buckets for the disk and file pager - - ext2fs has two kinds of pagers. One for the files, one for the disk. - Previously, both were in the same port bucket. - - If a request for a file pager arrives, it most likely touches some - metadata (like the superblock). This is in turn backed by the disk - pager, so another request is generated for the disk pager. - - Seperate all pagers clearly by using two port buckets. This will - enable us to use a single thread per port bucket in the future. - - * ext2fs/pager.c (pager_bucket): Rename to... - (disk_pager_bucket): ... this to make the change explicit at every - occurrence. - (file_pager_bucket): New variable. - (service_paging_requests): New function. - (create_disk_pager): Also create the file pager. - (diskfs_get_filemap): Handout pagers from the file_pager_bucket. - (diskfs_shutdown_pager): This is only concerned with the file pager. - Simplify code accordingly. - (diskfs_sync_everything): Likewise. - (diskfs_pager_users): Likewise. - (diskfs_max_user_pager_prot): Likewise. - (disable_caching): Iterate over both buckets. - (enable_caching): Likewise. - -diff --git a/ext2fs/pager.c b/ext2fs/pager.c -index 6e99c83..f3e9489 100644 ---- a/ext2fs/pager.c -+++ b/ext2fs/pager.c -@@ -21,14 +21,18 @@ - #include <unistd.h> - #include <string.h> - #include <errno.h> -+#include <error.h> - #include <hurd/store.h> - #include "ext2fs.h" - - /* XXX */ - #include "../libpager/priv.h" - --/* A ports bucket to hold pager ports. */ --struct port_bucket *pager_bucket; -+/* A ports bucket to hold disk pager ports. */ -+struct port_bucket *disk_pager_bucket; -+ -+/* A ports bucket to hold file pager ports. */ -+struct port_bucket *file_pager_bucket; - - pthread_spinlock_t node_to_page_lock = PTHREAD_SPINLOCK_INITIALIZER; - -@@ -1188,21 +1192,56 @@ disk_cache_block_is_ref (block_t block) - return ref; - } - --/* Create the DISK pager. */ -+/* A top-level function for the paging thread that just services paging -+ requests. */ -+static void * -+service_paging_requests (void *arg) -+{ -+ struct port_bucket *pager_bucket = arg; -+ ports_manage_port_operations_multithread (pager_bucket, -+ pager_demuxer, -+ 1000, -+ 0, -+ NULL); -+ /* Not reached. */ -+ return NULL; -+} -+ -+/* Create the disk pager, and the file pager. */ - void - create_disk_pager (void) - { -+ pthread_t thread; -+ pthread_attr_t attr; -+ error_t err; -+ -+ /* The disk pager. */ - struct user_pager_info *upi = malloc (sizeof (struct user_pager_info)); - if (!upi) - ext2_panic ("can't create disk pager: %s", strerror (errno)); - upi->type = DISK; -- pager_bucket = ports_create_bucket (); -+ disk_pager_bucket = ports_create_bucket (); - get_hypermetadata (); - disk_cache_blocks = DISK_CACHE_BLOCKS; - disk_cache_size = disk_cache_blocks << log2_block_size; -- diskfs_start_disk_pager (upi, pager_bucket, MAY_CACHE, 1, -+ diskfs_start_disk_pager (upi, disk_pager_bucket, MAY_CACHE, 1, - disk_cache_size, &disk_cache); - disk_cache_init (); -+ -+ /* The file pager. */ -+ file_pager_bucket = ports_create_bucket (); -+ -+#define STACK_SIZE (64 * 1024) -+ pthread_attr_init (&attr); -+ pthread_attr_setstacksize (&attr, STACK_SIZE); -+#undef STACK_SIZE -+ -+ /* Make a thread to service file paging requests. */ -+ err = pthread_create (&thread, &attr, -+ service_paging_requests, file_pager_bucket); -+ if (err) -+ error (2, err, "pthread_create"); -+ pthread_detach (thread); - } - - /* Call this to create a FILE_DATA pager and return a send right. -@@ -1241,7 +1280,7 @@ diskfs_get_filemap (struct node *node, vm_prot_t prot) - upi->max_prot = prot; - diskfs_nref_light (node); - node->dn->pager = -- pager_create (upi, pager_bucket, MAY_CACHE, -+ pager_create (upi, file_pager_bucket, MAY_CACHE, - MEMORY_OBJECT_COPY_DELAY, 0); - if (node->dn->pager == 0) - { -@@ -1324,14 +1363,13 @@ diskfs_shutdown_pager () - error_t shutdown_one (void *v_p) - { - struct pager *p = v_p; -- if (p != diskfs_disk_pager) -- pager_shutdown (p); -+ pager_shutdown (p); - return 0; - } - - write_all_disknodes (); - -- ports_bucket_iterate (pager_bucket, shutdown_one); -+ ports_bucket_iterate (file_pager_bucket, shutdown_one); - - /* Sync everything on the the disk pager. */ - sync_global (1); -@@ -1347,13 +1385,12 @@ diskfs_sync_everything (int wait) - error_t sync_one (void *v_p) - { - struct pager *p = v_p; -- if (p != diskfs_disk_pager) -- pager_sync (p, wait); -+ pager_sync (p, wait); - return 0; - } - - write_all_disknodes (); -- ports_bucket_iterate (pager_bucket, sync_one); -+ ports_bucket_iterate (file_pager_bucket, sync_one); - - /* Do things on the the disk pager. */ - sync_global (wait); -@@ -1372,7 +1409,8 @@ disable_caching () - - /* Loop through the pagers and turn off caching one by one, - synchronously. That should cause termination of each pager. */ -- ports_bucket_iterate (pager_bucket, block_cache); -+ ports_bucket_iterate (disk_pager_bucket, block_cache); -+ ports_bucket_iterate (file_pager_bucket, block_cache); - } - - static void -@@ -1400,7 +1438,8 @@ enable_caching () - return 0; - } - -- ports_bucket_iterate (pager_bucket, enable_cache); -+ ports_bucket_iterate (disk_pager_bucket, enable_cache); -+ ports_bucket_iterate (file_pager_bucket, enable_cache); - } - - /* Tell diskfs if there are pagers exported, and if none, then -@@ -1408,7 +1447,7 @@ enable_caching () - int - diskfs_pager_users () - { -- int npagers = ports_count_bucket (pager_bucket); -+ int npagers = ports_count_bucket (file_pager_bucket); - - if (npagers <= 1) - return 0; -@@ -1421,8 +1460,8 @@ diskfs_pager_users () - immediately. XXX */ - sleep (1); - -- npagers = ports_count_bucket (pager_bucket); -- if (npagers <= 1) -+ npagers = ports_count_bucket (file_pager_bucket); -+ if (npagers == 0) - return 0; - - /* Darn, there are actual honest users. Turn caching back on, -@@ -1430,7 +1469,7 @@ diskfs_pager_users () - enable_caching (); - } - -- ports_enable_bucket (pager_bucket); -+ ports_enable_bucket (file_pager_bucket); - - return 1; - } -@@ -1441,17 +1480,15 @@ vm_prot_t - diskfs_max_user_pager_prot () - { - vm_prot_t max_prot = 0; -- int npagers = ports_count_bucket (pager_bucket); -+ int npagers = ports_count_bucket (file_pager_bucket); - -- if (npagers > 1) -- /* More than just the disk pager. */ -+ if (npagers > 0) - { - error_t add_pager_max_prot (void *v_p) - { - struct pager *p = v_p; - struct user_pager_info *upi = pager_get_upi (p); -- if (upi->type == FILE_DATA) -- max_prot |= upi->max_prot; -+ max_prot |= upi->max_prot; - /* Stop iterating if MAX_PROT is as filled as it's going to get. */ - return - (max_prot == (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE)) ? 1 : 0; -@@ -1463,12 +1500,12 @@ diskfs_max_user_pager_prot () - immediately. XXX */ - sleep (1); - -- ports_bucket_iterate (pager_bucket, add_pager_max_prot); -+ ports_bucket_iterate (file_pager_bucket, add_pager_max_prot); - - enable_caching (); - } - -- ports_enable_bucket (pager_bucket); -+ ports_enable_bucket (file_pager_bucket); - - return max_prot; - } |