Commit Graph

71 Commits

Author SHA1 Message Date
Michael Kerrisk ed7a722d13 Updated FIXME 2007-05-21 10:14:23 +00:00
Michael Kerrisk a8e86ff2a6 Updated FIXME 2007-05-21 06:51:37 +00:00
Michael Kerrisk a1d5f77cc8 Reordered sections to be more consistent, in some cases renaming
sections or shifting paragraphs between sections.
2007-05-18 16:06:42 +00:00
Michael Kerrisk e37e328263 Move SEE ALSO section to end of page 2007-05-16 18:25:50 +00:00
Michael Kerrisk c13182efa3 Wrapped long lines, wrapped at sentence boundaries; stripped trailing
white space.
2007-04-12 22:42:49 +00:00
Michael Kerrisk cf0a9ace57 ffix 2007-04-05 12:36:57 +00:00
Michael Kerrisk a7fadb5558 Updated CONFOMRING TOs and/or standards references. 2006-08-04 12:39:17 +00:00
Michael Kerrisk 8de811e83f Noted effect of fork() and execve(). 2006-07-22 15:54:34 +00:00
Michael Kerrisk 093a7ea09b Update on scheduled fix for tv_usec 2006-04-26 20:00:27 +00:00
Michael Kerrisk 563711249d Added text to note that current incorrect behaviour of
normalising tv_usec >= 1000000 will be repaired in a future
kernel; applications should be fixed now.
2006-04-26 19:39:33 +00:00
Michael Kerrisk eafd5ce11f Added SEE ALSO referring to new time.7 2006-04-26 07:26:36 +00:00
Michael Kerrisk a8bbb90693 Updated discussion of maximum timer value to reflect the fact
that the default jiffy is now 4 milliseconds.
Added a FIXME.
2006-04-26 04:42:14 +00:00
Michael Kerrisk cd31a0d631 spfix 2006-03-20 00:52:31 +00:00
Michael Kerrisk 26a9dd2f79 Fix SYNOPSIS formatting 2006-03-08 02:48:53 +00:00
Michael Kerrisk 4041a5abf1 Von: "Michael Kerrisk" <mtk-manpages@gmx.net>
An: Olivier Croquette <ocroquette@free.fr>
Betreff: Re: 2.6.12 and setitimer
Datum: Mon, 4 Jul 2005 08:36:35 +0200 (MEST)

Hi Olivier,

> You will probably consider adding also a note to point out that the bug 
> will stay a known bug of the 2.4 serie:
> 
> http://lkml.org/lkml/2005/7/1/165

First off, I _very_ much appreciate the fact that you keep 
informing me of the progress of this bug!  Thank you.

At the moment, I'm inlined yo leave the manual page as it is.
It currently reads:

       On certain systems (including x86), Linux ker&#8208;
       nels  before  version  2.6.12 have a bug which
       will produce premature timer expirations of up
       to  one  jiffy under some circumstances.  This
       bug is fixed in kernel 2.6.12.

To me that implies that the bug also affects kernels before 
2.4 -- e.g., 2.4.x.  Now, what would be interesting is if the
bug *does* get fixed in 2.4, then I could also add a note 
about the 2.4.x version where it is fixed.

In the meantime, I have added a note to myself (i.e., a comment
in the man page source) about this point.

If the bug *does* eventually get fixed in 2.4.x, and you 
hear of it, please do let me know.

Thanks,

Michael
2005-07-04 06:44:50 +00:00
Michael Kerrisk 7704d9671e The short sleep bug (up to 1 jiffy) that was newly noted in
man-pages-2.04 has just been fixed in 2.6.12.
2005-06-23 07:16:55 +00:00
Michael Kerrisk fb654466a6 Minor changes 2005-06-21 13:50:30 +00:00
Michael Kerrisk f59a3f1941 Global edit: s/nonzero/non-zero/ 2005-06-15 13:32:34 +00:00
Michael Kerrisk c13fcab060 Salut Olivier (and Nishanth),
Regarding man page documentation of the problem of short sleeps 
for setiteimer(2)...

> > -- pointers to those threads
> 
> http://bugzilla.kernel.org/show_bug.cgi?id=4569
> http://lkml.org/lkml/2005/4/29/163
> 
> > -- indications of which kernel versions show this bahaviour
> 
> AFAIK, all versions as far as x86 is concerned.
> Dunno if it is hardware specific.
> 
> > -- a (short) test program to demonstrate it, if you have one.
> 
> See the bugzilla bug's attachments

Sorry for the long delay in following this up, but I've got to 
it now.  I tweaked your suggestions slightly:

