Re: [PATCH v2 hurd] sutils: Add smp tool to run process on slave processors

2024-12-08 Thread Samuel Thibault
Applied the non-Debian part, thanks!

Damien Zammit via Bug reports for the GNU Hurd, le mar. 26 nov. 2024 10:37:58 
+, a ecrit:
> Until we make gnumach fully parallel, we need a way to execute
> on slave processor set on smp-enabled gnumach.
> 
> For example:
>   $ /sbin/smp /bin/bash
>   $
> 
> will launch a shell that executes commands only within slave pset,
> consisting of all processors except processor 0.
> 
> We can thus test parallelism on Hurd in a controlled way.
> ---
>  debian/hurd.install.in |  1 +
>  debian/rules   |  2 +-
>  sutils/Makefile|  2 +-
>  sutils/smp.c   | 80 ++
>  4 files changed, 83 insertions(+), 2 deletions(-)
>  create mode 100644 sutils/smp.c
> 
> diff --git a/debian/hurd.install.in b/debian/hurd.install.in
> index 09993f2c5..8697488ba 100755
> --- a/debian/hurd.install.in
> +++ b/debian/hurd.install.in
> @@ -60,6 +60,7 @@ sbin/reboot-hurd
>  sbin/swapoff
>  sbin/swapon
>  sbin/bless
> +sbin/smp
>  usr/share/msgids
>  usr/bin/fakeroot-hurd
>  usr/bin/gcore
> diff --git a/debian/rules b/debian/rules
> index 9e24f761f..f7c55abf1 100755
> --- a/debian/rules
> +++ b/debian/rules
> @@ -59,7 +59,7 @@ endif
>  CONFIGURE_ARGS += prefix=/ includedir=/usr/include 
> libdir=/lib/$(DEB_HOST_MULTIARCH) libexecdir=/usr/libexec 
> datarootdir=/usr/share sysconfdir=/etc localstatedir=/var
>  CONFIGURE_ARGS_deb =
>  CONFIGURE_ARGS_udeb = libdir=/lib --without-libdaemon --without-libbz2
> -SUID_PROGRAMS = /bin/ids /bin/login /bin/ps-hurd /usr/bin/w-hurd
> +SUID_PROGRAMS = /bin/ids /bin/login /bin/ps-hurd /usr/bin/w-hurd /sbin/smp
>  
>  INSTALL_in := $(wildcard debian/*.install.in)
>  INSTALL_generated := $(patsubst %.in,%,$(INSTALL_in))
> diff --git a/sutils/Makefile b/sutils/Makefile
> index 5bb92c0bf..07d0fb998 100644
> --- a/sutils/Makefile
> +++ b/sutils/Makefile
> @@ -20,7 +20,7 @@
>  dir := sutils
>  makemode := utilities
>  
> -progs = reboot halt fsck swapon swapoff bless
> +progs = reboot halt fsck swapon swapoff bless smp
>  scripts = e2os MAKEDEV losetup
>  targets = $(special-targets) $(progs)
>  special-targets = $(scripts)
> diff --git a/sutils/smp.c b/sutils/smp.c
> new file mode 100644
> index 0..f91475282
> --- /dev/null
> +++ b/sutils/smp.c
> @@ -0,0 +1,80 @@
> +/* Run a task on slave_pset
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +
> +   This file is part of the GNU Hurd.
> +
> +   The GNU Hurd is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU General Public License as
> +   published by the Free Software Foundation; either version 2, or (at
> +   your option) any later version.
> +
> +   The GNU Hurd is distributed in the hope that it will be useful, but
> +   WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   General Public License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with this program; if not, write to the Free Software
> +   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +static void
> +smp (char * const argv[])
> +{
> +  int i;
> +  error_t err;
> +  mach_msg_type_number_t pset_count;
> +  mach_port_t hostpriv;
> +  processor_set_name_array_t psets = {0};
> +  processor_set_t slave_pset = MACH_PORT_NULL;
> +
> +  err = get_privileged_ports (&hostpriv, NULL);
> +  if (err)
> +error (1, err, "Must be run as root for privileged cpu control");
> +
> +  err = host_processor_sets (hostpriv, &psets, &pset_count);
> +  if (err)
> +error (1, err, "Cannot get list of host processor sets");
> +
> +  if (pset_count < 2)
> +error (1, ENOSYS, "gnumach does not have the expected processor sets, 
> are you running smp kernel?");
> +
> +  err = host_processor_set_priv (hostpriv, psets[1], &slave_pset);
> +  mach_port_deallocate (mach_task_self (), hostpriv);
> +  for (i = 0; i < pset_count; i++)
> +mach_port_deallocate (mach_task_self (), psets[i]);
> +  if (err)
> +error (1, err, "Cannot get access to slave processor set");
> +
> +  err = task_assign (mach_task_self (), slave_pset, FALSE);
> +  mach_port_deallocate (mach_task_self (), slave_pset);
> +  if (err)
> +error (1, err, "Cannot assign task self to slave processor set");
> +
> +  /* Drop privileges from suid binary */
> +  mach_port_deallocate (mach_task_self (), _hurd_host_priv);
> +  setuid (getuid ());
> +
> +  execve (argv[1], &argv[1], environ);
> +
> +  /* Fall through if not executed */
> +  error (1, errno, "failed to execute %s", argv[1]);
> +}
> +
> +int
> +main (int argc, char **argv)
> +{
> +  if (argc < 2)
> +error (1, 0, "Usage: smp /path/to/executable");
> +
> +  smp (argv);
> +  return 0;
> +}
> -- 
> 2.45.2
> 
> 
> 

