aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2022-08-10 22:05:09 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-08-10 22:05:09 +0200
commitb14e0100f5295abd950eef636fa16df181504401 (patch)
tree8335e68359360ae50064e7164b0a25277fb33ee0
parent7c3323a25bc1d5844feb7f9ed241fdbdb4819739 (diff)
downloadhurd-b14e0100f5295abd950eef636fa16df181504401.tar.gz
hurd-b14e0100f5295abd950eef636fa16df181504401.tar.bz2
hurd-b14e0100f5295abd950eef636fa16df181504401.zip
Do not cache the R/O proxy
We cannot properly detect when to release the ro_proxy, so let's just not cache it.
-rw-r--r--ext2fs/pager.c6
-rw-r--r--fatfs/pager.c6
-rw-r--r--libdiskfs/node-drop.c1
-rw-r--r--libpager/object-terminate.c5
-rw-r--r--libpager/pager-create.c1
-rw-r--r--libpager/pager-ro-port.c35
-rw-r--r--libpager/pager.h3
-rw-r--r--libpager/priv.h2
-rw-r--r--tmpfs/node.c16
9 files changed, 22 insertions, 53 deletions
diff --git a/ext2fs/pager.c b/ext2fs/pager.c
index 105dc93d..baf2d4b7 100644
--- a/ext2fs/pager.c
+++ b/ext2fs/pager.c
@@ -1338,11 +1338,7 @@ diskfs_get_filemap (struct node *node, vm_prot_t prot)
if (prot & VM_PROT_WRITE)
right = ports_get_send_right (pager);
else
- {
- right = pager_get_ro_port (pager);
- mach_port_mod_refs (mach_task_self (), right,
- MACH_PORT_RIGHT_SEND, +1);
- }
+ right = pager_create_ro_port (pager);
ports_port_deref (pager);
diff --git a/fatfs/pager.c b/fatfs/pager.c
index d60c2eca..9a8b8d6c 100644
--- a/fatfs/pager.c
+++ b/fatfs/pager.c
@@ -861,11 +861,7 @@ diskfs_get_filemap (struct node *node, vm_prot_t prot)
if (prot & VM_PROT_WRITE)
right = ports_get_send_right (pager);
else
- {
- right = pager_get_ro_port (pager);
- mach_port_mod_refs (mach_task_self (), right,
- MACH_PORT_RIGHT_SEND, +1);
- }
+ right = pager_create_ro_port (pager);
ports_port_deref (pager);
diff --git a/libdiskfs/node-drop.c b/libdiskfs/node-drop.c
index aa00cf05..6a8ebd6d 100644
--- a/libdiskfs/node-drop.c
+++ b/libdiskfs/node-drop.c
@@ -41,6 +41,7 @@ diskfs_drop_node (struct node *np)
if (np->dn_stat.st_nlink == 0)
{
diskfs_check_readonly ();
+ // Pb when remounted readonly :/
assert_backtrace (!diskfs_readonly);
if (np->dn_stat.st_mode & S_IPTRANS)
diff --git a/libpager/object-terminate.c b/libpager/object-terminate.c
index 8e8205b5..3e7df167 100644
--- a/libpager/object-terminate.c
+++ b/libpager/object-terminate.c
@@ -115,11 +115,6 @@ _pager_free_structure (struct pager *p)
mach_port_deallocate (mach_task_self (), p->memobjname);
p->memobjname = MACH_PORT_NULL;
}
- if (p->ro_proxy != MACH_PORT_NULL)
- {
- mach_port_deallocate (mach_task_self (), p->ro_proxy);
- p->ro_proxy = MACH_PORT_NULL;
- }
/* Free the pagemap */
if (p->pagemapsize)
diff --git a/libpager/pager-create.c b/libpager/pager-create.c
index 9c3fba99..7f2f7d6e 100644
--- a/libpager/pager-create.c
+++ b/libpager/pager-create.c
@@ -42,7 +42,6 @@ _pager_create (size_t size,
p->notify_on_evict = notify_on_evict;
p->memobjcntl = MACH_PORT_NULL;
p->memobjname = MACH_PORT_NULL;
- p->ro_proxy = MACH_PORT_NULL;
p->noterm = 0;
p->termwaiting = 0;
p->pagemap = 0;
diff --git a/libpager/pager-ro-port.c b/libpager/pager-ro-port.c
index 713b0423..7772ba30 100644
--- a/libpager/pager-ro-port.c
+++ b/libpager/pager-ro-port.c
@@ -20,7 +20,7 @@
#include <mach/mach4.h>
mach_port_t
-pager_get_ro_port (struct pager *p)
+pager_create_ro_port (struct pager *p)
{
error_t err = 0;;
mach_port_t port = MACH_PORT_NULL;
@@ -29,33 +29,22 @@ pager_get_ro_port (struct pager *p)
vm_offset_t start = 0;
vm_size_t len = ~0;
- pthread_mutex_lock (&p->interlock);
-
- if (!MACH_PORT_VALID (p->ro_proxy))
+ rw_port = ports_get_send_right (p);
+ if (!MACH_PORT_VALID (rw_port))
{
- rw_port = ports_get_send_right (p);
- if (!MACH_PORT_VALID (rw_port))
- {
- err = errno;
- goto out;
- }
-
- err = memory_object_create_proxy (mach_task_self (),
- VM_PROT_READ | VM_PROT_EXECUTE,
- &rw_port, 1,
- &offset, 1, &start, 1, &len, 1,
- &p->ro_proxy);
-
- mach_port_deallocate (mach_task_self (), rw_port);
-
- if (err)
- goto out;
+ err = errno;
+ goto out;
}
- port = p->ro_proxy;
+ err = memory_object_create_proxy (mach_task_self (),
+ VM_PROT_READ | VM_PROT_EXECUTE,
+ &rw_port, 1,
+ &offset, 1, &start, 1, &len, 1,
+ &port);
+
+ mach_port_deallocate (mach_task_self (), rw_port);
out:
- pthread_mutex_unlock (&p->interlock);
errno = err;
return port;
}
diff --git a/libpager/pager.h b/libpager/pager.h
index 16b47def..3b1c7251 100644
--- a/libpager/pager.h
+++ b/libpager/pager.h
@@ -155,8 +155,9 @@ pager_change_attributes (struct pager *pager,
mach_port_t
pager_get_port (struct pager *pager);
+/* Create a read-only proxy for requests to the pager. */
mach_port_t
-pager_get_ro_port (struct pager *pager);
+pager_create_ro_port (struct pager *pager);
/* Force termination of a pager. After this returns, no
more paging requests on the pager will be honored, and the
diff --git a/libpager/priv.h b/libpager/priv.h
index 0c38a7c0..89af52ba 100644
--- a/libpager/priv.h
+++ b/libpager/priv.h
@@ -55,8 +55,6 @@ struct pager
memory_object_control_t memobjcntl;
memory_object_name_t memobjname;
- memory_object_t ro_proxy;
-
int noterm; /* number of threads blocking termination */
int termwaiting:1;
diff --git a/tmpfs/node.c b/tmpfs/node.c
index 1a73a164..ed04a8df 100644
--- a/tmpfs/node.c
+++ b/tmpfs/node.c
@@ -73,11 +73,9 @@ diskfs_free_node (struct node *np, mode_t mode)
switch (np->dn->type)
{
case DT_REG:
+ if (np->dn->u.reg.memobj != MACH_PORT_NULL) {
/* XXX GNU Mach will terminate the object, and thus existing mappings
* will get SIGBUS. */
- if (np->dn->u.reg.ro_memobj != MACH_PORT_NULL)
- mach_port_deallocate (mach_task_self (), np->dn->u.reg.ro_memobj);
- if (np->dn->u.reg.memobj != MACH_PORT_NULL) {
vm_deallocate (mach_task_self (), np->dn->u.reg.memref, 4096);
mach_port_deallocate (mach_task_self (), np->dn->u.reg.memobj);
}
@@ -567,7 +565,7 @@ diskfs_get_filemap (struct node *np, vm_prot_t prot)
if (prot & VM_PROT_WRITE)
right = np->dn->u.reg.memobj;
- else if (np->dn->u.reg.ro_memobj == MACH_PORT_NULL)
+ else
{
vm_offset_t offset = 0;
vm_offset_t start = 0;
@@ -576,21 +574,17 @@ diskfs_get_filemap (struct node *np, vm_prot_t prot)
VM_PROT_READ | VM_PROT_EXECUTE,
&np->dn->u.reg.memobj, 1,
&offset, 1, &start, 1, &len, 1,
- &np->dn->u.reg.ro_memobj);
+ &right);
if (err)
{
errno = err;
return MACH_PORT_NULL;
}
-
- right = np->dn->u.reg.ro_memobj;
}
- else
- right = np->dn->u.reg.ro_memobj;
/* Add a reference for each call, the caller will deallocate it. */
- err = mach_port_mod_refs (mach_task_self (), right,
- MACH_PORT_RIGHT_SEND, +1);
+ err = mach_port_mod_refs (mach_task_self (), np->dn->u.reg.memobj,
+ MACH_PORT_RIGHT_SEND, +1);
assert_perror_backtrace (err);
return right;