All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [PATCH] syscalls/getcpu: Add libc sched_getcpu() detection && fix compiler errors
@ 2019-04-12  7:03 Yang Xu
  2019-04-12  9:43 ` Cyril Hrubis
  0 siblings, 1 reply; 12+ messages in thread
From: Yang Xu @ 2019-04-12  7:03 UTC (permalink / raw)
  To: ltp

1)sched_getcpu() isn't defined on some old distros, so we can add dection and
fix compiler error.

2)If CPU_ALLOC isn't defined on some old distros, it will used "include/lapi/cpuset"
CPU_ALLOC macro. But getcpu01.c has converted into new library, so it will report
"cleanup" undefine error. We should ensure CPU_ALLOC can be used both new cases and
old cases.

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
---
 configure.ac                                |  1 +
 include/lapi/cpuset.h                       | 10 +++++++++-
 testcases/kernel/syscalls/getcpu/getcpu01.c |  6 +++---
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/configure.ac b/configure.ac
index de12499..3ac0f28 100644
--- a/configure.ac
+++ b/configure.ac
@@ -77,6 +77,7 @@ AC_CHECK_FUNCS([ \
     readlinkat \
     renameat \
     renameat2 \
+    sched_getcpu \
     sigpending \
     splice \
     stime \
diff --git a/include/lapi/cpuset.h b/include/lapi/cpuset.h
index b946650..959462b 100644
--- a/include/lapi/cpuset.h
+++ b/include/lapi/cpuset.h
@@ -33,11 +33,19 @@
 #define LTP_CPUSET_H
 
 #ifndef CPU_ALLOC
+#ifndef TST_TEST_H__
 #define CPU_ALLOC(ncpus) malloc(sizeof(cpu_set_t)); \
 if (ncpus > CPU_SETSIZE) { \
 	tst_brkm(TCONF, cleanup, \
-		"Your libc does not support masks with %ld cpus", ncpus); \
+		"Your libc does not support masks with %d cpus", ncpus); \
 }
+#else
+#define CPU_ALLOC(ncpus) malloc(sizeof(cpu_set_t)); \
+if (ncpus > CPU_SETSIZE) { \
+	tst_brk(TCONF, \
+		"Your libc does not support masks with %d cpus", ncpus); \
+}
+#endif
 #endif
 
 #ifndef CPU_FREE
diff --git a/testcases/kernel/syscalls/getcpu/getcpu01.c b/testcases/kernel/syscalls/getcpu/getcpu01.c
index eb6ded8..d033119 100644
--- a/testcases/kernel/syscalls/getcpu/getcpu01.c
+++ b/testcases/kernel/syscalls/getcpu/getcpu01.c
@@ -16,15 +16,15 @@
 #include <stdlib.h>
 #include <sys/types.h>
 #include "lapi/syscalls.h"
-#include "lapi/cpuset.h"
 #include "tst_test.h"
+#include "lapi/cpuset.h"
 
 static inline int get_cpu(unsigned *cpu_id,
 			  unsigned *node_id LTP_ATTRIBUTE_UNUSED,
 			  void *cache_struct LTP_ATTRIBUTE_UNUSED)
 {
-#if defined(__i386__)
-	return syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
+#ifndef HAVE_SCHED_GETCPU
+	return tst_syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
 #else
 	*cpu_id = sched_getcpu();
 #endif
-- 
1.7.11.rc0




^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [LTP] [PATCH] syscalls/getcpu: Add libc sched_getcpu() detection && fix compiler errors
  2019-04-12  7:03 [LTP] [PATCH] syscalls/getcpu: Add libc sched_getcpu() detection && fix compiler errors Yang Xu
@ 2019-04-12  9:43 ` Cyril Hrubis
  2019-04-12 10:46   ` xuyang
  0 siblings, 1 reply; 12+ messages in thread
From: Cyril Hrubis @ 2019-04-12  9:43 UTC (permalink / raw)
  To: ltp

Hi!
> 1)sched_getcpu() isn't defined on some old distros, so we can add dection and
> fix compiler error.
> 
> 2)If CPU_ALLOC isn't defined on some old distros, it will used "include/lapi/cpuset"
> CPU_ALLOC macro. But getcpu01.c has converted into new library, so it will report
> "cleanup" undefine error. We should ensure CPU_ALLOC can be used both new cases and
> old cases.
> 
> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
> ---
>  configure.ac                                |  1 +
>  include/lapi/cpuset.h                       | 10 +++++++++-
>  testcases/kernel/syscalls/getcpu/getcpu01.c |  6 +++---
>  3 files changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index de12499..3ac0f28 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -77,6 +77,7 @@ AC_CHECK_FUNCS([ \
>      readlinkat \
>      renameat \
>      renameat2 \
> +    sched_getcpu \
>      sigpending \
>      splice \
>      stime \
> diff --git a/include/lapi/cpuset.h b/include/lapi/cpuset.h
> index b946650..959462b 100644
> --- a/include/lapi/cpuset.h
> +++ b/include/lapi/cpuset.h
> @@ -33,11 +33,19 @@
>  #define LTP_CPUSET_H
>  
>  #ifndef CPU_ALLOC
> +#ifndef TST_TEST_H__
>  #define CPU_ALLOC(ncpus) malloc(sizeof(cpu_set_t)); \
>  if (ncpus > CPU_SETSIZE) { \
>  	tst_brkm(TCONF, cleanup, \
> -		"Your libc does not support masks with %ld cpus", ncpus); \
> +		"Your libc does not support masks with %d cpus", ncpus); \
>  }
> +#else
> +#define CPU_ALLOC(ncpus) malloc(sizeof(cpu_set_t)); \
> +if (ncpus > CPU_SETSIZE) { \
> +	tst_brk(TCONF, \
> +		"Your libc does not support masks with %d cpus", ncpus); \
> +}
> +#endif
>  #endif

Good catch.

I would be happier if we converted the sched_setaffinity01 to new
library then we could simply change the tst_brkm() to tst_brk(), but we
can always do that later on.

>  #ifndef CPU_FREE
> diff --git a/testcases/kernel/syscalls/getcpu/getcpu01.c b/testcases/kernel/syscalls/getcpu/getcpu01.c
> index eb6ded8..d033119 100644
> --- a/testcases/kernel/syscalls/getcpu/getcpu01.c
> +++ b/testcases/kernel/syscalls/getcpu/getcpu01.c
> @@ -16,15 +16,15 @@
>  #include <stdlib.h>
>  #include <sys/types.h>
>  #include "lapi/syscalls.h"
> -#include "lapi/cpuset.h"
>  #include "tst_test.h"
> +#include "lapi/cpuset.h"
>  
>  static inline int get_cpu(unsigned *cpu_id,
>  			  unsigned *node_id LTP_ATTRIBUTE_UNUSED,
>  			  void *cache_struct LTP_ATTRIBUTE_UNUSED)
>  {
> -#if defined(__i386__)
> -	return syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
> +#ifndef HAVE_SCHED_GETCPU
> +	return tst_syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
>  #else
>  	*cpu_id = sched_getcpu();
>  #endif

So when __NR_getcpu is not implemented we end up with tst_brk(TCONF,
...) called from the tst_syscall, right? Since AFAIK the getcpu syscall
is not implemented on all architectures...

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [LTP] [PATCH] syscalls/getcpu: Add libc sched_getcpu() detection && fix compiler errors
  2019-04-12  9:43 ` Cyril Hrubis