{{
Timers will never expire before the requested time,
-instead expiring some short, constant time afterwards, dependent
-on the system timer resolution (currently 10ms).  
+but may expire some (short) time afterwards, which depends
+on the system timer resolution and on the system load.
+Upon expiration, a signal will be generated and the timer reset.
+If the timer expires while the process is active (always true for

+On certain systems (including x86), the Linux kernel has a bug which will
+produce premature timer expirations of up to one jiffy under some
+circumstances.
}}

Thanks for this bug reporet,

Nishanth: if and when your changes are accepted, and the problem 
is thus fixed, could you please send me a notification of that
fact, and I can then further amend the manual pages.

Cheers,

Michael



/* itimer_short_interval_bug.c 

   June 2005

   In current Linux kernels, an interval timer set using setitimer() 
   can sometimes sleep *less* than the specified interval.
   This program demonstrates the behaviour by looping through all
   itimer values from 1 microsecond upwards, in one microsecond steps.
*/
/* Adapted from a program by Olivier Croquette, June 2005 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/wait.h>



typedef unsigned long long int u_time_t; /* in microsecs */

static int handler_flag;

/* return time as a number of microsecs  */

static u_time_t 
gettime(void ) 
{
    struct timeval tv;

    if ( gettimeofday(&tv, NULL) == -1) {
        perror("gettimeofday()");
        return 0;
    }
    return (tv.tv_usec + tv.tv_sec * 1000000LL);
}


static void 
handler (int sig, siginfo_t *siginfo, void *context) 
{
    handler_flag++;
    return ;
}


/* Sleep for 'time' microsecs. */
static int 
isleep(u_time_t time) 
{
    struct itimerval  newtv;
    sigset_t sigset;
    struct sigaction  sigact;

    if (time == 0)
        return 0;

    /* block SIGALRM */
    sigemptyset (&sigset);
    sigaddset (&sigset, SIGALRM);
    sigprocmask (SIG_BLOCK, &sigset, NULL);

    /* set up our handler */
    sigact.sa_sigaction  = handler;
    sigemptyset(&sigact.sa_mask);
    sigact.sa_flags = SA_SIGINFO;
    sigaction (SIGALRM, &sigact, NULL);
 
    newtv.it_interval.tv_sec  = 0;
    newtv.it_interval.tv_usec = 0;
    newtv.it_value.tv_sec     = time / 1000000;
    newtv.it_value.tv_usec    = time % 1000000;
    if (setitimer(ITIMER_REAL,&newtv,NULL) == -1) {
        perror("setitimer(set)");
        return 1;
    }

    sigemptyset (&sigset);
    sigsuspend (&sigset);
    return 0;
}


int 
main(int argc, char *argv[]) {
    u_time_t wait;
    int loop, numLoops;
    u_time_t t1, t2;
    u_time_t actual;
    long long minDiff, maxDiff, totDiff, diff;
    int numFail = 0;

    if (argc != 2) {
	fprintf(stderr, "Usage: %s num-loops\n", argv[0]);
	exit(EXIT_FAILURE);
    } /* if */

    numLoops = atoi(argv[1]);
    setbuf(stdout, NULL);

    for (wait = 1; ; wait++) {
	maxDiff = 0;
	numFail = 0;
	totDiff = 0;
	minDiff = -wait;

        if (wait % 10000 == 0)
	    printf("%llu\n", wait);
        
	for (loop = 0; loop < numLoops; loop++) {
            t1 = gettime();

            handler_flag = 0;
            isleep(wait);
	    
	    if ( handler_flag != 1 ) 
                printf("Problem with the handler flag (%d)!\n", handler_flag);
    
            t2 = gettime();
            actual = t2 - t1;
            if ( actual < wait ) {
	        diff = actual - wait;
		if (diff < maxDiff)
		    maxDiff = diff;
		if (diff > minDiff)
		    minDiff = diff;
		totDiff += diff;
		numFail++;
	    } /* if */

        } /* for */
	if (numFail > 0) 
            printf("%llu: %3d fail (%4lld %4lld; avg=%6.1f)\n", 
		    wait, numFail, minDiff, maxDiff, 
		    (double) totDiff / numFail);
    } /* for */

    return 0;
} /* main */
2005-06-13 09:01:49 +00:00
Michael Kerrisk fcad9022d3 Matthias Lang, mtk
Noted MAX_SEC_IN_JIFFIES ceiling.
Added note about treatment of out-of-range tv_usec values.
2005-04-06 15:29:32 +00:00
Michael Kerrisk fea681dafb Import of man-pages 1.70 2004-11-03 13:51:07 +00:00