Subrata
I have fixed the problem noticed earlier. Hope it will be fine this
time. More over I wanted to mention that I have dropped getcpu2.c as it
was found to be less relevant for getcpu() testing.
Andi had made some suggestions to improve the test, I am submitting
this before making all those changes. If possible I will sit and work on
Andi's suggestion.
Thanks
Yeehaw
Index: ltp-full-20070930/testcases/kernel/syscalls/getcpu/Makefile
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ltp-full-20070930/testcases/kernel/syscalls/getcpu/Makefile 2008-08-22 18:02:26.000000000 +0530
@@ -0,0 +1,38 @@
+#
+# Copyright (c) International Business Machines Corp., 2001
+#
+# 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
+#
+
+CFLAGS += -I../../../../include -Wall
+LDLIBS += -L../../../../lib -lltp
+
+SRCS = $(wildcard *.c)
+TARGETS = $(patsubst %.c,%,$(SRCS))
+
+ifeq ($(shell uname -r | grep -c "^2\.6\.*"), 1)
+
+all: $(TARGETS)
+
+install:
+ @set -e; for i in $(TARGETS); do ln -f $$i ../../../bin/$$i ; done
+else
+
+all install:
+ @echo "Warning: Kernel doesn't support this test case"
+endif
+
+clean:
+ rm -f $(TARGETS)
Index: ltp-full-20070930/testcases/kernel/syscalls/getcpu/getcpu01.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ltp-full-20070930/testcases/kernel/syscalls/getcpu/getcpu01.c 2008-08-22 18:02:08.000000000 +0530
@@ -0,0 +1,283 @@
+/*
+ *
+ * Copyright © International Business Machines Corp., 2007, 2008
+ *
+ * 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 02111-1301 USA
+ */
+
+/*
+ * NAME
+ * getcpu1.c
+ *
+ * DESCRIPTION
+ * getcpu01 - call getcpu() and make sure it succeeds
+ *
+ * ALGORITHM
+ * set cpu affinity of the process
+ * If setaffinity() fails exit from the test suite
+ * Store the node ID of the cpu which has been set in previous step
+ * Make a call to getcpu() system call
+ * Verify the returned valued with the set value
+ * if they match
+ * test is considered PASS
+ * else
+ * test is considered FAIL
+ *
+ * USAGE: <for command-line>
+ * getcpu [-c n] [-f] [-i n] [-I x] [-P x] [-t]
+ * where, -c n : Run n copies concurrently.
+ * -f : Turn off functionality Testing.
+ * -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.
+ *
+ * HISTORY
+ * 06/2008 written by Sharyathi Nagesh <[EMAIL PROTECTED]>
+ *
+ * RESTRICTIONS
+ * none
+ */
+
+
+#define _GNU_SOURCE
+#include <sched.h>
+#include <errno.h>
+#include "test.h"
+#include "usctest.h"
+#include <sys/types.h>
+#include <dirent.h>
+
+#if defined(__i386__) || defined(__x86_64__)
+ #if defined(__GLIBC__) && defined(__GLIBC_MINOR__) \
+ && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 6
+ #if defined(__x86_64__)
+ #include <utmpx.h>
+ #endif
+ int sys_support = 1;
+ #elif defined(__i386__)
+ int sys_support = 1;
+ #else
+ int sys_support = 0;
+ #endif
+#else
+int sys_support = 0;
+#endif
+
+void cleanup(void);
+void setup(void);
+static inline int getcpu(unsigned int *, unsigned int *, void *);
+unsigned int set_cpu_affinity();
+unsigned int get_nodeid(unsigned int);
+unsigned int max_cpuid(cpu_set_t *);
+
+char *TCID= "getcpu01";
+int TST_TOTAL = 1;
+extern int Tst_count;
+
+
+int main(int ac, char **av)
+{
+ int lc; /* loop counter */
+ char *msg; /* message returned from parse_opts */
+ unsigned int cpu_id, node_id = 0 ;
+ unsigned int cpu_set;
+ #ifdef __i386__
+ unsigned int node_set;
+ #endif
+
+ /* Check For Kernel Version */
+ if(((tst_kvercmp(2,6,20)) < 0) || (sys_support))
+ {
+ tst_resm(TCONF, "This test can only run on kernels that are ");
+ tst_resm(TCONF, "2.6.20 and higher and glibc version 2.6 and above");
+ tst_resm(TCONF, "Currently the test case has been");
+ tst_resm(TCONF, "developed only for i386 and x86_64");
+ exit(0);
+ }
+
+ /* parse standard options */
+ if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL)
+ tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg);
+
+
+ setup(); /* global setup */
+
+ /* The following loop checks looping state if -i option given */
+
+ for (lc = 0; TEST_LOOPING(lc); lc++) {
+ /* reset Tst_count in case we are looping */
+ Tst_count = 0;
+
+ /* call the system call with the TEST() macro */
+ cpu_set = set_cpu_affinity();
+ #ifdef __i386__
+ node_set = get_nodeid(cpu_set);
+ #endif
+ TEST(getcpu(&cpu_id,&node_id,NULL));
+ if( TEST_RETURN == 0 ) {
+ if ( cpu_id != cpu_set ) {
+ tst_resm(TFAIL, "getcpu() returned wrong value"\
+ " expected cpuid:%d, returned value cpuid: %d",
+ cpu_set,cpu_id);
+ tst_exit();
+ }
+ #ifdef __i386__
+ else if( node_id != node_set ){
+ tst_resm(TFAIL, "getcpu() returned wrong value"\
+ " expected node id:%d returned node id:%d",
+ node_set,node_id);
+ tst_exit();
+ }
+ #endif
+ else
+ tst_resm(TPASS, "getcpu() returned proper"\
+ " cpuid:%d, node id:%d", cpu_id,node_id);
+ } else {
+ tst_resm(TFAIL, "getcpu() Failed, errno=%d:%s",
+ TEST_ERRNO,strerror(TEST_ERRNO));
+ tst_exit();
+ }
+ }
+
+ cleanup();
+
+ /*NOTREACHED*/
+ return(0);
+}
+
+/*
+ * getcpu() - calls the system call
+ */
+static inline int getcpu(unsigned *cpu_id, unsigned *node_id, void *cache_struct)
+{
+ #if defined(__i386__)
+ return syscall(318, cpu_id,node_id,cache_struct);
+ #elif defined(__x86_64__)
+ #if defined(__GLIBC__) && defined(__GLIBC_MINOR__) \
+ && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 6
+ return *cpu_id = sched_getcpu();
+ #endif
+ return 0;
+ #endif
+ return 0;
+}
+
+
+/*
+ * setup() - performs all the ONE TIME setup for this test.
+ */
+void
+setup(void)
+{
+ /* capture signals */
+ /* ?? */
+ /* Pause if that option was specified */
+ TEST_PAUSE;
+}
+
+/*
+ * This will set the affinity to max cpu on which process can run
+ * and return that cpu id to the calling process
+ */
+unsigned int
+set_cpu_affinity()
+{
+ unsigned cpu_max;
+ cpu_set_t set;
+ if ( sched_getaffinity(0, sizeof(cpu_set_t), &set) < 0 ){
+ tst_resm(TFAIL,"sched_getaffinity:errno:%d",errno);
+ tst_exit();
+ }
+ cpu_max = max_cpuid(&set);
+ CPU_ZERO(&set);
+ CPU_SET(cpu_max,&set);
+ if ( sched_setaffinity(0, sizeof(cpu_set_t), &set) < 0 ){
+ tst_resm(TFAIL,"sched_setaffinity:errno:%d",errno);
+ tst_exit();
+ }
+ return cpu_max;
+}
+
+/*
+ * Return the maximum cpu id
+ */
+#define BITS_PER_BYTE 8
+unsigned int
+max_cpuid(cpu_set_t *set)
+{
+ unsigned int index, max = 0;
+ for ( index = 0; index < sizeof(cpu_set_t) * BITS_PER_BYTE; index++)
+ if(CPU_ISSET(index,set)) max = index;
+ return max;
+}
+
+
+/*
+ * get_nodeid(cpuid) - This will return the node to which selected cpu belongs
+ */
+unsigned int
+get_nodeid(unsigned int cpu_id)
+{
+ DIR *directory_parent, *directory_node;
+ struct dirent *de,*dn;
+ char directory_path[255];
+ unsigned int cpu;
+ int node_id = 0;
+
+ directory_parent = opendir("/sys/devices/system/node");
+ if (!directory_parent) {
+ tst_resm(TWARN,
+ "/sys not mounted or not a numa system. Assuming one node: %s",
+ strerror(errno));
+ return 0; //By Default assume it to belong to node Zero
+ } else {
+ while ((de = readdir(directory_parent)) != NULL) {
+ if (strncmp(de->d_name, "node", 4))
+ continue;
+ sprintf(directory_path,"/sys/devices/system/node/%s",de->d_name);
+ directory_node = opendir(directory_path);
+ while ((dn = readdir(directory_node)) != NULL) {
+ if (strncmp(dn->d_name, "cpu", 3))
+ continue;
+ cpu = strtoul(dn->d_name+3,NULL,0);
+ if ( cpu == cpu_id ){
+ node_id = strtoul(de->d_name+4, NULL, 0);
+ break;
+ }
+ }
+ closedir(directory_node);
+ }
+ closedir(directory_parent);
+ }
+ return node_id;
+}
+
+/*
+ * cleanup() - performs all the ONE TIME cleanup for this test at completion
+ * or premature exit.
+ */
+void
+cleanup(void)
+{
+ /*
+ * print timing stats if that option was specified.
+ * print errno log if that option was specified.
+ */
+ TEST_CLEANUP;
+ /* exit with return code appropriate for results */
+ tst_exit();
+}
+
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list