@ 2019-04-12 10:46   ` xuyang
  2019-04-12 11:46     ` Cyril Hrubis
  0 siblings, 1 reply; 12+ messages in thread
From: xuyang @ 2019-04-12 10:46 UTC (permalink / raw)
  To: ltp

on 2019/4/12 17:43, Cyril Hrubis wrote:

> Hi!
>> 1)sched_getcpu() isn't defined on some old distros, so we can add dection and
>> fix compiler error.
>>
>> 2)If CPU_ALLOC isn't defined on some old distros, it will used "include/lapi/cpuset"
>> CPU_ALLOC macro. But getcpu01.c has converted into new library, so it will report
>> "cleanup" undefine error. We should ensure CPU_ALLOC can be used both new cases and
>> old cases.
>>
>> Signed-off-by: Yang Xu<xuyang2018.jy@cn.fujitsu.com>
>> ---
>>   configure.ac                                |  1 +
>>   include/lapi/cpuset.h                       | 10 +++++++++-
>>   testcases/kernel/syscalls/getcpu/getcpu01.c |  6 +++---
>>   3 files changed, 13 insertions(+), 4 deletions(-)
>>
>> diff --git a/configure.ac b/configure.ac
>> index de12499..3ac0f28 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -77,6 +77,7 @@ AC_CHECK_FUNCS([ \
>>       readlinkat \
>>       renameat \
>>       renameat2 \
>> +    sched_getcpu \
>>       sigpending \
>>       splice \
>>       stime \
>> diff --git a/include/lapi/cpuset.h b/include/lapi/cpuset.h
>> index b946650..959462b 100644
>> --- a/include/lapi/cpuset.h
>> +++ b/include/lapi/cpuset.h
>> @@ -33,11 +33,19 @@
>>   #define LTP_CPUSET_H
>>
>>   #ifndef CPU_ALLOC
>> +#ifndef TST_TEST_H__
>>   #define CPU_ALLOC(ncpus) malloc(sizeof(cpu_set_t)); \
>>   if (ncpus>  CPU_SETSIZE) { \
>>   	tst_brkm(TCONF, cleanup, \
>> -		"Your libc does not support masks with %ld cpus", ncpus); \
>> +		"Your libc does not support masks with %d cpus", ncpus); \
>>   }
>> +#else
>> +#define CPU_ALLOC(ncpus) malloc(sizeof(cpu_set_t)); \
>> +if (ncpus>  CPU_SETSIZE) { \
>> +	tst_brk(TCONF, \
>> +		"Your libc does not support masks with %d cpus", ncpus); \
>> +}
>> +#endif
>>   #endif
> Good catch.
>
> I would be happier if we converted the sched_setaffinity01 to new
> library then we could simply change the tst_brkm() to tst_brk(), but we
> can always do that later on.
>
Hi Cyril

     I will converted the sched_setaffinity01 to new library in V2 patch.

>>   #ifndef CPU_FREE
>> diff --git a/testcases/kernel/syscalls/getcpu/getcpu01.c b/testcases/kernel/syscalls/getcpu/getcpu01.c
>> index eb6ded8..d033119 100644
>> --- a/testcases/kernel/syscalls/getcpu/getcpu01.c
>> +++ b/testcases/kernel/syscalls/getcpu/getcpu01.c
>> @@ -16,15 +16,15 @@
>>   #include<stdlib.h>
>>   #include<sys/types.h>
>>   #include "lapi/syscalls.h"
>> -#include "lapi/cpuset.h"
>>   #include "tst_test.h"
>> +#include "lapi/cpuset.h"
>>
>>   static inline int get_cpu(unsigned *cpu_id,
>>   			  unsigned *node_id LTP_ATTRIBUTE_UNUSED,
>>   			  void *cache_struct LTP_ATTRIBUTE_UNUSED)
>>   {
>> -#if defined(__i386__)
>> -	return syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
>> +#ifndef HAVE_SCHED_GETCPU
>> +	return tst_syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
>>   #else
>>   	*cpu_id = sched_getcpu();
>>   #endif
> So when __NR_getcpu is not implemented we end up with tst_brk(TCONF,
> ...) called from the tst_syscall, right? Since AFAIK the getcpu syscall
> is not implemented on all architectures...
Yes. It will report TCONF if __NR_getcpu is not implemented.

 From getcpu manpage, it is not implemented on all architectures as you
said, I think we can remove sched_getcpu and use __NR_getcpu directly.




^ permalink raw reply	[flat|nested] 12+ messages in thread

* [LTP] [PATCH] syscalls/getcpu: Add libc sched_getcpu() detection && fix compiler errors
  2019-04-12 10:46   ` xuyang
@ 2019-04-12 11:46     ` Cyril Hrubis
  2019-04-15  5:39       ` xuyang
  2019-04-17  6:05       ` [LTP] [PATCH v2 1/2] syscalls/sched_getaffinity: Cleanup && Convert to new API Yang Xu
  0 siblings, 2 replies; 12+ messages in thread
From: Cyril Hrubis @ 2019-04-12 11:46 UTC (permalink / raw)
  To: ltp

Hi!
> >> -#if defined(__i386__)
> >> -	return syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
> >> +#ifndef HAVE_SCHED_GETCPU
> >> +	return tst_syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
> >>   #else
> >>   	*cpu_id = sched_getcpu();
> >>   #endif
> > So when __NR_getcpu is not implemented we end up with tst_brk(TCONF,
> > ...) called from the tst_syscall, right? Since AFAIK the getcpu syscall
> > is not implemented on all architectures...
> Yes. It will report TCONF if __NR_getcpu is not implemented.
> 
>  From getcpu manpage, it is not implemented on all architectures as you
> said, I think we can remove sched_getcpu and use __NR_getcpu directly.

Reading the manual pages I think it's correct to fall back to
sched_getcpu() since as far as I can tell platforms that don't support
getcpu syscall have implemented the functionality as vDSO. So unless we
implement vDSO variant of getcpu we have to rely on sched_getcpu().

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [LTP] [PATCH] syscalls/getcpu: Add libc sched_getcpu() detection && fix compiler errors
  2019-04-12 11:46     ` Cyril Hrubis
@ 2019-04-15  5:39       ` xuyang
  2019-04-17  6:05       ` [LTP] [PATCH v2 1/2] syscalls/sched_getaffinity: Cleanup && Convert to new API Yang Xu
  1 sibling, 0 replies; 12+ messages in thread
From: xuyang @ 2019-04-15  5:39 UTC (permalink / raw)
  To: ltp

On 2019/4/12 19:46, Cyril Hrubis wrote:

> Hi!
>>>> -#if defined(__i386__)
>>>> -	return syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
>>>> +#ifndef HAVE_SCHED_GETCPU
>>>> +	return tst_syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
>>>>    #else
>>>>    	*cpu_id = sched_getcpu();
>>>>    #endif
>>> So when __NR_getcpu is not implemented we end up with tst_brk(TCONF,
>>> ...) called from the tst_syscall, right? Since AFAIK the getcpu syscall
>>> is not implemented on all architectures...
>> Yes. It will report TCONF if __NR_getcpu is not implemented.
>>
>>   From getcpu manpage, it is not implemented on all architectures as you
>> said, I think we can remove sched_getcpu and use __NR_getcpu directly.
> Reading the manual pages I think it's correct to fall back to
> sched_getcpu() since as far as I can tell platforms that don't support
> getcpu syscall have implemented the functionality as vDSO. So unless we
> implement vDSO variant of getcpu we have to rely on sched_getcpu().
>
Hi cyril

    Reading the sched_getcpu manpage,I mistakenly think the sched_getcpu uses
    the getcpu syscall diretly.|  |Actually|sched_getcpu uses VDSO getcpu() syscall
    since glibc 2.22. Thanks for you explanation.|



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linux.it/pipermail/ltp/attachments/20190415/5499b512/attachment.html>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [LTP] [PATCH v2 1/2] syscalls/sched_getaffinity: Cleanup && Convert to new API
  2019-04-12 11:46     ` Cyril Hrubis
  2019-04-15  5:39       ` xuyang
@ 2019-04-17  6:05       ` Yang Xu
  2019-04-17  6:05         ` [LTP] [PATCH v2 2/2] syscalls/getcpu:Add libc sched_getcpu() detection &&fix compiler errors Yang Xu
  2019-04-18 15:27         ` [LTP] [PATCH v2 1/2] syscalls/sched_getaffinity: Cleanup && Convert to new API Cyril Hrubis
  1 sibling, 2 replies; 12+ messages in thread
From: Yang Xu @ 2019-04-17  6:05 UTC (permalink / raw)
  To: ltp

Convert test to new library. It also fixes a rare compile error
for getcpu01.c on some old distros that use ltp CPU_ALLOC(report
cleanup undefined error).

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
---
 include/lapi/cpuset.h                         |   4 +-
 .../sched_getaffinity/sched_getaffinity01.c   | 151 ++++--------------
 2 files changed, 32 insertions(+), 123 deletions(-)

diff --git a/include/lapi/cpuset.h b/include/lapi/cpuset.h
index b94665022..d7ca39f9f 100644
--- a/include/lapi/cpuset.h
+++ b/include/lapi/cpuset.h
@@ -35,8 +35,8 @@
 #ifndef CPU_ALLOC
 #define CPU_ALLOC(ncpus) malloc(sizeof(cpu_set_t)); \
 if (ncpus > CPU_SETSIZE) { \
-	tst_brkm(TCONF, cleanup, \
-		"Your libc does not support masks with %ld cpus", ncpus); \
+	tst_brk(TCONF, \
+		"Your libc does not support masks with %d cpus", ncpus); \
 }
 #endif
 
diff --git a/testcases/kernel/syscalls/sched_getaffinity/sched_getaffinity01.c b/testcases/kernel/syscalls/sched_getaffinity/sched_getaffinity01.c
index 02f04b909..1c149fe40 100644
--- a/testcases/kernel/syscalls/sched_getaffinity/sched_getaffinity01.c
+++ b/testcases/kernel/syscalls/sched_getaffinity/sched_getaffinity01.c
@@ -1,92 +1,26 @@
-/******************************************************************************/
-/* Copyright (c) Crackerjack Project., 2007				      */
-/*									      */
-/* This program 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 of the License, or          */
-/* (at your option) any later version.					      */
-/*									      */
-/* This program 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    */
-/*									      */
-/******************************************************************************/
-/******************************************************************************/
-/*									      */
-/* File:        sched_getaffinity01.c					      */
-/*									      */
-/* Description: This tests the sched_getaffinity() syscall		      */
-/*									      */
-/* Usage:  <for command-line>						      */
-/* sched_getaffinity01 [-c n] [-e][-i n] [-I x] [-p x] [-t]		      */
-/*      where,  -c n : Run n copies concurrently.			      */
-/*			-e   : Turn on errno logging.			      */
-/*			-i n : Execute test n times.			      */
-/*			-I x : Execute test for x seconds.		      */
-/*			-P x : Pause for x seconds between iterations.	      */
-/*			-t   : Turn on syscall timing.			      */
-/*									      */
-/* Total Tests: 1							      */
-/*									      */
-/* Test Name:   sched_getaffinity01					      */
-/* History:     Porting from Crackerjack to LTP is done by		      */
-/*			Manas Kumar Nayak maknayak@in.ibm.com>		      */
-/******************************************************************************/
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) Crackerjack Project., 2007
+ * Description: This case tests the sched_getaffinity() syscall
+ * History:     Porting from Crackerjack to LTP is done by
+ *		 Manas Kumar Nayak maknayak@in.ibm.com>
+ */
 #define _GNU_SOURCE
-#define __USE_GNU
-#include <sys/types.h>
 #include <errno.h>
-#include <limits.h>
 #include <sched.h>
-#include <signal.h>
-#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
-
-#include "test.h"
-#include "safe_macros.h"
-#include "lapi/syscalls.h"
-
-char *TCID = "sched_getaffinity01";
-int TST_TOTAL = 1;
-
-static long num;
-static void do_test(void);
-static void setup(void);
-static void cleanup(void);
+#include "tst_test.h"
+#include "tst_safe_macros.h"
+#include "lapi/cpuset.h"
 
 #define QUICK_TEST(t) \
 do { \
 	TEST(t); \
-	tst_resm((TEST_RETURN == -1 ? TPASS : TFAIL) | TTERRNO, #t); \
+	tst_res((TST_RET == -1 ? TPASS : TFAIL) | TTERRNO, #t); \
 } while (0)
 
-#if !(__GLIBC_PREREQ(2, 7))
-#define CPU_FREE(ptr)	free(ptr)
-#endif
-
-int main(int ac, char **av)
-{
-	int lc;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); ++lc) {
-		tst_count = 0;
-
-		do_test();
-	}
-
-	cleanup();
-	tst_exit();
-}
+static long num;
 
 static void do_test(void)
 {
@@ -96,78 +30,53 @@ static void do_test(void)
 	pid_t unused_pid;
 	unsigned len;
 
-#if __GLIBC_PREREQ(2, 7)
 realloc:
 	mask = CPU_ALLOC(nrcpus);
-#else
-	mask = malloc(sizeof(cpu_set_t));
-#endif
-	if (mask == NULL)
-		tst_brkm(TFAIL | TTERRNO, cleanup, "fail to get enough memory");
-#if __GLIBC_PREREQ(2, 7)
+	if (!mask)
+		tst_brk(TBROK | TERRNO, "CPU_ALLOC()");
+
 	len = CPU_ALLOC_SIZE(nrcpus);
 	CPU_ZERO_S(len, mask);
-#else
-	len = sizeof(cpu_set_t);
-	CPU_ZERO(mask);
-#endif
+
 	/* positive test */
 	TEST(sched_getaffinity(0, len, mask));
-	if (TEST_RETURN == -1) {
+	if (TST_RET == -1) {
 		CPU_FREE(mask);
-#if __GLIBC_PREREQ(2, 7)
 		if (errno == EINVAL && nrcpus < (1024 << 8)) {
 			nrcpus = nrcpus << 2;
 			goto realloc;
 		}
-#else
-		if (errno == EINVAL)
-			tst_resm(TFAIL, "NR_CPUS > 1024, we'd better use a "
-				 "newer glibc(>= 2.7)");
-		else
-#endif
-			tst_resm(TFAIL | TTERRNO, "fail to get cpu affinity");
-		cleanup();
+		tst_res(TFAIL | TTERRNO, "fail to get cpu affinity");
 	} else {
-		tst_resm(TINFO, "cpusetsize is %d", len);
-		tst_resm(TINFO, "mask.__bits[0] = %lu ", mask->__bits[0]);
+		tst_res(TINFO, "cpusetsize is %d", len);
+		tst_res(TINFO, "mask.__bits[0] = %lu ", mask->__bits[0]);
 		for (i = 0; i < num; i++) {
-#if __GLIBC_PREREQ(2, 7)
 			TEST(CPU_ISSET_S(i, len, mask));
-#else
-			TEST(CPU_ISSET(i, mask));
-#endif
-			if (TEST_RETURN != -1)
-				tst_resm(TPASS, "sched_getaffinity() succeed, "
+			if (TST_RET != -1)
+				tst_res(TPASS, "sched_getaffinity() succeed, "
 					 "this process %d is running "
 					 "processor: %d", getpid(), i);
 		}
 	}
 
-#if __GLIBC_PREREQ(2, 7)
 	CPU_ZERO_S(len, mask);
-#else
-	CPU_ZERO(mask);
-#endif
+
 	/* negative tests */
 	QUICK_TEST(sched_getaffinity(0, len, (cpu_set_t *) - 1));
 	QUICK_TEST(sched_getaffinity(0, 0, mask));
 
-	unused_pid = tst_get_unused_pid(cleanup);
+	unused_pid = tst_get_unused_pid();
 	QUICK_TEST(sched_getaffinity(unused_pid, len, mask));
 	CPU_FREE(mask);
 }
 
 static void setup(void)
 {
-	TEST_PAUSE;
-	tst_tmpdir();
-
-	num = SAFE_SYSCONF(NULL, _SC_NPROCESSORS_CONF);
-	tst_resm(TINFO, "system has %ld processor(s).", num);
+	num = SAFE_SYSCONF(_SC_NPROCESSORS_CONF);
+	tst_res(TINFO, "system has %ld processor(s).", num);
 }
 
-static void cleanup(void)
-{
-	tst_rmdir();
-}
+static struct tst_test test = {
+	.setup = setup,
+	.test_all = do_test,
+};
-- 
2.18.1




^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [LTP] [PATCH v2 2/2] syscalls/getcpu:Add libc sched_getcpu() detection &&fix compiler errors
  2019-04-17  6:05       ` [LTP] [PATCH v2 1/2] syscalls/sched_getaffinity: Cleanup && Convert to new API Yang Xu
@ 2019-04-17  6:05         ` Yang Xu
  2019-05-13  7:54           ` xuyang
  2019-05-13  8:27           ` Petr Vorel
  2019-04-18 15:27         ` [LTP] [PATCH v2 1/2] syscalls/sched_getaffinity: Cleanup && Convert to new API Cyril Hrubis
  1 sibling, 2 replies; 12+ messages in thread
From: Yang Xu @ 2019-04-17  6:05 UTC (permalink / raw)
  To: ltp

sched_getcpu() isn't defined on some old distros, so we can add dection
and fix compiler error.

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
---
 configure.ac                                | 1 +
 testcases/kernel/syscalls/getcpu/getcpu01.c | 5 +++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/configure.ac b/configure.ac
index fad8f8396..53ad784d7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -77,6 +77,7 @@ AC_CHECK_FUNCS([ \
     readlinkat \
     renameat \
     renameat2 \
+    sched_getcpu \
     sigpending \
     splice \
     stime \
diff --git a/testcases/kernel/syscalls/getcpu/getcpu01.c b/testcases/kernel/syscalls/getcpu/getcpu01.c
index eb6ded8ab..fcc273e29 100644
--- a/testcases/kernel/syscalls/getcpu/getcpu01.c
+++ b/testcases/kernel/syscalls/getcpu/getcpu01.c
@@ -18,13 +18,14 @@
 #include "lapi/syscalls.h"
 #include "lapi/cpuset.h"
 #include "tst_test.h"
+#include "config.h"
 
 static inline int get_cpu(unsigned *cpu_id,
 			  unsigned *node_id LTP_ATTRIBUTE_UNUSED,
 			  void *cache_struct LTP_ATTRIBUTE_UNUSED)
 {
-#if defined(__i386__)
-	return syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
+#ifndef HAVE_SCHED_GETCPU
+	return tst_syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
 #else
 	*cpu_id = sched_getcpu();
 #endif
-- 
2.18.1




^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [LTP] [PATCH v2 1/2] syscalls/sched_getaffinity: Cleanup && Convert to new API
  2019-04-17  6:05       ` [LTP] [PATCH v2 1/2] syscalls/sched_getaffinity: Cleanup && Convert to new API Yang Xu
  2019-04-17  6:05         ` [LTP] [PATCH v2 2/2] syscalls/getcpu:Add libc sched_getcpu() detection &&fix compiler errors Yang Xu
@ 2019-04-18 15:27         ` Cyril Hrubis
  1 sibling, 0 replies; 12+ messages in thread
From: Cyril Hrubis @ 2019-04-18 15:27 UTC (permalink / raw)
  To: ltp

Hi!
I've did some fixes, split the patch into two and applied, thanks.

As it was the sched_getaffinity() test was really wrong since the
CPU_ISSET_S() does not return -1 at all. Also it's not guaranteed that
all cpus are in the affinity mask for a given process. So what I changed
it to instead is to check if sum of the enabled bits in the mask is
greater than zero and smaller or equal the number of the configured
processors as reported by the sysconf() call.

I've also changed the negative testcases to check errno as well, full
diff follows.

And lastly but not least I've split the patch into two, since the change
in the lapi/cpuset.h is unrelated to the conversion.

diff --git a/testcases/kernel/syscalls/sched_getaffinity/sched_getaffinity01.c b/testcases/kernel/syscalls/sched_getaffinity/sched_getaffinity01.c
index 1c149fe40..12ca198cb 100644
--- a/testcases/kernel/syscalls/sched_getaffinity/sched_getaffinity01.c
+++ b/testcases/kernel/syscalls/sched_getaffinity/sched_getaffinity01.c
@@ -14,20 +14,35 @@
 #include "tst_safe_macros.h"
 #include "lapi/cpuset.h"
 
-#define QUICK_TEST(t) \
-do { \
-	TEST(t); \
-	tst_res((TST_RET == -1 ? TPASS : TFAIL) | TTERRNO, #t); \
-} while (0)
+static long ncpu;
 
-static long num;
+static void *bad_addr;
+
+static void errno_test(pid_t pid, size_t cpusize, void *mask, int exp_errno)
+{
+	TEST(sched_getaffinity(pid, cpusize, mask));
+
+	if (TST_RET != -1) {
+		tst_res(TFAIL,
+			"sched_getaffinity() returned %ld, expected -1",
+			TST_RET);
+		return;
+	}
+
+	if (TST_ERR != exp_errno) {
+		tst_res(TFAIL | TTERRNO,
+			"sched_getaffinity() should fail with %s",
+			tst_strerrno(exp_errno));
+		return;
+	}
+
+	tst_res(TPASS | TTERRNO, "sched_getaffinity() failed");
+}
 
 static void do_test(void)
 {
-	int i;
 	cpu_set_t *mask;
 	int nrcpus = 1024;
-	pid_t unused_pid;
 	unsigned len;
 
 realloc:
@@ -38,42 +53,41 @@ realloc:
 	len = CPU_ALLOC_SIZE(nrcpus);
 	CPU_ZERO_S(len, mask);
 
-	/* positive test */
 	TEST(sched_getaffinity(0, len, mask));
 	if (TST_RET == -1) {
 		CPU_FREE(mask);
-		if (errno == EINVAL && nrcpus < (1024 << 8)) {
+		if (TST_ERR == EINVAL && nrcpus < (1024 << 8)) {
 			nrcpus = nrcpus << 2;
 			goto realloc;
 		}
-		tst_res(TFAIL | TTERRNO, "fail to get cpu affinity");
-	} else {
-		tst_res(TINFO, "cpusetsize is %d", len);
-		tst_res(TINFO, "mask.__bits[0] = %lu ", mask->__bits[0]);
-		for (i = 0; i < num; i++) {
-			TEST(CPU_ISSET_S(i, len, mask));
-			if (TST_RET != -1)
-				tst_res(TPASS, "sched_getaffinity() succeed, "
-					 "this process %d is running "
-					 "processor: %d", getpid(), i);
-		}
+		tst_brk(TBROK | TTERRNO, "fail to get cpu affinity");
 	}
 
-	CPU_ZERO_S(len, mask);
+	long i, af_cpus = 0;
 
-	/* negative tests */
-	QUICK_TEST(sched_getaffinity(0, len, (cpu_set_t *) - 1));
-	QUICK_TEST(sched_getaffinity(0, 0, mask));
+	for (i = 0; i < nrcpus; i++)
+		af_cpus += !!CPU_ISSET_S(i, len, mask);
+
+	if (af_cpus == 0)
+		tst_res(TFAIL, "No cpus enabled in mask");
+	else if (af_cpus > ncpu)
+		tst_res(TFAIL, "Enabled cpus = %li > system cpus %li", af_cpus, ncpu);
+	else
+		tst_res(TPASS, "cpuset size = %u, enabled cpus %ld", len, af_cpus);
+
+	errno_test(0, len, bad_addr, EFAULT);
+	errno_test(0, 0, mask, EINVAL);
+	errno_test(tst_get_unused_pid(), len, mask, ESRCH);
 
-	unused_pid = tst_get_unused_pid();
-	QUICK_TEST(sched_getaffinity(unused_pid, len, mask));
 	CPU_FREE(mask);
 }
 
 static void setup(void)
 {
-	num = SAFE_SYSCONF(_SC_NPROCESSORS_CONF);
-	tst_res(TINFO, "system has %ld processor(s).", num);
+	ncpu = SAFE_SYSCONF(_SC_NPROCESSORS_CONF);
+	tst_res(TINFO, "system has %ld processor(s).", ncpu);
+
+	bad_addr = tst_get_bad_addr(NULL);
 }
 
 static struct tst_test test = {

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [LTP] [PATCH v2 2/2] syscalls/getcpu:Add libc sched_getcpu() detection &&fix compiler errors
  2019-04-17  6:05         ` [LTP] [PATCH v2 2/2] syscalls/getcpu:Add libc sched_getcpu() detection &&fix compiler errors Yang Xu
@ 2019-05-13  7:54           ` xuyang
  2019-05-13  8:27           ` Petr Vorel
  1 sibling, 0 replies; 12+ messages in thread
From: xuyang @ 2019-05-13  7:54 UTC (permalink / raw)
  To: ltp

on 2019/04/17 14:05, Yang Xu wrote:
> sched_getcpu() isn't defined on some old distros, so we can add dection
> and fix compiler error.
>
> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
> ---
>  configure.ac                                | 1 +
>  testcases/kernel/syscalls/getcpu/getcpu01.c | 5 +++--
>  2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index fad8f8396..53ad784d7 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -77,6 +77,7 @@ AC_CHECK_FUNCS([ \
>      readlinkat \
>      renameat \
>      renameat2 \
> +    sched_getcpu \
>      sigpending \
>      splice \
>      stime \
> diff --git a/testcases/kernel/syscalls/getcpu/getcpu01.c b/testcases/kernel/syscalls/getcpu/getcpu01.c
> index eb6ded8ab..fcc273e29 100644
> --- a/testcases/kernel/syscalls/getcpu/getcpu01.c
> +++ b/testcases/kernel/syscalls/getcpu/getcpu01.c
> @@ -18,13 +18,14 @@
>  #include "lapi/syscalls.h"
>  #include "lapi/cpuset.h"
>  #include "tst_test.h"
> +#include "config.h"
>  
>  static inline int get_cpu(unsigned *cpu_id,
>  			  unsigned *node_id LTP_ATTRIBUTE_UNUSED,
>  			  void *cache_struct LTP_ATTRIBUTE_UNUSED)
>  {
> -#if defined(__i386__)
> -	return syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
> +#ifndef HAVE_SCHED_GETCPU
> +	return tst_syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
>  #else
>  	*cpu_id = sched_getcpu();
>  #endif
Hi,
Ping. :-)



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [LTP] [PATCH v2 2/2] syscalls/getcpu:Add libc sched_getcpu() detection &&fix compiler errors
  2019-04-17  6:05         ` [LTP] [PATCH v2 2/2] syscalls/getcpu:Add libc sched_getcpu() detection &&fix compiler errors Yang Xu
  2019-05-13  7:54           ` xuyang
@ 2019-05-13  8:27           ` Petr Vorel
  2019-05-13  8:55             ` Cyril Hrubis
  1 sibling, 1 reply; 12+ messages in thread
From: Petr Vorel @ 2019-05-13  8:27 UTC (permalink / raw)
  To: ltp

Hi,

> sched_getcpu() isn't defined on some old distros, so we can add dection
> and fix compiler error.

> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
Acked-by: Petr Vorel <pvorel@suse.cz>

@Metan: I'd be for pushing this before new release.

...
>  static inline int get_cpu(unsigned *cpu_id,
>  			  unsigned *node_id LTP_ATTRIBUTE_UNUSED,
>  			  void *cache_struct LTP_ATTRIBUTE_UNUSED)
>  {
> -#if defined(__i386__)
> -	return syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
> +#ifndef HAVE_SCHED_GETCPU
> +	return tst_syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
>  #else
>  	*cpu_id = sched_getcpu();
>  #endif

BTW: when rewriting into new C API (whenever it happens) it'd be nice to test
both syscall and libc sched_getcpu() (if available) via recently added test_variants [1].

Kind regards,
Petr

[1] https://github.com/linux-test-project/ltp/wiki/Test-Writing-Guidelines#2229-testing-similar-syscalls-in-one-test

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [LTP] [PATCH v2 2/2] syscalls/getcpu:Add libc sched_getcpu() detection &&fix compiler errors
  2019-05-13  8:27           ` Petr Vorel
@ 2019-05-13  8:55             ` Cyril Hrubis
  2019-05-13  9:40               ` Petr Vorel
  0 siblings, 1 reply; 12+ messages in thread
From: Cyril Hrubis @ 2019-05-13  8:55 UTC (permalink / raw)
  To: ltp

Hi!
> > sched_getcpu() isn't defined on some old distros, so we can add dection
> > and fix compiler error.
> 
> > Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
> Acked-by: Petr Vorel <pvorel@suse.cz>
> 
> @Metan: I'd be for pushing this before new release.

Acked, please go ahead.

> ...
> >  static inline int get_cpu(unsigned *cpu_id,
> >  			  unsigned *node_id LTP_ATTRIBUTE_UNUSED,
> >  			  void *cache_struct LTP_ATTRIBUTE_UNUSED)
> >  {
> > -#if defined(__i386__)
> > -	return syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
> > +#ifndef HAVE_SCHED_GETCPU
> > +	return tst_syscall(__NR_getcpu, cpu_id, node_id, cache_struct);
> >  #else
> >  	*cpu_id = sched_getcpu();
> >  #endif
> 
> BTW: when rewriting into new C API (whenever it happens) it'd be nice to test
> both syscall and libc sched_getcpu() (if available) via recently added test_variants [1].
> 
> Kind regards,
> Petr
> 
> [1] https://github.com/linux-test-project/ltp/wiki/Test-Writing-Guidelines#2229-testing-similar-syscalls-in-one-test


Sure, but let's aim for that after the release has been finished.

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [LTP] [PATCH v2 2/2] syscalls/getcpu:Add libc sched_getcpu() detection &&fix compiler errors
  2019-05-13  8:55             ` Cyril Hrubis
@ 2019-05-13  9:40               ` Petr Vorel
  0 siblings, 0 replies; 12+ messages in thread
From: Petr Vorel @ 2019-05-13  9:40 UTC (permalink / raw)
  To: ltp

Hi,

> > @Metan: I'd be for pushing this before new release.

> Acked, please go ahead.
Merged.

...
> > BTW: when rewriting into new C API (whenever it happens) it'd be nice to test
> > both syscall and libc sched_getcpu() (if available) via recently added test_variants [1].
> > [1] https://github.com/linux-test-project/ltp/wiki/Test-Writing-Guidelines#2229-testing-similar-syscalls-in-one-test

> Sure, but let's aim for that after the release has been finished.
Sure, nothing should block release :).


Kind regards,
Petr

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2019-05-13  9:40 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-12  7:03 [LTP] [PATCH] syscalls/getcpu: Add libc sched_getcpu() detection && fix compiler errors Yang Xu
2019-04-12  9:43 ` Cyril Hrubis
2019-04-12 10:46   ` xuyang
2019-04-12 11:46     ` Cyril Hrubis
2019-04-15  5:39       ` xuyang
2019-04-17  6:05       ` [LTP] [PATCH v2 1/2] syscalls/sched_getaffinity: Cleanup && Convert to new API Yang Xu
2019-04-17  6:05         ` [LTP] [PATCH v2 2/2] syscalls/getcpu:Add libc sched_getcpu() detection &&fix compiler errors Yang Xu
2019-05-13  7:54           ` xuyang
2019-05-13  8:27           ` Petr Vorel
2019-05-13  8:55             ` Cyril Hrubis
2019-05-13  9:40               ` Petr Vorel
2019-04-18 15:27         ` [LTP] [PATCH v2 1/2] syscalls/sched_getaffinity: Cleanup && Convert to new API Cyril Hrubis

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.