-- 
Samuel
Linux, c'est simple : ça s'adresse à

Re: [PATCH v2 hurd] sutils: Add smp tool to run process on slave processors

2024-12-02 Thread Almudena Garcia
I'm waiting until this patch is accepted. It will make easier my future
work.

El mar, 26 nov 2024 a las 11:38, Damien Zammit via Bug reports for the GNU
Hurd () escribió:

> Until we make gnumach fully parallel, we need a way to execute
> on slave processor set on smp-enabled gnumach.
>
> For example:
> $ /sbin/smp /bin/bash
> $
>
> will launch a shell that executes commands only within slave pset,
> consisting of all processors except processor 0.
>
> We can thus test parallelism on Hurd in a controlled way.
> ---
>  debian/hurd.install.in |  1 +
>  debian/rules   |  2 +-
>  sutils/Makefile|  2 +-
>  sutils/smp.c   | 80 ++
>  4 files changed, 83 insertions(+), 2 deletions(-)
>  create mode 100644 sutils/smp.c
>
> diff --git a/debian/hurd.install.in b/debian/hurd.install.in
> index 09993f2c5..8697488ba 100755
> --- a/debian/hurd.install.in
> +++ b/debian/hurd.install.in
> @@ -60,6 +60,7 @@ sbin/reboot-hurd
>  sbin/swapoff
>  sbin/swapon
>  sbin/bless
> +sbin/smp
>  usr/share/msgids
>  usr/bin/fakeroot-hurd
>  usr/bin/gcore
> diff --git a/debian/rules b/debian/rules
> index 9e24f761f..f7c55abf1 100755
> --- a/debian/rules
> +++ b/debian/rules
> @@ -59,7 +59,7 @@ endif
>  CONFIGURE_ARGS += prefix=/ includedir=/usr/include
> libdir=/lib/$(DEB_HOST_MULTIARCH) libexecdir=/usr/libexec
> datarootdir=/usr/share sysconfdir=/etc localstatedir=/var
>  CONFIGURE_ARGS_deb =
>  CONFIGURE_ARGS_udeb = libdir=/lib --without-libdaemon --without-libbz2
> -SUID_PROGRAMS = /bin/ids /bin/login /bin/ps-hurd /usr/bin/w-hurd
> +SUID_PROGRAMS = /bin/ids /bin/login /bin/ps-hurd /usr/bin/w-hurd /sbin/smp
>
>  INSTALL_in := $(wildcard debian/*.install.in)
>  INSTALL_generated := $(patsubst %.in,%,$(INSTALL_in))
> diff --git a/sutils/Makefile b/sutils/Makefile
> index 5bb92c0bf..07d0fb998 100644
> --- a/sutils/Makefile
> +++ b/sutils/Makefile
> @@ -20,7 +20,7 @@
>  dir := sutils
>  makemode := utilities
>
> -progs = reboot halt fsck swapon swapoff bless
> +progs = reboot halt fsck swapon swapoff bless smp
>  scripts = e2os MAKEDEV losetup
>  targets = $(special-targets) $(progs)
>  special-targets = $(scripts)
> diff --git a/sutils/smp.c b/sutils/smp.c
> new file mode 100644
> index 0..f91475282
> --- /dev/null
> +++ b/sutils/smp.c
> @@ -0,0 +1,80 @@
> +/* Run a task on slave_pset
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +
> +   This file is part of the GNU Hurd.
> +
> +   The GNU Hurd is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU General Public License as
> +   published by the Free Software Foundation; either version 2, or (at
> +   your option) any later version.
> +
> +   The GNU Hurd is distributed in the hope that it will be useful, but
> +   WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   General Public License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with this program; if not, write to the Free Software
> +   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +static void
> +smp (char * const argv[])
> +{
> +  int i;
> +  error_t err;
> +  mach_msg_type_number_t pset_count;
> +  mach_port_t hostpriv;
> +  processor_set_name_array_t psets = {0};
> +  processor_set_t slave_pset = MACH_PORT_NULL;
> +
> +  err = get_privileged_ports (&hostpriv, NULL);
> +  if (err)
> +error (1, err, "Must be run as root for privileged cpu control");
> +
> +  err = host_processor_sets (hostpriv, &psets, &pset_count);
> +  if (err)
> +error (1, err, "Cannot get list of host processor sets");
> +
> +  if (pset_count < 2)
> +error (1, ENOSYS, "gnumach does not have the expected processor sets,
> are you running smp kernel?");
> +
> +  err = host_processor_set_priv (hostpriv, psets[1], &slave_pset);
> +  mach_port_deallocate (mach_task_self (), hostpriv);
> +  for (i = 0; i < pset_count; i++)
> +mach_port_deallocate (mach_task_self (), psets[i]);
> +  if (err)
> +error (1, err, "Cannot get access to slave processor set");
> +
> +  err = task_assign (mach_task_self (), slave_pset, FALSE);
> +  mach_port_deallocate (mach_task_self (), slave_pset);
> +  if (err)
> +error (1, err, "Cannot assign task self to slave processor set");
> +
> +  /* Drop privileges from suid binary */
> +  mach_port_deallocate (mach_task_self (), _hurd_host_priv);
> +  setuid (getuid ());
> +
> +  execve (argv[1], &argv[1], environ);
> +
> +  /* Fall through if not executed */
> +  error (1, errno, "failed to execute %s", argv[1]);
> +}
> +
> +int
> +main (int argc, char **argv)
> +{
> +  if (argc < 2)
> +error (1, 0, "Usage: smp /path/to/executable");
> +
> +  smp (argv);
> +  return 0;
> +}
> --
> 2.45.2
>
>
>
>


