Hi,

It seems that the bug#15403[1] reply didn't get CCed to bug-hurd, so
here it is:
https://savannah.gnu.org/bugs/?func=detailitem&item_id=15403

===

Some tests seem to show that only stacked objects can be mlock()ed.

Mlock() is implemented through vm_wire(blabla, VM_PROT_ALL): `Specify
that the range of the virtual address space of the target task must not
cause page faults for the indicated accesses.'

This is wrong: doing it on text segments can't work for instance,
since page-write faults must still occur on them (since they're
read-only). Same remark for data segments / executability,
etc. The actual check is performed in vm_map_pageable_common():
if (entry->protection & access_type) != access_type, it returns
KERN_FAILURE.

A simple solution would be to change the implementation of mlock(): make
it call just vm_wire(blabla, VM_PROT_READ), which will work for both
code, data, and stack. Yes, it is sufficient for preventing the process
from copy-on-write faults too, because even if VM_PROT_WRITE is not
given, vm_map_pageable_common() will perform the copy. This solution
will however probably not work for pages that were mprotect(PROT_NONE)
-ed (i.e. entry->protection == 0, not even VM_PROT_READ).

Another solution would be to add an additionnal VM_PROT_LOCKED flag that
would exactly mean what mlock() needs: the page is resident and no copy
on write will happen. And then use only that one in glibc. It shouldn't
be very difficult to implement.

Regards,
Samuel


_______________________________________________
Bug-hurd mailing list
Bug-hurd@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-hurd

Reply via email to