All of lore.kernel.org
 help / color / mirror / Atom feed
* setitimer shows different between amd64 and ia32
@ 2011-07-25  3:10 Adam Lee
  2011-07-25  4:06 ` Mulyadi Santosa
  2011-07-25  4:09 ` Dave Hylands
  0 siblings, 2 replies; 4+ messages in thread
From: Adam Lee @ 2011-07-25  3:10 UTC (permalink / raw)
  To: kernelnewbies

Hi, all

I'm working on a test which invoking setitimer(), and it hang in
ia32 and ppc, but passed in amd64, could you guys give some help?

1, I know the 'value.it_interval.tv_usec' is too short, but why amd64
passed?

2, If I switch clock source from "tsc" to "hpet" on ia32, it passed.

3, I compiled it in ia32 and run it with ia32-libs in amd64, it passed.


Here is the source:


#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <errno.h>

#define LOOP_LIMIT  1E2

volatile int sigcount = 0;

void catcher(int sig)
{
	struct itimerval value;
	int which = ITIMER_REAL;
	sigcount++;
	if (sigcount > 1) {
		getitimer(which, &value);
		value.it_value.tv_sec = 0;
		value.it_value.tv_usec = 0;
		/*setitimer( which, &value, NULL ); */
	}
}

int main(int argc, char *argv[])
{
	int result = 0;
	struct itimerval value, ovalue, pvalue;
	int which = ITIMER_REAL;
	struct sigaction sact;
	volatile double count;
	time_t t;

	sigemptyset(&sact.sa_mask);
	sact.sa_flags = 0;
	sact.sa_handler = catcher;
	sigaction(SIGALRM, &sact, NULL);
	getitimer(which, &pvalue);

	/*Set a real time interval timer to repeat */
	value.it_interval.tv_sec = 0;
	value.it_interval.tv_usec = 1;
	value.it_value.tv_sec = 0;
	value.it_value.tv_usec = 5;
	result = setitimer(which, &value, &ovalue);

	/*The interval timer value returned by setitimer() should be */
	/*identical to the timer value returned by getitimer() */
	if (ovalue.it_interval.tv_sec != pvalue.it_interval.tv_sec ||
	    ovalue.it_interval.tv_usec != pvalue.it_interval.tv_usec ||
	    ovalue.it_value.tv_sec != pvalue.it_value.tv_sec ||
	    ovalue.it_value.tv_usec != pvalue.it_value.tv_usec) {
		printf("Real time interval timer mismatch, test Failed\n");
		result = -1;
	}
	time(&t);
	printf("Before loop, time is %s", ctime(&t));

	for (count = 0; ((count < LOOP_LIMIT)); count++) ;
	time(&t);
	printf("After loop, time is %s\n", ctime(&t));

	if (sigcount == 0)
		printf("The signal catcher never gained control\n");
	else
		printf("The signal catcher gained control\n");

	printf("The value of count is %.0f\n", count);

	return (result);
}


-- 
Regards,
Adam Lee
--------------------------------------------------
E-mail: adam8157@gmail.com
Website: http://www.adam8157.info
--------------------------------------------------

^ permalink raw reply	[flat|nested] 4+ messages in thread

* setitimer shows different between amd64 and ia32
  2011-07-25  3:10 setitimer shows different between amd64 and ia32 Adam Lee
@ 2011-07-25  4:06 ` Mulyadi Santosa
  2011-07-25  4:09 ` Dave Hylands
  1 sibling, 0 replies; 4+ messages in thread
From: Mulyadi Santosa @ 2011-07-25  4:06 UTC (permalink / raw)
  To: kernelnewbies

Hi....

On Mon, Jul 25, 2011 at 03:10, Adam Lee <adam8157@gmail.com> wrote:
> Hi, all
>
> I'm working on a test which invoking setitimer(), and it hang in
> ia32 and ppc, but passed in amd64, could you guys give some help?
>
> 1, I know the 'value.it_interval.tv_usec' is too short, but why amd64
> passed?

All of my answers are pure speculation. Regarding AMD64 that
successfully run the code, I am not sure it's due to the processor
itself. Maybe because...in your machine that use AMD64, it uses HPET
by default?

> 2, If I switch clock source from "tsc" to "hpet" on ia32, it passed.

