From: M. K. <mat...@ar...> - 2009-04-14 07:37:06
|
Hi Manas, thanks for your mail. I agree that you can use this tiny program to contribute it to LTP under the GPL. I don't know if it helps you there as the issue can be reproduced only when stopping the program via gdb. I assume that the LTP programs are running in a kind of batch mode or is it possible to "simulate" a gdb debug session? Regards Mathias ----- Original Nachricht ---- Von: Manas K Nayak <mak...@in...> An: "M. Koehrer" <mat...@ar...> Datum: 13.04.2009 14:27 Betreff: [PATCH 02/03] Add clock_nanosleep2() syscall test to LTP [LKML Subject: Issue with clock_nanosleep(), TIMER_ABSTIME and CONFIG_CC_OPTIMIZE_FOR_SIZE not set] > Hi Mathias, > > >Hi all! > >I am using kernel 2.6.29.1 from kernel.org on a Debian 5.0 (Lenny) system > (Intel Core2Quad). > >GCC is 4.3.2 > >I have not set CONFIG_CC_OPT_SIZE. > > > >When I use clock_nanosleep with TIMER_ABSTIME with gdb and stop the > execution by CTRL-C, > >I cannot continue the execution of my program when it interrupted the > clock_nanosleep call. > > > >When I set the kernel config parameter CONFIG_CC_OPT_SIZE everything is > fine. > >There seems to be an optimization issue that is related to the > clock_nanosleep system call. > > > >Some more remarks: > >When I use relative times (mode set to 0) everything works fine in both > cases. > >CONFIG_TICK_ONESHOT=y > >CONFIG_HIGH_RES_TIMERS=y > > > > > >Here is my tiny test program that demonstrates the behaviour: > >Let it run in gdb, interrupt it (CTRL-C) and try to continue "c". > > > >***************** BEGIN ************************ > >#define _GNU_SOURCE > >#include <stdio.h> > >#include <time.h> > >#include <unistd.h> > >#include <sys/syscall.h> > >#include <linux/unistd.h> > > > >const clockid_t CLOCK_TO_USE=CLOCK_MONOTONIC; > >static int clock_nanosleep2(clockid_t clock_id, int flags, const struct > timespec *req, > > struct timespec *rem) > >{ > > return syscall(__NR_clock_nanosleep, clock_id, flags, req, rem); > >} > > > >int main(void) > >{ > > int i; > > struct timespec ts; > > clock_gettime(CLOCK_TO_USE, &ts); > > > > for (i=0; i<=1000; i++) > > { > > ts.tv_sec++; > > clock_nanosleep2(CLOCK_TO_USE, TIMER_ABSTIME, &ts, NULL); > > // clock_nanosleep(CLOCK_TO_USE, TIMER_ABSTIME, &ts, NULL); > > printf("%i\n",i); > > } > > > > return 0; > >} > > > >/* Build with > > gcc test_clock_nanosleep.c -g -Wall -lrt > >*/ > >**************** END ******************* > > > >Thanks for all feedback on that issue > > I picked up this test porgram written by you from LKML, and has ported the > same to LTP under GPL. If you would agree, we can contribute this small > test to LTP. The below patch does that for you. > > Original-Author: M. Koehrer <mat...@ar...>, > Ported-To-LTP-By: Manas K Nayak <mak...@in...>, > --- > > --- > ltp-full-20090331.orig/testcases/kernel/syscalls/clock_nanosleep2/clock_nano > sleep2_01.c 1970-01-01 05:30:00.000000000 +0530 > +++ > ltp-full-20090331/testcases/kernel/syscalls/clock_nanosleep2/clock_nanosleep > 2_01.c 2009-04-13 16:50:18.000000000 +0530 > @@ -0,0 +1,155 @@ > +/************************************************************************** > ****/ > +/* Copyright (c) M. Koehrer <mat...@ar...>, 2009 > */ > +/* > */ > +/* LKML Reference: http://lkml.org/lkml/2009/4/9/89 > */ > +/* > */ > +/* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > */ > +/* > */ > +/************************************************************************** > ****/ > +/************************************************************************** > ****/ > +/* > */ > +/* File: clock_nanosleep2_01.c > */ > +/* > */ > +/* Description: This tests the clock_nanosleep2-out() syscall > */ > +/* > */ > +/* Usage: <for command-line> > */ > +/* clock_nanosleep2_01 [-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: clock_nanosleep2_01 > */ > +/************************************************************************** > ****/ > +#define _GNU_SOURCE > +#include <stdio.h> > +#include <time.h> > +#include <unistd.h> > +#include <sys/syscall.h> > +#include <linux/unistd.h> > + > +/* Harness Specific Include Files. */ > +#include "test.h" > +#include "usctest.h" > +#include "linux_syscall_numbers.h" > + > +/* Extern Global Variables */ > +extern int Tst_count; /* counter for tst_xxx routines. > */ > +extern char *TESTDIR; /* temporary dir created by tst_tmpdir() > */ > + > +/* Global Variables */ > +char *TCID = "clock_nanosleep2_01"; /* Test program identifier.*/ > +int testno; > +int TST_TOTAL = 1; /* total number of tests in this > file. */ > + > +/* Extern Global Functions */ > +/************************************************************************** > ****/ > +/* > */ > +/* Function: cleanup > */ > +/* > */ > +/* Description: Performs all one time clean up for this test on successful > */ > +/* completion, premature exit or failure. Closes all > temporary */ > +/* files, removes all temporary directories exits the test > with */ > +/* appropriate return code by calling tst_exit() function. > */ > +/* > */ > +/* Input: None. > */ > +/* > */ > +/* Output: None. > */ > +/* > */ > +/* Return: On failure - Exits calling tst_exit(). Non '0' return code. > */ > +/* On success - Exits calling tst_exit(). With '0' return > code. */ > +/* > */ > +/************************************************************************** > ****/ > +extern void cleanup() { > + /* Remove tmp dir and all files in it */ > + TEST_CLEANUP; > + tst_rmdir(); > + > + /* Exit with appropriate return code. */ > + tst_exit(); > +} > + > +/* Local Functions */ > +/************************************************************************** > ****/ > +/* > */ > +/* Function: setup > */ > +/* > */ > +/* Description: Performs all one time setup for this test. This function is > */ > +/* typically used to capture signals, create temporary dirs > */ > +/* and temporary files that may be used in the course of this > */ > +/* test. > */ > +/* > */ > +/* Input: None. > */ > +/* > */ > +/* Output: None. > */ > +/* > */ > +/* Return: On failure - Exits by calling cleanup(). > */ > +/* On success - returns 0. > */ > +/* > */ > +/************************************************************************** > ****/ > +void setup() { > + /* Capture signals if any */ > + /* Create temporary directories */ > + TEST_PAUSE; > + tst_tmpdir(); > +} > + > + > +const clockid_t CLOCK_TO_USE=CLOCK_MONOTONIC; > +static int clock_nanosleep2(clockid_t clock_id, int flags, const struct > timespec *req,struct timespec *rem) > +{ > + return syscall(__NR_clock_nanosleep, clock_id, flags, req, rem); > +} > + > + > +int main(int ac, char **av) { > + int i; > + int lc; /* loop counter */ > + char *msg; /* message returned from parse_opts */ > + struct timespec ts; > + > + /* parse standard options */ > + if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char > *)NULL){ > + tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); > + tst_exit(); > + } > + > + setup(); > + > + /* Check looping state if -i option given */ > + for (lc = 0; TEST_LOOPING(lc); ++lc) { > + Tst_count = 0; > + for (testno = 0; testno < TST_TOTAL; ++testno) { > + TEST(clock_gettime(CLOCK_TO_USE, &ts)); > + for (i=0; i<=50; i++){ > + ts.tv_sec++; > + TEST(clock_nanosleep2(CLOCK_TO_USE, TIMER_ABSTIME, &ts, NULL)); > + if (TEST_ERRNO) { > + tst_resm(TFAIL, "%s failed - errno = %d > : %s", TCID, TEST_ERRNO, strerror(TEST_ERRNO)); > + cleanup(); > + tst_exit(); > + } > + tst_resm(TINFO,"Iteration = %i",i); > + } > + tst_resm(TPASS, "clock_nanosleep2() passed"); > + } > + } > + tst_exit(); > +} > + > --- > ltp-full-20090331.orig/testcases/kernel/syscalls/clock_nanosleep2/Makefile > 1970-01-01 05:30:00.000000000 +0530 > +++ ltp-full-20090331/testcases/kernel/syscalls/clock_nanosleep2/Makefile > 2009-04-13 16:37:08.000000000 +0530 > @@ -0,0 +1,31 @@ > +# > +# Copyright (c) International Business Machines Corp., 2009 > +# > +# 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 -lrt > + > +SRCS = $(wildcard *.c) > +TARGETS = $(patsubst %.c,%,$(SRCS)) > + > +all: $(TARGETS) > + > +install: > + @set -e; for i in $(TARGETS); do ln -f $$i ../../../bin/$$i ; done > + > +clean: > + rm -f $(TARGETS) > --- ltp-full-20090331.orig/runtest/syscalls 2009-04-13 16:14:07.000000000 > +0530 > +++ ltp-full-20090331/runtest/syscalls 2009-04-13 17:02:05.000000000 +0530 > @@ -67,6 +67,7 @@ chroot02 chroot02 > chroot03 chroot03 > chroot04 chroot04 > > +clock_nanosleep2_01 clock_nanosleep2_01 > > clone01 clone01 > clone02 clone02 > > --- > Regards-- > Manas > > -- Mathias Koehrer mat...@ar... Zerreißen Sie die Netze der Phisher, Hacker und Betrüger! Ihre Internet-Sicherheits-Seiten auf Arcor.de bieten alle Infos und Hilfsmittel, die Sie zum sicheren Surfen brauchen! Play it safe! http://www.arcor.de/footer-sicherheit/ |