Hi,

i was implementing and testing core dump feature of HDD driver on PS3 powerpc 
arch and 
tried to enter KDB manually with sysctl debug.kdb.panic=1.
And i'm getting the following message from KDB: timeout stopping cpus.

I took a look at generic_stop_cpus which sends IPI to every CPU.
On powerpc, IPI_STOP is implemented the following way:

cpuid = PCPU_GET(cpuid);
savectx(&stoppcbs[cpuid]);
savectx(PCPU_GET(curpcb));
CPU_SET_ATOMIC(cpuid, &stopped_cpus);
while (!CPU_ISSET(cpuid, &started_cpus))
    cpu_spinwait();
CPU_CLR_ATOMIC(cpuid, &stopped_cpus);
CPU_CLR_ATOMIC(cpuid, &started_cpus);

generic_stop_cpus waits until all CPUs clear its ID in stopped_cpus bitmap.
If you take a look at the previous snippet of code then the bit is indeed set 
but then cleared immediately.
And that is why i get timeout message in kdb i think.
Or do i not undestand something here ? Could someone please clarify.

I could be wrong but i think it should be like this:

cpuid = PCPU_GET(cpuid);
savectx(&stoppcbs[cpuid]);
savectx(PCPU_GET(curpcb));
CPU_CLR_ATOMIC(cpuid, &started_cpus);              <------------- move here
CPU_SET_ATOMIC(cpuid, &stopped_cpus);
while (!CPU_ISSET(cpuid, &started_cpus))
    cpu_spinwait();
CPU_CLR_ATOMIC(cpuid, &stopped_cpus);

Thanks

Regards



_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to