Re: [PATCH glibc v1 1/1] hurd: let the root user raise its priority

Samuel Thibault <[email protected]>
Newsgroups gmane.os.hurd.bugs
Organization I am not organized
Message-ID <ahTBvAqQ7YZ6vPVN@end>
And applied the rest, thanks!

Samuel

[email protected], le mer. 20 mai 2026 23:49:27 +0100, a ecrit:
> From: Diego Nieto Cid <[email protected]>
> 
>     Check for task_max_priority RPC
> 
>       * config.h.in: add #undef for HAVE_MACH_TASK_MAX_PRIORITY.
>       * sysdeps/mach/configure.ac: use mach_RPC_CHECK to check for
>         task_max_priority RPC in mach_host.defs.
>       * sysdeps/mach/configure: regenerate file.
> 
>     Use task_max_priority when setpriority is called by root
> 
>       * sysdeps/mach/hurd/setpriority.c: clamp the prio argument
>         to the range [-NZERO, NZERO-1] and use task_max_priority
>         when called by root.
> ---
>  config.h.in                     |  3 +++
>  sysdeps/mach/configure          | 30 ++++++++++++++++++++++++
>  sysdeps/mach/configure.ac       |  2 ++
>  sysdeps/mach/hurd/setpriority.c | 41 +++++++++++++++++++++++++++++++--
>  4 files changed, 74 insertions(+), 2 deletions(-)
> 
> diff --git a/config.h.in b/config.h.in
> index b53731c393..87befaa9c6 100644
> --- a/config.h.in
> +++ b/config.h.in
> @@ -170,6 +170,9 @@
>  /* Mach specific: define if the `vm_set_size_limit' RPC is available.  */
>  #undef  HAVE_MACH_VM_SET_SIZE_LIMIT
>  
> +/* Mach specific: define if the `task_max_priority' RPC is available.  */
> +#undef  HAVE_MACH_TASK_MAX_PRIORITY
> +
>  /* Mach/i386 specific: define if the `i386_io_perm_*' RPCs are available.  */
>  #undef	HAVE_I386_IO_PERM_MODIFY
>  
> diff --git a/sysdeps/mach/configure b/sysdeps/mach/configure
> index 0161937ab4..a725cd1c7d 100755
> --- a/sysdeps/mach/configure
> +++ b/sysdeps/mach/configure
> @@ -641,6 +641,36 @@ if test $libc_cv_mach_rpc_vm_get_size_limit = yes; then
>  
>  fi
>  
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for task_max_priority in mach_host.defs" >&5
> +printf %s "checking for task_max_priority in mach_host.defs... " >&6; }
> +if test ${libc_cv_mach_rpc_task_max_priority+y}
> +then :
> +  printf %s "(cached) " >&6
> +else case e in #(
> +  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +#include <mach/mach_host.defs>
> +
> +_ACEOF
> +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
> +  $EGREP_TRADITIONAL "task_max_priority" >/dev/null 2>&1
> +then :
> +  libc_cv_mach_rpc_task_max_priority=yes
> +else case e in #(
> +  e) libc_cv_mach_rpc_task_max_priority=no ;;
> +esac
> +fi
> +rm -rf conftest*
> + ;;
> +esac
> +fi
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_mach_rpc_task_max_priority" >&5
> +printf "%s\n" "$libc_cv_mach_rpc_task_max_priority" >&6; }
> +if test $libc_cv_mach_rpc_task_max_priority = yes; then
> +  printf "%s\n" "#define HAVE_MACH_TASK_MAX_PRIORITY 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 237b8be937..b591e6fd9b 100644
> --- a/sysdeps/mach/configure.ac
> +++ b/sysdeps/mach/configure.ac
> @@ -104,6 +104,8 @@ 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)
> +mach_RPC_CHECK(mach_host.defs, task_max_priority,
> +	       HAVE_MACH_TASK_MAX_PRIORITY)
>  
>  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/setpriority.c b/sysdeps/mach/hurd/setpriority.c
> index 23d678bf40..bda13b0d7f 100644
> --- a/sysdeps/mach/hurd/setpriority.c
> +++ b/sysdeps/mach/hurd/setpriority.c
> @@ -28,7 +28,30 @@ __setpriority (enum __priority_which which, id_t who, int prio)
>    error_t pidloser, priloser;
>    unsigned int npids, ntasks, nwin, nperm, nacces;
>  
> -  prio = MAX (0, MIN (2 * NZERO - 1, prio));
> +  /*   * man getpriority(2) (i.e. man7.org)
> +   *
> +   *     << The prio argument is a value in the range -20 to 19. >>
> +   *
> +   *   * man nice(2)  (i.e. man7.org)
> +   *
> +   *     << Attempts to set a nice value outside the range are
> +   *       clamped to the range. >>
> +   *
> +   *   * The Open Group Base Specifications Issue 8
> +   *     getpriority ( https://pubs.opengroup.org/onlinepubs/9799919799/ )
> +   *
> +   *     << The nice value is in the range [0,2*{NZERO} -1], while the
> +   *        return value for getpriority() and the third parameter for
> +   *        setpriority() are in the range [-{NZERO},{NZERO} -1]. >>
> +   *
> +   *  So given that NZERO is defined to 20, we can use it to clamp to
> +   *  the range specified by POSIX, in concordance with the Linux man pages.
> +   *
> +   *  That range is then mapped to something similar to [0, 2*{NZERO}-1], as
> +   *  specified by POSIX, through the usage of the macro NICE_TO_MACH_PRIORITY
> +   *  and MACK_PRIORITY_TO_NICE. (i.e. [5, 45] )
> +   */
> +  prio = MAX ((-NZERO), MIN ((NZERO - 1), prio));
>  
>    error_t setonepriority (pid_t pid, struct procinfo *pi)
>      {
> @@ -57,11 +80,25 @@ __setpriority (enum __priority_which which, id_t who, int prio)
>  				    0, 1);
>  	  }
>  #else
> -	  prierr = __task_priority (task, NICE_TO_MACH_PRIORITY (prio), 1);
> +	  do {
> +#ifdef HAVE_MACH_TASK_MAX_PRIORITY
> +	    mach_port_t host = MACH_PORT_NULL;
> +	    error_t priverr = __get_privileged_ports (&host, NULL);
> +	    if (!priverr)
> +	      {
> +		prierr = __task_max_priority (host, task, NICE_TO_MACH_PRIORITY (prio), 1, 1);
> +		__mach_port_deallocate (__mach_task_self (), host);
> +		if (prierr != MIG_BAD_ID)
> +		  break;
> +	      }
> +#endif
> +	    prierr = __task_priority (task, NICE_TO_MACH_PRIORITY (prio), 1);
> +	  } while (0);
>  #endif
>  	  __mach_port_deallocate (__mach_task_self (), task);
>  	  switch (prierr)
>  	    {
> +	    case KERN_NO_ACCESS:
>  	    case KERN_FAILURE:
>  	      ++nacces;
>  	      break;
> -- 
> 2.53.0
> 
> 

-- 
Samuel
<y> le y est un animal discret se logeant facilement dans un terminal
*** c has changed the topic on channel #ens-mim to ne pas jeter de cacahuetes aux ys, svp
 -+- #ens-mim - n'oubliez pas le guide -+-
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.