This looks good, I'll just wait for landing the gnumach part before landing this.
Samuel dnie...@gmail.com, le ven. 15 août 2025 02:57:30 +0100, a ecrit: > From: Diego Nieto Cid <dnie...@gmail.com> > > Check for VM limit RPCs > > * config.h.in: add #undef for HAVE_MACH_VM_GET_SIZE_LIMIT and > HAVE_MACH_VM_SET_SIZE_LIMIT. > * sysdeps/mach/configure.ac: use mach_RPC_CHECK to check for > vm_set_size_limit and vm_get_size_limit RPCs in gnumach.defs. > * sysdeps/mach/configure: regenerate file. > > Use vm_get_size_limit to initialize RLIMIT_AS > > * hurd/hurdrlimit.c(init_rlimit): use vm_get_size_limit to initialize > RLIMIT_AS entry of the _hurd_rlimits array. > > Notify the kernel of the new VM size limits > > * sysdeps/mach/hurd/setrlimit.c: use the vm_set_size_limit RPC, > if available, to notify the kernel of the new limits. Retry RPC > calls if they were interrupted by a signal. > --- > config.h.in | 6 ++++ > hurd/hurdrlimit.c | 5 +++ > sysdeps/mach/configure | 60 +++++++++++++++++++++++++++++++++++ > sysdeps/mach/configure.ac | 4 +++ > sysdeps/mach/hurd/setrlimit.c | 48 +++++++++++++++++++++++++++- > 5 files changed, 122 insertions(+), 1 deletion(-) > mode change 100644 => 100755 sysdeps/mach/configure > > diff --git a/config.h.in b/config.h.in > index 8b4077f578..f3af7ad616 100644 > --- a/config.h.in > +++ b/config.h.in > @@ -164,6 +164,12 @@ > /* Mach specific: define if the `thread_get_name' RPC is available. */ > #undef HAVE_MACH_THREAD_GET_NAME > > +/* Mach specific: define if the `vm_get_size_limit' RPC is available. */ > +#undef HAVE_MACH_VM_GET_SIZE_LIMIT > + > +/* Mach specific: define if the `vm_set_size_limit' RPC is available. */ > +#undef HAVE_MACH_VM_SET_SIZE_LIMIT > + > /* Mach/i386 specific: define if the `i386_io_perm_*' RPCs are available. */ > #undef HAVE_I386_IO_PERM_MODIFY > > diff --git a/hurd/hurdrlimit.c b/hurd/hurdrlimit.c > index 6cb5045bfe..271117b1e0 100644 > --- a/hurd/hurdrlimit.c > +++ b/hurd/hurdrlimit.c > @@ -37,6 +37,11 @@ init_rlimit (void) > > __mutex_init (&_hurd_rlimit_lock); > > +#ifdef HAVE_MACH_VM_GET_SIZE_LIMIT > + __vm_get_size_limit (__mach_task_self (), > + &_hurd_rlimits[RLIMIT_AS].rlim_cur, > &_hurd_rlimits[RLIMIT_AS].rlim_max); > +#endif > + > for (i = 0; i < RLIM_NLIMITS; ++i) > { > if (_hurd_rlimits[i].rlim_max == 0) > diff --git a/sysdeps/mach/configure b/sysdeps/mach/configure > old mode 100644 > new mode 100755 > index 311b2dd30b..0161937ab4 > --- a/sysdeps/mach/configure > +++ b/sysdeps/mach/configure > @@ -581,6 +581,66 @@ if test $libc_cv_mach_rpc_thread_get_name = yes; then > > fi > > +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for vm_set_size_limit > in gnumach.defs" >&5 > +printf %s "checking for vm_set_size_limit in gnumach.defs... " >&6; } > +if test ${libc_cv_mach_rpc_vm_set_size_limit+y} > +then : > + printf %s "(cached) " >&6 > +else case e in #( > + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext > +/* end confdefs.h. */ > +#include <mach/gnumach.defs> > + > +_ACEOF > +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | > + $EGREP_TRADITIONAL "vm_set_size_limit" >/dev/null 2>&1 > +then : > + libc_cv_mach_rpc_vm_set_size_limit=yes > +else case e in #( > + e) libc_cv_mach_rpc_vm_set_size_limit=no ;; > +esac > +fi > +rm -rf conftest* > + ;; > +esac > +fi > +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: > $libc_cv_mach_rpc_vm_set_size_limit" >&5 > +printf "%s\n" "$libc_cv_mach_rpc_vm_set_size_limit" >&6; } > +if test $libc_cv_mach_rpc_vm_set_size_limit = yes; then > + printf "%s\n" "#define HAVE_MACH_VM_SET_SIZE_LIMIT 1" >>confdefs.h > + > +fi > + > +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for vm_get_size_limit > in gnumach.defs" >&5 > +printf %s "checking for vm_get_size_limit in gnumach.defs... " >&6; } > +if test ${libc_cv_mach_rpc_vm_get_size_limit+y} > +then : > + printf %s "(cached) " >&6 > +else case e in #( > + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext > +/* end confdefs.h. */ > +#include <mach/gnumach.defs> > + > +_ACEOF > +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | > + $EGREP_TRADITIONAL "vm_get_size_limit" >/dev/null 2>&1 > +then : > + libc_cv_mach_rpc_vm_get_size_limit=yes > +else case e in #( > + e) libc_cv_mach_rpc_vm_get_size_limit=no ;; > +esac > +fi > +rm -rf conftest* > + ;; > +esac > +fi > +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: > $libc_cv_mach_rpc_vm_get_size_limit" >&5 > +printf "%s\n" "$libc_cv_mach_rpc_vm_get_size_limit" >&6; } > +if test $libc_cv_mach_rpc_vm_get_size_limit = yes; then > + printf "%s\n" "#define HAVE_MACH_VM_GET_SIZE_LIMIT 1" >>confdefs.h > + > +fi > + > > ac_fn_c_check_header_preproc "$LINENO" "mach/machine/ndr_def.h" > "ac_cv_header_mach_machine_ndr_def_h" > if test "x$ac_cv_header_mach_machine_ndr_def_h" = xyes > diff --git a/sysdeps/mach/configure.ac b/sysdeps/mach/configure.ac > index 3a6f2443e2..237b8be937 100644 > --- a/sysdeps/mach/configure.ac > +++ b/sysdeps/mach/configure.ac > @@ -100,6 +100,10 @@ mach_RPC_CHECK(gnumach.defs, thread_set_name, > HAVE_MACH_THREAD_SET_NAME) > mach_RPC_CHECK(gnumach.defs, thread_get_name, > HAVE_MACH_THREAD_GET_NAME) > +mach_RPC_CHECK(gnumach.defs, vm_set_size_limit, > + HAVE_MACH_VM_SET_SIZE_LIMIT) > +mach_RPC_CHECK(gnumach.defs, vm_get_size_limit, > + HAVE_MACH_VM_GET_SIZE_LIMIT) > > AC_CHECK_HEADER(mach/machine/ndr_def.h, [dnl > DEFINES="$DEFINES -DNDR_DEF_HEADER='<mach/machine/ndr_def.h>'"], [dnl > diff --git a/sysdeps/mach/hurd/setrlimit.c b/sysdeps/mach/hurd/setrlimit.c > index cbc172ee75..738a8a60b0 100644 > --- a/sysdeps/mach/hurd/setrlimit.c > +++ b/sysdeps/mach/hurd/setrlimit.c > @@ -28,6 +28,8 @@ int > __setrlimit (enum __rlimit_resource resource, const struct rlimit *rlimits) > { > struct rlimit lim; > + error_t err = 0; > + mach_port_t host = MACH_PORT_NULL; > > if (rlimits == NULL || (unsigned int) resource >= RLIMIT_NLIMITS) > return __hurd_fail (EINVAL); > @@ -41,13 +43,57 @@ __setrlimit (enum __rlimit_resource resource, const > struct rlimit *rlimits) > if (lim.rlim_cur > lim.rlim_max) > lim.rlim_cur = lim.rlim_max; > > +retry: > HURD_CRITICAL_BEGIN; > __mutex_lock (&_hurd_rlimit_lock); > + > +#ifdef HAVE_MACH_VM_SET_SIZE_LIMIT > + if (resource == RLIMIT_AS) > + { > + if (host == MACH_PORT_NULL) > + { > + /* Check whether the privileged host control port is required */ > + if (_hurd_rlimits[resource].rlim_max < lim.rlim_max) > + { > + err = __get_privileged_ports (&host, NULL); > + if (err) > + goto fail; > + } > + else > + host = __mach_host_self (); > + } > + > + err = __vm_set_size_limit (host, __mach_task_self (), > + lim.rlim_cur, lim.rlim_max); > + > + if (err == MIG_BAD_ID) > + /* MIG_BAD_ID returned as kernel support is missing, clear error */ > + err = 0; > + else if (err) > + { > + if (err == KERN_NO_ACCESS) > + err = EPERM; > + goto fail; > + } > + } > +#endif > + > _hurd_rlimits[resource] = lim; > + > +#ifdef HAVE_MACH_VM_SET_SIZE_LIMIT > +fail: > +#endif > __mutex_unlock (&_hurd_rlimit_lock); > HURD_CRITICAL_END; > > - return 0; > + if (err == EINTR) > + /* Got a signal while inside an RPC of the critical section, retry */ > + goto retry; > + > + if (host != MACH_PORT_NULL && host != __mach_host_self ()) > + __mach_port_deallocate (__mach_task_self (), host); > + > + return __hurd_fail (err); > } > > libc_hidden_def (__setrlimit) > -- > 2.50.0 > > -- Samuel --- christ gives channel operator status to Dieu -+- #ens-mim and hell -+-