Skip to contentSkip to conversation

Real-Time Preemption, using msecs_to_jiffies() instead of HZ

PATCH In review Luca Falavigna 2 participants 3 messages Jun 11, 2005 – Jun 13, 2005

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Real-Time Preemption, using msecs_to_jiffies() instead of HZ

Hi,

I was looking at kernel/softlookup.c when I noticed you used HZ in order to get a 10-second delay:

void softlockup_tick(struct pt_regs *regs)

{
	...
	if (time_after(jiffies, timestamp + 10*HZ)) {
	...
}

I created this small patch (built against version 2.6.12-rc6-V0.7.48-05) which does use of msecs_to_jiffies() to get a correct behaviour with every platform. Similarly I modified function watchdog and kernel/irq/autoprobe.c file (probe_irq_on function).

Here is the patch:

rtp-2.6.12-rc6-V0.7.48-05 renamed from rtp-2.6.12-rc6-V0.7.48-05.orig +4 -4
@@ -7425,7 +7425,7 @@
 +	/*
 +	 * Wait for longstanding interrupts to trigger, 20 msec delay:
 +	 */
-+	msleep(HZ/50);
++	msleep(msecs_to_jiffies(20));
 
  	/*
  	 * enable any unassigned irqs
@@ -7452,7 +7452,7 @@
  	 */
 -	for (delay = jiffies + HZ/10; time_after(delay, jiffies); )
 -		/* about 100ms delay */ barrier();
-+	msleep(HZ/10);
++	msleep(msecs_to_jiffies(100));
 
  	/*
  	 * Now filter out any obviously spurious interrupts
@@ -10712,7 +10712,7 @@
 +	if (did_panic)
 +		return;
 +
-+	if (time_after(jiffies, timestamp + 10*HZ)) {
++	if (time_after(jiffies, timestamp + msecs_to_jiffies(10000))) {
 +		per_cpu(print_timestamp, this_cpu) = timestamp;
 +
 +		spin_lock(&print_lock);
@@ -10748,7 +10748,7 @@
 +	 */
 +	while (!kthread_should_stop()) {
 +		set_current_state(TASK_INTERRUPTIBLE);
-+		msleep_interruptible(HZ);
++		msleep_interruptible(msecs_to_jiffies(1000));
 +		touch_softlockup_watchdog();
 +	}
 +	__set_current_state(TASK_RUNNING);

Regards,

Signature · 1 line
					Luca
#1 lore raw
Quoted 9 lines · Luca Falavigna

I was looking at kernel/softlookup.c when I noticed you used HZ in order to get a 10-second delay:

void softlockup_tick(struct pt_regs *regs)

{
	...
	if (time_after(jiffies, timestamp + 10*HZ)) {
	...
}

oops, indeed. (i've also forwarded your patch to akpm, as the softlockup patch is included in -mm too)

Quoted 10 lines

I created this small patch (built against version 2.6.12-rc6-V0.7.48-05) which does use of msecs_to_jiffies() to get a correct behaviour with every platform. Similarly I modified function watchdog and kernel/irq/autoprobe.c file (probe_irq_on function).

Here is the patch:

++ msleep(msecs_to_jiffies(20));
++ msleep(msecs_to_jiffies(100));
++ msleep_interruptible(msecs_to_jiffies(1000));

actually, this should be msleep(20/100/1000). I've fixed these in my tree.

Ingo

#2 lore raw

Ingo Molnar ha scritto:

Quoted 2 lines

oops, indeed. (i've also forwarded your patch to akpm, as the softlockup patch is included in -mm too)

OK, thank you!

I also found another couple of those in drivers/char/rtc.c file. Here is a quick fix:

rtp-2.6.12-rc6-V0.7.48-17 renamed from rtp-2.6.12-rc6-V0.7.48-17.orig +2 -2
@@ -17044,7 +17044,7 @@
 -			barrier();
 -			cpu_relax();
 -		}
-+		msleep(2*HZ/100);
++		msleep(20);
  	
  	spin_lock_irq(&rtc_lock);
  	year = CMOS_READ(RTC_YEAR);
@@ -17102,7 +17102,7 @@
 -			barrier();
 -			cpu_relax();
 -		}
-+		msleep(2*HZ/100);
++		msleep(20);
 
  	/*
  	 * Only the values that we read from the RTC are set. We leave

Regards,

Signature · 1 line
					Luca