This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Use __syscall_ulong_t for __cpu_mask
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: "Carlos O'Donell" <carlos at redhat dot com>
- Cc: GNU C Library <libc-alpha at sourceware dot org>
- Date: Tue, 1 Dec 2015 09:07:46 -0800
- Subject: Re: [PATCH] Use __syscall_ulong_t for __cpu_mask
- Authentication-results: sourceware.org; auth=none
- References: <1448909195-12575-1-git-send-email-hjl dot tools at gmail dot com> <565DC5B6 dot 8000102 at redhat dot com> <CAMe9rOo-wky+ExS_W5XmvkhauHhkyNK0cHsAQHBOh652=JsZRA at mail dot gmail dot com> <565DCFF6 dot 1080402 at redhat dot com> <CAMe9rOoSC_OsLdBFZ8Nqh6gv8c3ktCZtAUDULWothoa-TMv0Vw at mail dot gmail dot com>
On Tue, Dec 1, 2015 at 9:01 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Tue, Dec 1, 2015 at 8:51 AM, Carlos O'Donell <carlos@redhat.com> wrote:
>> On 12/01/2015 11:10 AM, H.J. Lu wrote:
>>> On Tue, Dec 1, 2015 at 8:07 AM, Carlos O'Donell <carlos@redhat.com> wrote:
>>>> On 11/30/2015 01:46 PM, H.J. Lu wrote:
>>>>> Since x86-64 and x32 use the same set of sched_XXX system call
>>>>> interface:
>>>>>
>>>>> [hjl@gnu-6 linux-stable]$ grep sched_
>>>>> arch/x86/entry/syscalls/syscall_64.tbl
>>>>> 24 common sched_yield sys_sched_yield
>>>>> 142 common sched_setparam sys_sched_setparam
>>>>> 143 common sched_getparam sys_sched_getparam
>>>>> 144 common sched_setscheduler sys_sched_setscheduler
>>>>> 145 common sched_getscheduler sys_sched_getscheduler
>>>>> 146 common sched_get_priority_max sys_sched_get_priority_max
>>>>> 147 common sched_get_priority_min sys_sched_get_priority_min
>>>>> 148 common sched_rr_get_interval sys_sched_rr_get_interval
>>>>> 203 common sched_setaffinity sys_sched_setaffinity
>>>>> 204 common sched_getaffinity sys_sched_getaffinity
>>>>> 314 common sched_setattr sys_sched_setattr
>>>>> 315 common sched_getattr sys_sched_getattr
>>>>> [hjl@gnu-6 linux-stable]$
>>>>>
>>>>> __cpu_mask should be __syscall_ulong_t.
>>>>>
>>>>> [BZ #19313]
>>>>> * sysdeps/unix/sysv/linux/bits/sched.h (__cpu_mask): Replace
>>>>> unsigned long int with __syscall_ulong_t.
>>>>
>>>> How did you test this?
>>>
>>> I tested it on x32, i686 and x86-64. Maybe we should add
>>> __CPU_MASK_TYPE to bits/typesizes.h so that each
>>> architecture can define it own type for __cpu_mask.
>>
>> The definition of __syscall_ulong_t, AFAICT, is always
>> `unsigned long int`, which means the change does nothing?
>
> That isn't true. sysdeps/unix/sysv/linux/x86/bits/typesizes.h has
>
> /* X32 kernel interface is 64-bit. */
> #if defined __x86_64__ && defined __ILP32__
> # define __SYSCALL_SLONG_TYPE __SQUAD_TYPE
> # define __SYSCALL_ULONG_TYPE __UQUAD_TYPE
> #else
> # define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
> # define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE
> #endif
>
>
>> Aren't both of these types the same size on x86_64 and
>> x32?
>
> That is correct. But long long != long on x32.
>
>> What exactly was the failure mode you saw in bug 19313?
>>
>
> I got
>
> FAIL: nptl/tst-thread-affinity-pthread
> FAIL: nptl/tst-thread-affinity-pthread2
> FAIL: nptl/tst-thread-affinity-sched
> FAIL: posix/tst-affinity
> FAIL: posix/tst-affinity-pid
>
> since size 12, which isn't multiple of 8, is passed to sched_getaffinity
> syscall. We got 12 since __cpu_mask is unsigned long, instead of
> unsigned long long.
>
Here is a patch to add __CPU_MASK_TYPE for __cpu_mask.
Tested on x32, i686 and x86-64. OK for master?
--
H.J.
From 155cb1ab1dc1baca1a80f6253c473513fdcdeeac Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Mon, 30 Nov 2015 10:42:28 -0800
Subject: [PATCH] Add __CPU_MASK_TYPE for __cpu_mask
Since x86-64 and x32 use the same set of sched_XXX system call interface:
[hjl@gnu-6 linux-stable]$ grep sched_
arch/x86/entry/syscalls/syscall_64.tbl
24 common sched_yield sys_sched_yield
142 common sched_setparam sys_sched_setparam
143 common sched_getparam sys_sched_getparam
144 common sched_setscheduler sys_sched_setscheduler
145 common sched_getscheduler sys_sched_getscheduler
146 common sched_get_priority_max sys_sched_get_priority_max
147 common sched_get_priority_min sys_sched_get_priority_min
148 common sched_rr_get_interval sys_sched_rr_get_interval
203 common sched_setaffinity sys_sched_setaffinity
204 common sched_getaffinity sys_sched_getaffinity
314 common sched_setattr sys_sched_setattr
315 common sched_getattr sys_sched_getattr
[hjl@gnu-6 linux-stable]$
__cpu_mask should be unsigned long long, instead of unsigned long, for
x32. This patch adds __CPU_MASK_TYPE so that each architecture can
define the proper type for __cpu_mask.
[BZ #19313]
* bits/typesizes.h (__CPU_MASK_TYPE): New.
* sysdeps/mach/hurd/bits/typesizes.h (__CPU_MASK_TYPE): Likewise.
* sysdeps/nacl/bits/typesizes.h (__CPU_MASK_TYPE): Likewise.
* sysdeps/unix/sysv/linux/alpha/bits/typesizes.h (__CPU_MASK_TYPE):
Likewise.
* sysdeps/unix/sysv/linux/generic/bits/typesizes.h (__CPU_MASK_TYPE):
Likewise.
* sysdeps/unix/sysv/linux/s390/bits/typesizes.h (__CPU_MASK_TYPE):
Likewise.
* sysdeps/unix/sysv/linux/sparc/bits/typesizes.h (__CPU_MASK_TYPE):
Likewise.
* sysdeps/unix/sysv/linux/x86/bits/typesizes.h (__CPU_MASK_TYPE):
* sysdeps/unix/sysv/linux/bits/sched.h (__cpu_mask): Replace
unsigned long int with __CPU_MASK_TYPE.
---
bits/typesizes.h | 1 +
sysdeps/mach/hurd/bits/typesizes.h | 1 +
sysdeps/nacl/bits/typesizes.h | 1 +
sysdeps/unix/sysv/linux/alpha/bits/typesizes.h | 1 +
sysdeps/unix/sysv/linux/bits/sched.h | 2 +-
sysdeps/unix/sysv/linux/generic/bits/typesizes.h | 1 +
sysdeps/unix/sysv/linux/s390/bits/typesizes.h | 1 +
sysdeps/unix/sysv/linux/sparc/bits/typesizes.h | 1 +
sysdeps/unix/sysv/linux/x86/bits/typesizes.h | 1 +
9 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/bits/typesizes.h b/bits/typesizes.h
index 0c1e39c..ec5853d 100644
--- a/bits/typesizes.h
+++ b/bits/typesizes.h
@@ -59,6 +59,7 @@
#define __SSIZE_T_TYPE __SWORD_TYPE
#define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
#define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE
+#define __CPU_MASK_TYPE __ULONGWORD_TYPE
#ifdef __LP64__
/* Tell the libc code that off_t and off64_t are actually the same type
diff --git a/sysdeps/mach/hurd/bits/typesizes.h b/sysdeps/mach/hurd/bits/typesizes.h
index 970e64e..948517e 100644
--- a/sysdeps/mach/hurd/bits/typesizes.h
+++ b/sysdeps/mach/hurd/bits/typesizes.h
@@ -59,6 +59,7 @@
#define __SSIZE_T_TYPE __SWORD_TYPE
#define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
#define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE
+#define __CPU_MASK_TYPE __ULONGWORD_TYPE
/* Number of descriptors that can fit in an `fd_set'. */
#define __FD_SETSIZE 256
diff --git a/sysdeps/nacl/bits/typesizes.h b/sysdeps/nacl/bits/typesizes.h
index ed1b5dc..572ff9f 100644
--- a/sysdeps/nacl/bits/typesizes.h
+++ b/sysdeps/nacl/bits/typesizes.h
@@ -59,6 +59,7 @@
#define __SSIZE_T_TYPE __SWORD_TYPE
#define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
#define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE
+#define __CPU_MASK_TYPE __ULONGWORD_TYPE
/* All our foo64_t types match their foo_t counterparts. */
#define __OFF_T_MATCHES_OFF64_T 1
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
index b40a2c2..aa00287 100644
--- a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
+++ b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
@@ -58,6 +58,7 @@
#define __SSIZE_T_TYPE __SWORD_TYPE
#define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
#define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE
+#define __CPU_MASK_TYPE __ULONGWORD_TYPE
#define __FSWORD_T_TYPE __S32_TYPE
/* Tell the libc code that off_t and off64_t are actually the same type
diff --git a/sysdeps/unix/sysv/linux/bits/sched.h b/sysdeps/unix/sysv/linux/bits/sched.h
index ae089df..7bee1b6 100644
--- a/sysdeps/unix/sysv/linux/bits/sched.h
+++ b/sysdeps/unix/sysv/linux/bits/sched.h
@@ -115,7 +115,7 @@ struct __sched_param
# define __NCPUBITS (8 * sizeof (__cpu_mask))
/* Type for array elements in 'cpu_set_t'. */
-typedef unsigned long int __cpu_mask;
+typedef __CPU_MASK_TYPE __cpu_mask;
/* Basic access functions. */
# define __CPUELT(cpu) ((cpu) / __NCPUBITS)
diff --git a/sysdeps/unix/sysv/linux/generic/bits/typesizes.h b/sysdeps/unix/sysv/linux/generic/bits/typesizes.h
index de98a39..22d857f 100644
--- a/sysdeps/unix/sysv/linux/generic/bits/typesizes.h
+++ b/sysdeps/unix/sysv/linux/generic/bits/typesizes.h
@@ -60,6 +60,7 @@
#define __SSIZE_T_TYPE __SWORD_TYPE
#define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
#define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE
+#define __CPU_MASK_TYPE __ULONGWORD_TYPE
#ifdef __LP64__
/* Tell the libc code that off_t and off64_t are actually the same type
diff --git a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h
index 78d377c..38af120 100644
--- a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h
+++ b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h
@@ -65,6 +65,7 @@
#endif
#define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
#define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE
+#define __CPU_MASK_TYPE __ULONGWORD_TYPE
#ifdef __s390x__
/* Tell the libc code that off_t and off64_t are actually the same type
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h
index 2167c28..4b7cac6 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h
@@ -59,6 +59,7 @@
#define __SSIZE_T_TYPE __SWORD_TYPE
#define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
#define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE
+#define __CPU_MASK_TYPE __ULONGWORD_TYPE
#if defined __arch64__ || defined __sparcv9
/* Tell the libc code that off_t and off64_t are actually the same type
diff --git a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h
index 8889bc0..f89d9d2 100644
--- a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h
+++ b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h
@@ -71,6 +71,7 @@
#define __BLKSIZE_T_TYPE __SYSCALL_SLONG_TYPE
#define __FSID_T_TYPE struct { int __val[2]; }
#define __SSIZE_T_TYPE __SWORD_TYPE
+#define __CPU_MASK_TYPE __SYSCALL_ULONG_TYPE
#ifdef __x86_64__
/* Tell the libc code that off_t and off64_t are actually the same type
--
2.5.0