[PATCH v2 hurd] sutils: Add smp tool to run process on slave processors

2024-11-26 Thread Damien Zammit via Bug reports for the GNU Hurd
Until we make gnumach fully parallel, we need a way to execute
on slave processor set on smp-enabled gnumach.

For example:
$ /sbin/smp /bin/bash
$

will launch a shell that executes commands only within slave pset,
consisting of all processors except processor 0.

We can thus test parallelism on Hurd in a controlled way.
---
 debian/hurd.install.in |  1 +
 debian/rules   |  2 +-
 sutils/Makefile|  2 +-
 sutils/smp.c   | 80 ++
 4 files changed, 83 insertions(+), 2 deletions(-)
 create mode 100644 sutils/smp.c

diff --git a/debian/hurd.install.in b/debian/hurd.install.in
index 09993f2c5..8697488ba 100755
--- a/debian/hurd.install.in
+++ b/debian/hurd.install.in
@@ -60,6 +60,7 @@ sbin/reboot-hurd
 sbin/swapoff
 sbin/swapon
 sbin/bless
+sbin/smp
 usr/share/msgids
 usr/bin/fakeroot-hurd
 usr/bin/gcore
diff --git a/debian/rules b/debian/rules
index 9e24f761f..f7c55abf1 100755
--- a/debian/rules
+++ b/debian/rules
@@ -59,7 +59,7 @@ endif
 CONFIGURE_ARGS += prefix=/ includedir=/usr/include 
