Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F143807990
D38555.id117281.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D38555.id117281.diff
View Options
diff --git a/lib/libc/gen/sched_getaffinity.c b/lib/libc/gen/sched_getaffinity.c
--- 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
--- 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 @@
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
--- a/lib/libc/include/libc_private.h
+++ b/lib/libc/include/libc_private.h
@@ -39,6 +39,11 @@
#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
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -107,6 +107,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
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Feb 1, 2:41 PM (2 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28392070
Default Alt Text
D38555.id117281.diff (2 KB)
Attached To
Mode
D38555: cpuset: Add compat shim to the sched_affinity functions
Attached
Detach File
Event Timeline
Log In to Comment