This is interesting. I can only offer one explanation: finer grained
timer resolution. TSC itself should be fast, but I am not whether it
triggers interrupt...while on the other hand HPET will deliver
interrupt.

> 3, I compiled it in ia32 and run it with ia32-libs in amd64, it passed.

Very confusing to me.  Again I can only guess that maybe in your AMD64
machine, HPET is default timer?

-- 
regards,

Mulyadi Santosa
Freelance Linux trainer and consultant

blog: the-hydra.blogspot.com
training: mulyaditraining.blogspot.com

^ permalink raw reply	[flat|nested] 4+ messages in thread

* setitimer shows different between amd64 and ia32
  2011-07-25  3:10 setitimer shows different between amd64 and ia32 Adam Lee
  2011-07-25  4:06 ` Mulyadi Santosa
@ 2011-07-25  4:09 ` Dave Hylands
  2011-07-25  6:51   ` Adam Lee
  1 sibling, 1 reply; 4+ messages in thread
From: Dave Hylands @ 2011-07-25  4:09 UTC (permalink / raw)
  To: kernelnewbies

Hi Adam,

On Sun, Jul 24, 2011 at 8:10 PM, Adam Lee <adam8157@gmail.com> wrote:
> Hi, all
>
> I'm working on a test which invoking setitimer(), and it hang in
> ia32 and ppc, but passed in amd64, could you guys give some help?
>
> 1, I know the 'value.it_interval.tv_usec' is too short, but why amd64
> passed?
>
> 2, If I switch clock source from "tsc" to "hpet" on ia32, it passed.
>
> 3, I compiled it in ia32 and run it with ia32-libs in amd64, it passed.

I ran it on my 64-bit machine and it hung because the interval was so
short that it generated a continuous stream of signals.

Each signal took longer to process than the interval of the timer.

I added some memset's (since stack variables are uninitialized, and
stuff like sact will get some random values in it if you don't).

I changed the interval of the timer to be 1000 usec, and changed
LOOP_LIMIT to be 1E6, and I got the catcher to be called multiple
times.

-- 
Dave Hylands
Shuswap, BC, Canada
http://www.davehylands.com

^ permalink raw reply	[flat|nested] 4+ messages in thread

* setitimer shows different between amd64 and ia32
  2011-07-25  4:09 ` Dave Hylands
@ 2011-07-25  6:51   ` Adam Lee
  0 siblings, 0 replies; 4+ messages in thread
From: Adam Lee @ 2011-07-25  6:51 UTC (permalink / raw)
  To: kernelnewbies

On Sun, Jul 24, 2011 at 09:09:55PM -0700, Dave Hylands wrote:
> Hi Adam,
> 
> On Sun, Jul 24, 2011 at 8:10 PM, Adam Lee <adam8157@gmail.com> wrote:
> > Hi, all
> >
> > I'm working on a test which invoking setitimer(), and it hang in
> > ia32 and ppc, but passed in amd64, could you guys give some help?
> >
> > 1, I know the 'value.it_interval.tv_usec' is too short, but why amd64
> > passed?
> >
> > 2, If I switch clock source from "tsc" to "hpet" on ia32, it passed.
> >
> > 3, I compiled it in ia32 and run it with ia32-libs in amd64, it passed.
> 
> I ran it on my 64-bit machine and it hung because the interval was so
> short that it generated a continuous stream of signals.
> 
> Each signal took longer to process than the interval of the timer.
> 
> I added some memset's (since stack variables are uninitialized, and
> stuff like sact will get some random values in it if you don't).
> 
> I changed the interval of the timer to be 1000 usec, and changed
> LOOP_LIMIT to be 1E6, and I got the catcher to be called multiple
> times.
> 

Thank you all, I tried it again.

Xeoc E5502, RHEL 6.1:
tsc: just exit without any warning
hpet: hang

Xeon X7550, RHEL 5.7:
tsc & hpet: "The signal catcher never gained control" 

I'm confused, maybe the result due to the processor?

-- 
Regards,
Adam Lee
--------------------------------------------------
E-mail: adam8157 at gmail.com
Website: http://www.adam8157.info
--------------------------------------------------

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-07-25  6:51 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-25  3:10 setitimer shows different between amd64 and ia32 Adam Lee
2011-07-25  4:06 ` Mulyadi Santosa
2011-07-25  4:09 ` Dave Hylands
2011-07-25  6:51   ` Adam Lee

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.