libdir=/lib/$(DEB_HOST_MULTIARCH) libexecdir=/usr/libexec 
datarootdir=/usr/share sysconfdir=/etc localstatedir=/var
 CONFIGURE_ARGS_deb =
 CONFIGURE_ARGS_udeb = libdir=/lib --without-libdaemon --without-libbz2
-SUID_PROGRAMS = /bin/ids /bin/login /bin/ps-hurd /usr/bin/w-hurd
+SUID_PROGRAMS = /bin/ids /bin/login /bin/ps-hurd /usr/bin/w-hurd /sbin/smp
 
 INSTALL_in := $(wildcard debian/*.install.in)
 INSTALL_generated := $(patsubst %.in,%,$(INSTALL_in))
diff --git a/sutils/Makefile b/sutils/Makefile
index 5bb92c0bf..07d0fb998 100644
--- a/sutils/Makefile
+++ b/sutils/Makefile
@@ -20,7 +20,7 @@
 dir := sutils
 makemode := utilities
 
-progs = reboot halt fsck swapon swapoff bless
+progs = reboot halt fsck swapon swapoff bless smp
 scripts = e2os MAKEDEV losetup
 targets = $(special-targets) $(progs)
 special-targets = $(scripts)
diff --git a/sutils/smp.c b/sutils/smp.c
new file mode 100644
index 0..f91475282
--- /dev/null
+++ b/sutils/smp.c
@@ -0,0 +1,80 @@
+/* Run a task on slave_pset
+   Copyright (C) 2024 Free Software Foundation, Inc.
+
+   This file is part of the GNU Hurd.
+
+   The GNU Hurd is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   The GNU Hurd is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+static void
+smp (char * const argv[])
+{
+  int i;
+  error_t err;
+  mach_msg_type_number_t pset_count;
+  mach_port_t hostpriv;
+  processor_set_name_array_t psets = {0};
+  processor_set_t slave_pset = MACH_PORT_NULL;
+
+  err = get_privileged_ports (&hostpriv, NULL);
+  if (err)
+error (1, err, "Must be run as root for privileged cpu control");
+
+  err = host_processor_sets (hostpriv, &psets, &pset_count);
+  if (err)
+error (1, err, "Cannot get list of host processor sets");
+
+  if (pset_count < 2)
+error (1, ENOSYS, "gnumach does not have the expected processor sets, are 
you running smp kernel?");
+
+  err = host_processor_set_priv (hostpriv, psets[1], &slave_pset);
+  mach_port_deallocate (mach_task_self (), hostpriv);
+  for (i = 0; i < pset_count; i++)
+mach_port_deallocate (mach_task_self (), psets[i]);
+  if (err)
+error (1, err, "Cannot get access to slave processor set");
+
+  err = task_assign (mach_task_self (), slave_pset, FALSE);
+  mach_port_deallocate (mach_task_self (), slave_pset);
+  if (err)
+error (1, err, "Cannot assign task self to slave processor set");
+
+  /* Drop privileges from suid binary */
+  mach_port_deallocate (mach_task_self (), _hurd_host_priv);
+  setuid (getuid ());
+
+  execve (argv[1], &argv[1], environ);
+
+  /* Fall through if not executed */
+  error (1, errno, "failed to execute %s", argv[1]);
+}
+
+int
+main (int argc, char **argv)
+{
+  if (argc < 2)
+error (1, 0, "Usage: smp /path/to/executable");
+
+  smp (argv);
+  return 0;
+}
-- 
2.45.2