public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: Jan Stancek <jstancek@redhat.com>
To: Stanislav Kholmanskikh <stanislav.kholmanskikh@oracle.com>
Cc: vasily isaenko <vasily.isaenko@oracle.com>,
	ltp-list@lists.sourceforge.net
Subject: Re: [LTP] [PATCH V4] syscalls: implemented a test for sched_setaffinity() error values
Date: Tue, 15 Jul 2014 03:05:37 -0400 (EDT)	[thread overview]
Message-ID: <2039620646.10066364.1405407937155.JavaMail.zimbra@redhat.com> (raw)
In-Reply-To: <53C4D003.6020209@oracle.com>





----- Original Message -----
> From: "Stanislav Kholmanskikh" <stanislav.kholmanskikh@oracle.com>
> To: "Jan Stancek" <jstancek@redhat.com>
> Cc: ltp-list@lists.sourceforge.net, "vasily isaenko" <vasily.isaenko@oracle.com>
> Sent: Tuesday, 15 July, 2014 8:53:55 AM
> Subject: Re: [LTP] [PATCH V4] syscalls: implemented a test for sched_setaffinity() error values
> 
> 
> 
> On 07/14/2014 05:07 PM, Jan Stancek wrote:
> >
> >
> >
> >
> > ----- Original Message -----
> >> From: "Stanislav Kholmanskikh" <stanislav.kholmanskikh@oracle.com>
> >> To: ltp-list@lists.sourceforge.net
> >> Cc: "vasily isaenko" <vasily.isaenko@oracle.com>
> >> Sent: Wednesday, 2 July, 2014 9:30:58 AM
> >> Subject: [LTP] [PATCH V4] syscalls: implemented a test for
> >> 	sched_setaffinity() error values
> >>
> >> This test verifies sched_setaffinity(2) for all error conditions
> >> to occur correctly.
> >>
> >> Signed-off-by: Stanislav Kholmanskikh <stanislav.kholmanskikh@oracle.com>
> >
> > Looks good to me, just a small nit: have a look at checkpatch output.
> 
> Thank you, Jan.
> 
> Do you mean this:
> ERROR: Macros with multiple statements should be enclosed in a do -
> while loop
> #208: FILE:
> testcases/kernel/syscalls/sched_setaffinity/sched_setaffinity.h:37:
> +#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); \
> +}
> 
> ?
> 
> If so, I think I can't do it, because I need to assign CPU_ALLOC() to a
> variable....

I see.

> 
> Or what did you mean? :)

I thought that at least those "trailing semicolon" warnings and removing
FSF address could be easily fixed.

Regards,
Jan

