All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Stancek <jstancek@redhat.com>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH] open_posix_testsuite: add set_affinity_single()
Date: Thu, 12 Nov 2015 08:05:45 -0500 (EST)	[thread overview]
Message-ID: <79851655.7408903.1447333545379.JavaMail.zimbra@redhat.com> (raw)
In-Reply-To: <46ff3d4f262abe122b1579681c0e568857c3f9dc.1447332053.git.jstancek@redhat.com>





----- Original Message -----
> From: "Jan Stancek" <jstancek@redhat.com>
> To: ltp@lists.linux.it
> Sent: Thursday, 12 November, 2015 1:45:47 PM
> Subject: [LTP] [PATCH] open_posix_testsuite: add set_affinity_single()
> 
> Couple testcases rely on set_affinity(), to limit usage of CPUs
> to a single one. However they hardcode CPU number to "0", which
> is causing problems on systems where CPU0 is not available (for
> example it's offline, etc.)
> 
> This patch adds set_affinity_single() (which sets affinity to
> first single present CPU) and replaces all calls to set_affinity(0).
> 
> Signed-off-by: Jan Stancek <jstancek@redhat.com>
> ---
>  .../interfaces/pthread_attr_setschedpolicy/2-1.c   |  4 +-
>  .../conformance/interfaces/pthread_create/1-6.c    |  2 +-
>  .../conformance/interfaces/sched_setparam/2-1.c    |  2 +-
>  .../conformance/interfaces/sched_setparam/2-2.c    |  2 +-
>  .../conformance/interfaces/sched_setparam/9-1.c    |  2 +-
>  .../conformance/interfaces/sched_yield/1-1.c       |  4 +-
>  testcases/open_posix_testsuite/include/affinity.h  | 54
>  ++++++++++++++++++++++
>  7 files changed, 62 insertions(+), 8 deletions(-)
> 
> diff --git
> a/testcases/open_posix_testsuite/conformance/interfaces/pthread_attr_setschedpolicy/2-1.c
> b/testcases/open_posix_testsuite/conformance/interfaces/pthread_attr_setschedpolicy/2-1.c
> index 426988b44eb6..3c4cec77277f 100644
> ---
> a/testcases/open_posix_testsuite/conformance/interfaces/pthread_attr_setschedpolicy/2-1.c
> +++
> b/testcases/open_posix_testsuite/conformance/interfaces/pthread_attr_setschedpolicy/2-1.c
> @@ -150,9 +150,9 @@ int main(void)
>  	status = PTS_UNRESOLVED;
>  
>  
> -	rc = set_affinity(0);
> +	rc = set_affinity_single();
>  	if (rc)
> -		FAIL_AND_EXIT("set_affinity", errno);
> +		FAIL_AND_EXIT("set_affinity_single", errno);
>  
>  	sp.sched_priority = PRIO_MAIN;
>  	rc = pthread_setschedparam(pthread_self(), SCHED_FIFO, &sp);
> diff --git
> a/testcases/open_posix_testsuite/conformance/interfaces/pthread_create/1-6.c
> b/testcases/open_posix_testsuite/conformance/interfaces/pthread_create/1-6.c
> index 11654dfc00bf..03c266a4adc9 100644
> ---
> a/testcases/open_posix_testsuite/conformance/interfaces/pthread_create/1-6.c
> +++
> b/testcases/open_posix_testsuite/conformance/interfaces/pthread_create/1-6.c
> @@ -238,7 +238,7 @@ int main(void)
>  	int ret;
>  	unsigned int i;
>  
> -	ret = set_affinity(0);
> +	ret = set_affinity_single();
>  	if (ret) {
>  		n_threads = get_ncpu();
>  		if (n_threads == -1) {
> diff --git
> a/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/2-1.c
> b/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/2-1.c
> index 10de0afe5e90..86cf3a726893 100644
> ---
> a/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/2-1.c
> +++
> b/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/2-1.c
> @@ -93,7 +93,7 @@ int main(void)
>  	   There is no guarantee that the LOOP of the child
>  	   can be certainly big enough on any device at any time.
>  	 */
> -	int rc = set_affinity(0);
> +	int rc = set_affinity_single();
>  	if (rc) {
>  		nb_child = get_ncpu();
>  		if (nb_child == -1) {
> diff --git
> a/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/2-2.c
> b/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/2-2.c
> index 4b14691d9200..746f9a107217 100644
> ---
> a/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/2-2.c
> +++
> b/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/2-2.c
> @@ -94,7 +94,7 @@ int main(void)
>  	   There is no guarantee that the LOOP of the child
>  	   can be certainly big enough on any device at any time.
>  	 */
> -	int rc = set_affinity(0);
> +	int rc = set_affinity_single();
>  	if (rc) {
>  		nb_child = get_ncpu();
>  		if (nb_child == -1) {
> diff --git
> a/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/9-1.c
> b/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/9-1.c
> index c3e4f1c113c3..32f3e5be4501 100644
> ---
> a/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/9-1.c
> +++
> b/testcases/open_posix_testsuite/conformance/interfaces/sched_setparam/9-1.c
> @@ -109,7 +109,7 @@ int main(void)
>  	int *child_pid, oldcount, newcount, shm_id, i;
>  	struct sched_param param;
>  	key_t key;
> -	int rc = set_affinity(0);
> +	int rc = set_affinity_single();
>  	if (rc) {
>  		nb_cpu = get_ncpu();
>  		if (nb_cpu == -1) {
> diff --git
> a/testcases/open_posix_testsuite/conformance/interfaces/sched_yield/1-1.c
> b/testcases/open_posix_testsuite/conformance/interfaces/sched_yield/1-1.c
> index 621b9deaaf3d..602733e608ae 100644
> --- a/testcases/open_posix_testsuite/conformance/interfaces/sched_yield/1-1.c
> +++ b/testcases/open_posix_testsuite/conformance/interfaces/sched_yield/1-1.c
> @@ -85,9 +85,9 @@ int main(void)
>  	}
>  
>  	/* Must only use a single CPU */
> -	rc = set_affinity(0);
> +	rc = set_affinity_single();
>  	if (rc) {
> -		ERR_LOG("set_affinity", rc);
> +		ERR_LOG("set_affinity_single", rc);
>  		return status;
>  	}
>  
> diff --git a/testcases/open_posix_testsuite/include/affinity.h
> b/testcases/open_posix_testsuite/include/affinity.h
> index 64be34d04e55..f89101645cb5 100644
> --- a/testcases/open_posix_testsuite/include/affinity.h
> +++ b/testcases/open_posix_testsuite/include/affinity.h
> @@ -27,6 +27,7 @@
>  # define _GNU_SOURCE
>  # define AFFINITY_NEEDS_GNU_SOURCE 1
>  # include <sched.h>
> +# include <stdio.h>
>  
>  static int set_affinity(int cpu)
>  {
> @@ -37,6 +38,59 @@ static int set_affinity(int cpu)
>  
>  	return (sched_setaffinity(0, sizeof(cpu_set_t), &mask));
>  }
> +
> +static int get_present_cpu_from_sysfs(void)
> +{
> +	FILE *f;
> +	int cpu = -1;
> +
> +	f = fopen("/sys/devices/system/cpu/present", "r");

This should have been "online", not present. I'll fix that in v2.

> +	if (!f)
> +		return -1;
> +	fscanf(f, "%d", &cpu);
> +	fclose(f);
> +
> +	return cpu;
> +}
> +
> +static int get_present_cpu_from_cpuinfo(void)
> +{
> +	FILE *f;
> +	int cpu = -1;
> +	char line[4096];
> +
> +	f = fopen("/proc/cpuinfo", "r");
> +	if (!f)
> +		return -1;
> +
> +	while (!feof(f)) {
> +		if (!fgets(line, sizeof(line), f))
> +			return -1;
> +		/*
> +		 * cpuinfo output is not consistent across all archictures,
> +		 * it can be "processor        : N", but for example on s390
> +		 * it's: "processor N: ...", so ignore any non-number
> +		 * after "processor"
> +		 */
> +		if (sscanf(line, "processor%*[^0123456789]%d", &cpu) == 1)
> +			break;
> +	}
> +	fclose(f);
> +
> +	return cpu;
> +}
> +
> +static int set_affinity_single(void)
> +{
> +	int cpu;
> +
> +	cpu = get_present_cpu_from_sysfs();
> +	if (cpu < 0)
> +		cpu = get_present_cpu_from_cpuinfo();
> +
> +	return set_affinity(cpu);
> +}
> +
>  #else
>  static int set_affinity(int cpu)
>  {
> --
> 1.8.3.1
> 
> 
> --
> Mailing list info: http://lists.linux.it/listinfo/ltp
> 

  reply	other threads:[~2015-11-12 13:05 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-12 12:45 [LTP] [PATCH] open_posix_testsuite: add set_affinity_single() Jan Stancek
2015-11-12 13:05 ` Jan Stancek [this message]
2015-11-12 13:09 ` Cyril Hrubis
2015-11-12 13:41   ` Jan Stancek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=79851655.7408903.1447333545379.JavaMail.zimbra@redhat.com \
    --to=jstancek@redhat.com \
    --cc=ltp@lists.linux.it \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.