Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 19 Feb 2023 07:26:18 GMT
From:      Dmitry Chagin <dchagin@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: f3f350c5c8e4 - stable/13 - cpuset: Add compat shim to the sched_affinity functions
Message-ID:  <202302190726.31J7QIvG039582@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by dchagin:

URL: https://cgit.FreeBSD.org/src/commit/?id=f3f350c5c8e4f6b0d3ff9806881b8f042a9ca925

commit f3f350c5c8e4f6b0d3ff9806881b8f042a9ca925
Author:     Dmitry Chagin <dchagin@FreeBSD.org>
AuthorDate: 2023-02-15 09:23:15 +0000
Commit:     Dmitry Chagin <dchagin@FreeBSD.org>
CommitDate: 2023-02-19 07:26:06 +0000

    cpuset: Add compat shim to the sched_affinity functions
    
    To allow to run a newer world on a pre-1400079 kernel a compat shims to
    the sched_affinity functions has beed added.
    
    Reported by:            antoine
    Tested by:              antoine
    Reviewed by:            kib
    Differential revision:  https://reviews.freebsd.org/D38555
    MFC after:              3 days
    
    (cherry picked from commit cbc32e4c5e8427e0f1032d9d3aa5863dd1538c11)
---
 lib/libc/gen/sched_getaffinity.c | 15 ++++++++++++++-
 lib/libc/gen/sched_setaffinity.c | 14 +++++++++++++-
 lib/libc/include/libc_private.h  |  6 ++++++
 sys/sys/param.h                  |  1 +
 4 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/lib/libc/gen/sched_getaffinity.c b/lib/libc/gen/sched_getaffinity.c
index 95145a1eb019..fce47fbfc0d2 100644
--- a/lib/libc/gen/sched_getaffinity.c
+++ b/lib/libc/gen/sched_getaffinity.c
@@ -26,16 +26,29 @@
  * SUCH DAMAGE.
  */
 
+#define	_WANT_P_OSREL
+#include <sys/param.h>
 #include <errno.h>
 #include <sched.h>
 #include <string.h>
 
+#include "libc_private.h"
+
 int
 sched_getaffinity(pid_t pid, size_t cpusetsz, cpuset_t *cpuset)
 {
+	cpuwhich_t which;
 	int error;
 
-	error = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TIDPID,
+	if (__getosreldate() < P_OSREL_TIDPID) {
+		if (pid == 0 || pid > _PID_MAX)
+			which = CPU_WHICH_TID;
+		else
+			which = CPU_WHICH_PID;
+	} else
+		which = CPU_WHICH_TIDPID;
+
+	error = cpuset_getaffinity(CPU_LEVEL_WHICH, which,
 	    pid == 0 ? -1 : pid, cpusetsz, cpuset);
 	if (error == -1 && errno == ERANGE)
 		errno = EINVAL;
diff --git a/lib/libc/gen/sched_setaffinity.c b/lib/libc/gen/sched_setaffinity.c
index 36ed0f45d417..b878e1affc41 100644
--- a/lib/libc/gen/sched_setaffinity.c
+++ b/lib/libc/gen/sched_setaffinity.c
@@ -26,20 +26,32 @@
  * SUCH DAMAGE.
  */
 
+#define	_WANT_P_OSREL
 #include <sys/param.h>
 #include <sys/sysctl.h>
 #include <errno.h>
 #include <sched.h>
 #include <string.h>
 
+#include "libc_private.h"
+
 int
 sched_setaffinity(pid_t pid, size_t cpusetsz, const cpuset_t *cpuset)
 {
 	static int mp_maxid;
+	cpuwhich_t which;
 	cpuset_t c;
 	int error, lbs, cpu;
 	size_t len, sz;
 
+	if (__getosreldate() < P_OSREL_TIDPID) {
+		if (pid == 0 || pid > _PID_MAX)
+			which = CPU_WHICH_TID;
+		else
+			which = CPU_WHICH_PID;
+	} else
+		which = CPU_WHICH_TIDPID;
+
 	sz = cpusetsz > sizeof(cpuset_t) ? sizeof(cpuset_t) : cpusetsz;
 	memset(&c, 0, sizeof(c));
 	memcpy(&c, cpuset, sz);
@@ -58,7 +70,7 @@ sched_setaffinity(pid_t pid, size_t cpusetsz, const cpuset_t *cpuset)
 			if (cpu > mp_maxid)
 				CPU_CLR(cpu, &c);
 	}
-	error = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TIDPID,
+	error = cpuset_setaffinity(CPU_LEVEL_WHICH, which,
 	    pid == 0 ? -1 : pid, sizeof(cpuset_t), &c);
 	if (error == -1 && errno == EDEADLK)
 		errno = EINVAL;
diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h
index 61c1eb438142..78a75cc6284d 100644
--- a/lib/libc/include/libc_private.h
+++ b/lib/libc/include/libc_private.h
@@ -39,6 +39,12 @@
 #include <sys/_types.h>
 #include <sys/_pthreadtypes.h>
 
+/*
+ * The kernel doesn't expose PID_MAX to the user space. Save it here
+ * to allow to run a newer world on a pre-1400079 kernel.
+ */
+#define	_PID_MAX	99999
+
 /*
  * This global flag is non-zero when a process has created one
  * or more threads. It is used to avoid calling locking functions
diff --git a/sys/sys/param.h b/sys/sys/param.h
index 909ff0ef1d8b..d2fbad6c127b 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -91,6 +91,7 @@
 #define	P_OSREL_CK_SUPERBLOCK		1300000
 #define	P_OSREL_CK_INODE		1300005
 #define	P_OSREL_POWERPC_NEW_AUX_ARGS	1300070
+#define	P_OSREL_TIDPID			1400079
 
 #define	P_OSREL_MAJOR(x)		((x) / 100000)
 #endif



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202302190726.31J7QIvG039582>