> 
> >
> > Reviewed-by: Jan Stancek <jstancek@redhat.com>
> >
> > Regards,
> > Jan
> >
> >> ---
> >> Changes since V3:
> >>   * use tst_fork() instead of fork() for privileged_pid
> >>   * use tst_get_unused_pid() for free_pid
> >>
> >>   runtest/syscalls                                   |    1 +
> >>   testcases/kernel/syscalls/.gitignore               |    1 +
> >>   .../kernel/syscalls/sched_setaffinity/Makefile     |   23 +++
> >>   .../syscalls/sched_setaffinity/sched_setaffinity.h |   60 +++++++
> >>   .../sched_setaffinity/sched_setaffinity01.c        |  177
> >>   ++++++++++++++++++++
> >>   5 files changed, 262 insertions(+), 0 deletions(-)
> >>   create mode 100644 testcases/kernel/syscalls/sched_setaffinity/Makefile
> >>   create mode 100644
> >>   testcases/kernel/syscalls/sched_setaffinity/sched_setaffinity.h
> >>   create mode 100644
> >>   testcases/kernel/syscalls/sched_setaffinity/sched_setaffinity01.c
> >>
> >> diff --git a/runtest/syscalls b/runtest/syscalls
> >> index 66d6a65..52556bc 100644
> >> --- a/runtest/syscalls
> >> +++ b/runtest/syscalls
> >> @@ -895,6 +895,7 @@ sched_setscheduler02 sched_setscheduler02
> >>
> >>   sched_yield01 sched_yield01
> >>
> >> +sched_setaffinity01 sched_setaffinity01
> >>   sched_getaffinity01 sched_getaffinity01
> >>
> >>   select01 select01
> >> diff --git a/testcases/kernel/syscalls/.gitignore
> >> b/testcases/kernel/syscalls/.gitignore
> >> index 975c150..0c31582 100644
> >> --- a/testcases/kernel/syscalls/.gitignore
> >> +++ b/testcases/kernel/syscalls/.gitignore
> >> @@ -724,6 +724,7 @@
> >>   /sched_rr_get_interval/sched_rr_get_interval01
> >>   /sched_rr_get_interval/sched_rr_get_interval02
> >>   /sched_rr_get_interval/sched_rr_get_interval03
> >> +/sched_setaffinity/sched_setaffinity01
> >>   /sched_setparam/sched_setparam01
> >>   /sched_setparam/sched_setparam02
> >>   /sched_setparam/sched_setparam03
> >> diff --git a/testcases/kernel/syscalls/sched_setaffinity/Makefile
> >> b/testcases/kernel/syscalls/sched_setaffinity/Makefile
> >> new file mode 100644
> >> index 0000000..2d825f1
> >> --- /dev/null
> >> +++ b/testcases/kernel/syscalls/sched_setaffinity/Makefile
> >> @@ -0,0 +1,23 @@
> >> +#
> >> +#  Copyright (c) 2014 Oracle and/or its affiliates. All Rights Reserved.
> >> +#
> >> +#  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 St, Fifth Floor, Boston, MA  02110-1301
> >> USA
> >> +#
> >> +
> >> +top_srcdir		?= ../../../..
> >> +
> >> +include $(top_srcdir)/include/mk/testcases.mk
> >> +
> >> +include $(top_srcdir)/include/mk/generic_leaf_target.mk
> >> diff --git
> >> a/testcases/kernel/syscalls/sched_setaffinity/sched_setaffinity.h
> >> b/testcases/kernel/syscalls/sched_setaffinity/sched_setaffinity.h
> >> new file mode 100644
> >> index 0000000..8083894
> >> --- /dev/null
> >> +++ b/testcases/kernel/syscalls/sched_setaffinity/sched_setaffinity.h
> >> @@ -0,0 +1,60 @@
> >> +/*
> >> + * Copyright (c) 2014 Oracle and/or its affiliates. All Rights Reserved.
> >> + *
> >> + * 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 would 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 the Free Software Foundation,
> >> + * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> >> + */
> >> +
> >> +/*
> >> + * Some old libcs (like glibc < 2.7) do not provide interfaces for
> >> + * dynamically sized cpu sets, but provide only static cpu_set_t type
> >> + * with no more than CPU_SETSIZE cpus in it.
> >> + *
> >> + * This file is a wrapper of the dynamic interfaces using the static
> >> ones.
> >> + *
> >> + * If the number of cpus available on the system is greater than
> >> + * CPU_SETSIZE, this interface will not work. Update libc in this case :)
> >> + */
> >> +
> >> +#define _GNU_SOURCE
> >> +#include <sched.h>
> >> +
> >> +#ifndef LTP_SCHED_SETAFFINITY_H
> >> +#define LTP_SCHED_SETAFFINITY_H
> >> +
> >> +#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); \
> >> +}
> >> +#endif
> >> +
> >> +#ifndef CPU_FREE
> >> +#define CPU_FREE(ptr) free(ptr);
> >> +#endif
> >> +
> >> +#ifndef CPU_ALLOC_SIZE
> >> +#define CPU_ALLOC_SIZE(size) sizeof(cpu_set_t);
> >> +#endif
> >> +
> >> +#ifndef CPU_ZERO_S
> >> +#define CPU_ZERO_S(size, mask) CPU_ZERO(mask);
> >> +#endif
> >> +
> >> +#ifndef CPU_SET_S
> >> +#define CPU_SET_S(cpu, size, mask) CPU_SET(cpu, mask);
> >> +#endif
> >> +
> >> +#endif /* LTP_SCHED_SETAFFINITY_H */
> >> diff --git
> >> a/testcases/kernel/syscalls/sched_setaffinity/sched_setaffinity01.c
> >> b/testcases/kernel/syscalls/sched_setaffinity/sched_setaffinity01.c
> >> new file mode 100644
> >> index 0000000..d1b2abe
> >> --- /dev/null
> >> +++ b/testcases/kernel/syscalls/sched_setaffinity/sched_setaffinity01.c
> >> @@ -0,0 +1,177 @@
> >> +/*
> >> + * Copyright (c) 2014 Oracle and/or its affiliates. All Rights Reserved.
> >> + *
> >> + * 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 would 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 the Free Software Foundation,
> >> + * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> >> + */
> >> +
> >> +/*
> >> + * This test verifies sched_setaffinity(2) for all error conditions
> >> + * to occur correctly.
> >> + *
> >> + * sched_setaffinity() returns -1 and sets the error code to:
> >> + *
> >> + * 1) EFAULT, if the supplied memory address is invalid
> >> + * 2) EINVAL, if the mask doesn't contain at least one
> >> + *    permitted cpu
> >> + * 3) ESRCH, if the process whose id is pid could not
> >> + *    be found
> >> + * 4) EPERM, if the calling process doesn't have appropriate
> >> + *    privileges
> >> + */
> >> +
> >> +#define _GNU_SOURCE
> >> +#include <errno.h>
> >> +#include <pwd.h>
> >> +#include <sched.h>
> >> +#include <signal.h>
> >> +#include <unistd.h>
> >> +#include <sys/types.h>
> >> +#include <sys/wait.h>
> >> +#include "test.h"
> >> +#include "usctest.h"
> >> +#include "safe_macros.h"
> >> +#include "sched_setaffinity.h"
> >> +
> >> +char *TCID = "sched_setaffinity01";
> >> +
> >> +#define PID_MAX_PATH "/proc/sys/kernel/pid_max"
> >> +
> >> +static cpu_set_t *mask, *emask;
> >> +static cpu_set_t *fmask = (void *)-1;
> >> +static size_t mask_size, emask_size;
> >> +static pid_t self_pid, privileged_pid, free_pid;
> >> +static uid_t uid;
> >> +static const char nobody_uid[] = "nobody";
> >> +static struct passwd *ltpuser;
> >> +static long ncpus;
> >> +
> >> +static struct test_case_t {
> >> +	pid_t *pid;
> >> +	size_t *mask_size;
> >> +	cpu_set_t **mask;
> >> +	int exp_errno;
> >> +} test_cases[] = {
> >> +	{&self_pid, &mask_size, &fmask, EFAULT},
> >> +	{&self_pid, &emask_size, &emask, EINVAL},
> >> +	{&free_pid, &mask_size, &mask, ESRCH},
> >> +	{&privileged_pid, &mask_size, &mask, EPERM},
> >> +};
> >> +
> >> +int TST_TOTAL = ARRAY_SIZE(test_cases);
> >> +
> >> +static void cleanup(void)
> >> +{
> >> +	if (mask != NULL) {
> >> +		CPU_FREE(mask);
> >> +		mask = NULL;
> >> +	}
> >> +
> >> +	if (emask != NULL) {
> >> +		CPU_FREE(emask);
> >> +		emask = NULL;
> >> +	}
> >> +
> >> +	SAFE_SETEUID(NULL, uid);
> >> +
> >> +	if (privileged_pid != 0) {
> >> +		kill(privileged_pid, SIGKILL);
> >> +		waitpid(privileged_pid, NULL, 0);
> >> +		privileged_pid = 0;
> >> +	}
> >> +}
> >> +
> >> +static void setup(void)
> >> +{
> >> +	tst_require_root(NULL);
> >> +	uid = geteuid();
> >> +	ncpus = tst_ncpus_max();
> >> +
> >> +	/* Current mask */
> >> +	mask = CPU_ALLOC(ncpus);
> >> +	if (mask == NULL)
> >> +		tst_brkm(TBROK | TERRNO, cleanup, "CPU_ALLOC(%ld) failed",
> >> +			ncpus);
> >> +	mask_size = CPU_ALLOC_SIZE(ncpus);
> >> +	if (sched_getaffinity(0, mask_size, mask) < 0)
> >> +		tst_brkm(TBROK | TERRNO, cleanup, "sched_getaffinity() failed");
> >> +
> >> +	/* Mask with one more cpu than available on the system */
> >> +	emask = CPU_ALLOC(ncpus + 1);
> >> +	if (emask == NULL)
> >> +		tst_brkm(TBROK | TERRNO, cleanup, "CPU_ALLOC(%ld) failed",
> >> +			ncpus + 1);
> >> +	emask_size = CPU_ALLOC_SIZE(ncpus + 1);
> >> +	CPU_ZERO_S(emask_size, emask);
> >> +	CPU_SET_S(ncpus, emask_size, emask);
> >> +
> >> +	privileged_pid = tst_fork();
> >> +	if (privileged_pid == 0) {
> >> +		pause();
> >> +
> >> +		exit(0);
> >> +	} else if (privileged_pid < 0) {
> >> +		tst_brkm(TBROK | TERRNO, cleanup, "fork() failed");
> >> +	}
> >> +
> >> +	/* Dropping the root privileges */
> >> +	ltpuser = getpwnam(nobody_uid);
> >> +	if (ltpuser == NULL)
> >> +		tst_brkm(TBROK | TERRNO, cleanup,
> >> +			"getpwnam failed for user id %s", nobody_uid);
> >> +
> >> +	SAFE_SETEUID(cleanup, ltpuser->pw_uid);
> >> +
> >> +	/* this pid is not used by the OS */
> >> +	free_pid = tst_get_unused_pid(cleanup);
> >> +}
> >> +
> >> +int main(int argc, char *argv[])
> >> +{
> >> +	const char *msg;
> >> +	int lc;
> >> +	int i;
> >> +
> >> +	msg = parse_opts(argc, argv, NULL, NULL);
> >> +	if (msg != NULL)
> >> +		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
> >> +
> >> +	setup();
> >> +
> >> +	for (lc = 0; TEST_LOOPING(lc); lc++) {
> >> +		tst_count = 0;
> >> +		for (i = 0; i < TST_TOTAL; i++) {
> >> +			TEST(sched_setaffinity(*(test_cases[i].pid),
> >> +						*(test_cases[i].mask_size),
> >> +						*(test_cases[i].mask)));
> >> +
> >> +			if (TEST_RETURN != -1)
> >> +				tst_resm(TFAIL,
> >> +					"sched_setaffinity() unexpectedly succeded");
> >> +
> >> +			if (TEST_ERRNO == test_cases[i].exp_errno) {
> >> +				tst_resm(TPASS, "expected failure with '%s'",
> >> +					strerror(test_cases[i].exp_errno));
> >> +			} else {
> >> +				tst_resm(TFAIL,
> >> +					"call returned '%s', expected - '%s'",
> >> +					strerror(TEST_ERRNO),
> >> +					strerror(test_cases[i].exp_errno));
> >> +			}
> >> +		}
> >> +	}
> >> +
> >> +	cleanup();
> >> +	tst_exit();
> >> +}
> >> --
> >> 1.7.1
> >>
> >>
> >> ------------------------------------------------------------------------------
> >> Open source business process management suite built on Java and Eclipse
> >> Turn processes into business applications with Bonita BPM Community
> >> Edition
> >> Quickly connect people, data, and systems into organized workflows
> >> Winner of BOSSIE, CODIE, OW2 and Gartner awards
> >> http://p.sf.net/sfu/Bonitasoft
> >> _______________________________________________
> >> Ltp-list mailing list
> >> Ltp-list@lists.sourceforge.net
> >> https://lists.sourceforge.net/lists/listinfo/ltp-list
> >>
> 

------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

  reply	other threads:[~2014-07-15  7:05 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <53A12D27.8030205@oracle.com>
2014-07-02  7:30 ` [LTP] [PATCH V4] syscalls: implemented a test for sched_setaffinity() error values Stanislav Kholmanskikh
2014-07-14  8:07   ` Stanislav Kholmanskikh
2014-07-14 13:07   ` Jan Stancek
2014-07-15  6:53     ` Stanislav Kholmanskikh
2014-07-15  7:05       ` Jan Stancek [this message]
2014-07-15  7:53         ` Stanislav Kholmanskikh

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=2039620646.10066364.1405407937155.JavaMail.zimbra@redhat.com \
    --to=jstancek@redhat.com \
    --cc=ltp-list@lists.sourceforge.net \
    --cc=stanislav.kholmanskikh@oracle.com \
    --cc=vasily.isaenko@oracle.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox