[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[hurd] 14/19: libpager: provide 'pager_create_alloc'
From: |
Samuel Thibault |
Subject: |
[hurd] 14/19: libpager: provide 'pager_create_alloc' |
Date: |
Wed, 10 Aug 2016 00:05:50 +0000 |
This is an automated email from the git hooks/post-receive script.
sthibault pushed a commit to branch upstream
in repository hurd.
commit 0e3a795af98b6441d0a9928036e140978511e272
Author: Justus Winter <address@hidden>
Date: Sun May 22 19:35:10 2016 +0200
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.
---
console/pager.c | 22 ++++++++--------------
doc/hurd.texi | 5 +++++
ext2fs/pager.c | 25 +++++++++++--------------
fatfs/pager.c | 21 +++++++++------------
isofs/pager.c | 18 +++++++++---------
libpager/pager-create.c | 50 ++++++++++++++++++++++++++++++++++++++++---------
libpager/pager.h | 8 ++++++++
7 files changed, 91 insertions(+), 58 deletions(-)
diff --git a/console/pager.c b/console/pager.c
index 05074a7..d60935a 100644
--- a/console/pager.c
+++ b/console/pager.c
@@ -49,12 +49,11 @@ static struct pager_requests *pager_requests;
void
pager_clear_user_data (struct user_pager_info *upi)
{
- int idx;
+ size_t idx;
for (idx = 0; idx < upi->memobj_npages; idx++)
if (upi->memobj_pages[idx])
vm_deallocate (mach_task_self (), upi->memobj_pages[idx], vm_page_size);
- free (upi);
}
@@ -148,21 +147,17 @@ user_pager_create (struct user_pager *user_pager,
unsigned int npages,
error_t err;
struct user_pager_info *upi;
- upi = calloc (1, sizeof (struct user_pager_info)
- + sizeof (vm_address_t) * npages);
- if (!upi)
+ /* XXX Are the values 1 and MEMORY_OBJECT_COPY_DELAY correct? */
+ user_pager->pager = \
+ pager_create_alloc (sizeof *upi + sizeof (vm_address_t) * npages,
+ pager_bucket, 1, MEMORY_OBJECT_COPY_DELAY, 0);
+ if (!user_pager->pager)
return errno;
+ upi = pager_get_upi (user_pager->pager);
upi->memobj_npages = npages;
+ memset (upi->memobj_pages, 0, sizeof (vm_address_t) * npages);
- /* XXX Are the values 1 and MEMORY_OBJECT_COPY_DELAY correct? */
- user_pager->pager = pager_create (upi, pager_bucket,
- 1, MEMORY_OBJECT_COPY_DELAY, 0);
- if (!user_pager->pager)
- {
- free (upi);
- return errno;
- }
user_pager->memobj = pager_get_port (user_pager->pager);
ports_port_deref (user_pager->pager);
@@ -182,7 +177,6 @@ user_pager_create (struct user_pager *user_pager, unsigned
int npages,
VM_INHERIT_NONE);
if (err)
{
- /* UPI will be cleaned up by libpager. */
mach_port_deallocate (mach_task_self (), user_pager->memobj);
return err;
}
diff --git a/doc/hurd.texi b/doc/hurd.texi
index 2bcf561..8428a77 100644
--- a/doc/hurd.texi
+++ b/doc/hurd.texi
@@ -1410,6 +1410,11 @@ create references to pagers by use of the relevant ports
library
functions. On errors, return null and set @code{errno}.
@end deftypefun
address@hidden {struct pager *} pager_create_alloc (@w{size_t
@var{u_pager_size}}, @w{struct port_bucket address@hidden, @w{boolean_t
@var{may_cache}}, @w{memory_object_copy_strategy_t @var{copy_strategy}})
+Likewise, but allocate space for the user hook adjacent to the pager
+data.
address@hidden deftypefun
+
Once you are ready to turn over control to the pager library, you should
call @code{ports_manage_port_operations_multithread} on the
@var{bucket}, using @code{pager_demuxer} as the ports @var{demuxer}.
diff --git a/ext2fs/pager.c b/ext2fs/pager.c
index 485f69c..456b582 100644
--- a/ext2fs/pager.c
+++ b/ext2fs/pager.c
@@ -822,8 +822,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 references.
@@ -1316,23 +1314,22 @@ 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);
- diskfs_node_disknode (node)->pager =
- pager_create (upi, file_pager_bucket, MAY_CACHE,
- MEMORY_OBJECT_COPY_DELAY, 0);
- if (diskfs_node_disknode (node)->pager == 0)
+ struct user_pager_info *upi;
+ pager = pager_create_alloc (sizeof *upi, file_pager_bucket,
+ MAY_CACHE, MEMORY_OBJECT_COPY_DELAY, 0);
+ if (pager == NULL)
{
- diskfs_nrele_light (node);
- free (upi);
pthread_spin_unlock (&node_to_page_lock);
return MACH_PORT_NULL;
}
+ upi = pager_get_upi (pager);
+ upi->type = FILE_DATA;
+ upi->node = node;
+ upi->max_prot = prot;
+ diskfs_nref_light (node);
+ diskfs_node_disknode (node)->pager = pager;
+
/* A weak reference for being part of the node. */
ports_port_ref_weak (diskfs_node_disknode (node)->pager);
diff --git a/fatfs/pager.c b/fatfs/pager.c
index 84376bd..bef8dbe 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);
diff --git a/isofs/pager.c b/isofs/pager.c
index b4be4e2..42cad8d 100644
--- a/isofs/pager.c
+++ b/isofs/pager.c
@@ -128,7 +128,6 @@ pager_clear_user_data (struct user_pager_info *upi)
pthread_spin_unlock (&node2pagelock);
diskfs_nrele_light (upi->np);
}
- free (upi);
}
void
@@ -176,19 +175,20 @@ diskfs_get_filemap (struct node *np, vm_prot_t prot)
do
if (!np->dn->fileinfo)
{
- upi = malloc (sizeof (struct user_pager_info));
- upi->type = FILE_DATA;
- upi->np = np;
- diskfs_nref_light (np);
- upi->p = pager_create (upi, pager_bucket, 1,
- MEMORY_OBJECT_COPY_DELAY, 0);
- if (upi->p == 0)
+ struct pager *p;
+ p = pager_create_alloc (sizeof *upi, pager_bucket, 1,
+ MEMORY_OBJECT_COPY_DELAY, 0);
+ if (p == NULL)
{
diskfs_nrele_light (np);
- free (upi);
pthread_spin_unlock (&node2pagelock);
return MACH_PORT_NULL;
}
+ upi = pager_get_upi (p);
+ upi->type = FILE_DATA;
+ upi->np = np;
+ diskfs_nref_light (np);
+ upi->p = p;
np->dn->fileinfo = upi;
right = pager_get_port (np->dn->fileinfo->p);
ports_port_deref (np->dn->fileinfo->p);
diff --git a/libpager/pager-create.c b/libpager/pager-create.c
index b583f02..b3b7c8f 100644
--- a/libpager/pager-create.c
+++ b/libpager/pager-create.c
@@ -17,21 +17,19 @@
#include "priv.h"
-/* Create and return a new pager with user info UPI. */
-struct pager *
-pager_create (struct user_pager_info *upi,
- struct port_bucket *bucket,
- boolean_t may_cache,
- memory_object_copy_strategy_t copy_strategy,
- boolean_t notify_on_evict)
+static struct pager *
+_pager_create (size_t size,
+ struct port_bucket *bucket,
+ boolean_t may_cache,
+ memory_object_copy_strategy_t copy_strategy,
+ boolean_t notify_on_evict)
{
struct pager *p;
- errno = ports_create_port (_pager_class, bucket, sizeof (struct pager), &p);
+ errno = ports_create_port (_pager_class, bucket, sizeof *p + size, &p);
if (errno)
return 0;
- p->upi = upi;
p->pager_state = NOTINIT;
pthread_mutex_init (&p->interlock, NULL);
pthread_cond_init (&p->wakeup, NULL);
@@ -50,6 +48,40 @@ pager_create (struct user_pager_info *upi,
return p;
}
+/* Create and return a new pager with user info UPI. */
+struct pager *
+pager_create (struct user_pager_info *upi,
+ struct port_bucket *bucket,
+ boolean_t may_cache,
+ memory_object_copy_strategy_t copy_strategy,
+ boolean_t notify_on_evict)
+{
+ struct pager *p;
+
+ p = _pager_create (0, bucket, may_cache, copy_strategy, notify_on_evict);
+ if (p)
+ p->upi = upi;
+
+ return p;
+}
+
+struct pager *
+pager_create_alloc (size_t u_pager_size,
+ struct port_bucket *bucket,
+ boolean_t may_cache,
+ memory_object_copy_strategy_t copy_strategy,
+ boolean_t notify_on_evict)
+{
+ struct pager *p;
+
+ p = _pager_create (u_pager_size, bucket, may_cache, copy_strategy,
+ notify_on_evict);
+ if (p)
+ p->upi = (struct user_pager_info *) ((char *) p + sizeof *p);
+
+ return p;
+}
+
/* This causes the function to be run at startup by compiler magic. */
static void create_class (void) __attribute__ ((constructor));
diff --git a/libpager/pager.h b/libpager/pager.h
index df4db68..d2a8d39 100644
--- a/libpager/pager.h
+++ b/libpager/pager.h
@@ -69,6 +69,14 @@ pager_create (struct user_pager_info *u_pager,
memory_object_copy_strategy_t copy_strategy,
boolean_t notify_on_evict);
+/* Likewise, but also allocate space for the user hook. */
+struct pager *
+pager_create_alloc (size_t u_pager_size,
+ struct port_bucket *bucket,
+ boolean_t may_cache,
+ memory_object_copy_strategy_t copy_strategy,
+ boolean_t notify_on_evict);
+
/* Return the user_pager_info struct associated with a pager. */
struct user_pager_info *
pager_get_upi (struct pager *p);
--
Alioth's /usr/local/bin/git-commit-notice on
/srv/git.debian.org/git/pkg-hurd/hurd.git
- [hurd] 05/19: Revert "drop the deprecated malloc/free hooks in hurd/mach-defpager", (continued)
- [hurd] 05/19: Revert "drop the deprecated malloc/free hooks in hurd/mach-defpager", Samuel Thibault, 2016/08/09
- [hurd] 09/19: trans/crash: fix resource leaks, Samuel Thibault, 2016/08/09
- [hurd] 06/19: Complete allocation hooks, Samuel Thibault, 2016/08/09
- [hurd] 12/19: pfinet: fix memory leak, Samuel Thibault, 2016/08/09
- [hurd] 13/19: proc: Fix references to the startup server., Samuel Thibault, 2016/08/09
- [hurd] 02/19: ext2fs: fix pager use-after-free, Samuel Thibault, 2016/08/09
- [hurd] 01/19: libdiskfs: fix error handling, Samuel Thibault, 2016/08/09
- [hurd] 07/19: Fix pipe_send() with no data, Samuel Thibault, 2016/08/09
- [hurd] 11/19: trans/crash: fix blunder, Samuel Thibault, 2016/08/09
- [hurd] 16/19: proc: Fix permission check., Samuel Thibault, 2016/08/09
- [hurd] 14/19: libpager: provide 'pager_create_alloc',
Samuel Thibault <=
- [hurd] 03/19: Make <sys/procfs.h> self-contained again, Samuel Thibault, 2016/08/09
- [hurd] 04/19: Revert part of "fix compiler warnings in hurd/exec", Samuel Thibault, 2016/08/09
- [hurd] 15/19: startup: Make the kernel a child of startup., Samuel Thibault, 2016/08/09
- [hurd] 17/19: sutils: New utility 'bless'., Samuel Thibault, 2016/08/09
- [hurd] 10/19: Do not make io_select return errors on unsupported READ/WRITE mode, Samuel Thibault, 2016/08/09
- [hurd] 08/19: nfs: appease the stricter reference counting mechanism, Samuel Thibault, 2016/08/09