From 0e3a795af98b6441d0a9928036e140978511e272 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Sun, 22 May 2016 19:35:10 +0200 Subject: libpager: provide 'pager_create_alloc' Add a variant to 'pager_create' that allocates memory for the user hook next to the pager data increasing locality. * console/pager.c (pager_clear_user_data): Fix type of 'idx', do not free 'upi'. (user_pager_create): Use the new function. * doc/hurd.texi: Document new function. * ext2fs/pager.c (pager_clear_user_data): Don't free 'upi'. (diskfs_get_filemap): Use the new function. * fatfs/pager.c (pager_clear_user_data): Don't free 'upi'. (diskfs_get_filemap): Use the new function. * isofs/pager.c (pager_clear_user_data): Don't free 'upi'. (diskfs_get_filemap): Use the new function. * libpager/pager-create.c (_pager_create): New generic allocation function. (pager_create): Use the new generic function. (pager_create_alloc): New function. * libpager/pager.h (pager_create_alloc): New prototype. --- fatfs/pager.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'fatfs/pager.c') diff --git a/fatfs/pager.c b/fatfs/pager.c index 84376bd7..bef8dbeb 100644 --- a/fatfs/pager.c +++ b/fatfs/pager.c @@ -747,8 +747,6 @@ pager_clear_user_data (struct user_pager_info *upi) diskfs_nrele_light (upi->node); } - - free (upi); } /* This will be called when the ports library wants to drop weak @@ -839,22 +837,21 @@ diskfs_get_filemap (struct node *node, vm_prot_t prot) } else { - struct user_pager_info *upi = - malloc (sizeof (struct user_pager_info)); - upi->type = FILE_DATA; - upi->node = node; - upi->max_prot = prot; - diskfs_nref_light (node); + struct user_pager_info *upi; node->dn->pager = - pager_create (upi, file_pager_bucket, MAY_CACHE, - MEMORY_OBJECT_COPY_DELAY, 0); - if (node->dn->pager == 0) + pager_create_alloc (sizeof *upi, file_pager_bucket, MAY_CACHE, + MEMORY_OBJECT_COPY_DELAY, 0); + if (node->dn->pager == NULL) { diskfs_nrele_light (node); - free (upi); pthread_spin_unlock (&node_to_page_lock); return MACH_PORT_NULL; } + upi = pager_get_upi (node->dn->pager); + upi->type = FILE_DATA; + upi->node = node; + upi->max_prot = prot; + diskfs_nref_light (node); right = pager_get_port (node->dn->pager); ports_port_deref (node->dn->pager); -- cgit v1.2.3