Skip to contentSkip to conversation

fix heartbeat

PATCH In review Val Henson 2 participants 4 messages Feb 9, 2002 – Feb 10, 2002

lore
Share & tools
lore

Val Henson

author
#0 lore raw

PATCH 1/1 fix heartbeat

The heartbeat function will not execute properly on Gemini without this patch. (Check for cpu 0 removed from gemini_heartbeat.)

-VAL

arch/ppc/kernel/time.c +2 -1
diff -Nru a/arch/ppc/kernel/time.c b/arch/ppc/kernel/time.c
@@ -208,7 +208,8 @@
 	smp_local_timer_interrupt(regs);
 #endif /* CONFIG_SMP */
 
-	if (ppc_md.heartbeat && !ppc_md.heartbeat_count--)
+	if (ppc_md.heartbeat && !smp_processor_id() &&
+	    !ppc_md.heartbeat_count--)
 		ppc_md.heartbeat();
 
 	hardirq_exit(cpu);

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

#1 lore raw
Quoted 3 lines · Val Henson

The heartbeat function will not execute properly on Gemini without this patch. (Check for cpu 0 removed from gemini_heartbeat.)

CHRP needs the heartbeat function called on all cpus, IIRC.

Clearly the heartbeat_count needs to be per-cpu or else pushed into the heartbeat function. How about we make it just

	if (ppc_md.heartbeat)
		ppc_md.heartbeat();

and let the heartbeat function do the if (!smp_processor_id()) and the if (!heartbeat_count--) if it wants?

Paul.

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

author
#2 lore raw
Quoted 7 lines · Paul Mackerras
Quoted 3 lines · Val Henson

The heartbeat function will not execute properly on Gemini without this patch. (Check for cpu 0 removed from gemini_heartbeat.)

CHRP needs the heartbeat function called on all cpus, IIRC.

Quoted 8 lines

Clearly the heartbeat_count needs to be per-cpu or else pushed into the heartbeat function. How about we make it just

	if (ppc_md.heartbeat)
		ppc_md.heartbeat();

and let the heartbeat function do the if (!smp_processor_id()) and the if (!heartbeat_count--) if it wants?

Ah, I see, the heartbeat_count is now being decremented once per timer interrupt, instead of smp_nr_cpus times per timer interrupt. Last time I checked, it was still possible for the heartbeat count to go negative.

It's fine the way it is. Sorry for the unnecessary patch.

-VAL

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

author
#3 lore raw
Quoted 18 lines · Val Henson
Quoted 7 lines · Paul Mackerras
Quoted 3 lines · Val Henson

The heartbeat function will not execute properly on Gemini without this patch. (Check for cpu 0 removed from gemini_heartbeat.)

CHRP needs the heartbeat function called on all cpus, IIRC.

Quoted 8 lines

Clearly the heartbeat_count needs to be per-cpu or else pushed into the heartbeat function. How about we make it just

	if (ppc_md.heartbeat)
		ppc_md.heartbeat();

and let the heartbeat function do the if (!smp_processor_id()) and the if (!heartbeat_count--) if it wants?

Quoted 6 lines

Ah, I see, the heartbeat_count is now being decremented once per timer interrupt, instead of smp_nr_cpus times per timer interrupt. Last time I checked, it was still possible for the heartbeat count to go negative.

It's fine the way it is. Sorry for the unnecessary patch.

Tsk, shouldn't read patches on the weekend... Here's the current code:

        if (ppc_md.heartbeat && !ppc_md.heartbeat_count--)
                ppc_md.heartbeat();

This decrements the count on every processor. If cpu 0 turns off interrupts interrupts for a while, we get two effects: heartbeat_count is now decremented smp_nr_cpus - 1 times per timer interrupt, and if your heartbeat function doesn't explicitly prevent it, your heartbeat count could go negative.

An alternative that allows you to run the heartbeat function on whatever cpus you like but decrements the heartbeat once per timer interrupt is:

        if (ppc_md.heartbeat && !smp_processor_id()
	         ppc_md.heartbeat_count--)

        if (!ppc_md.heartbeat_count)
                ppc_md.heartbeat();

Howz that?

-VAL

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/