On 08/12/13 09:03, Sören Brinkmann wrote: > On Fri, Aug 09, 2013 at 10:27:57AM -0700, Stephen Boyd wrote: >> On 08/09, Daniel Lezcano wrote: >>> yes, but at least the broadcast mechanism should send an IPI to cpu0 to >>> wake it up, no ? As Stephen stated this kind of configuration should has >>> never been tested before so the tick broadcast code is not handling this >>> case properly IMHO. >>> >> If you have a per-cpu tick device that isn't suffering from >> FEAT_C3_STOP why wouldn't you use that for the tick versus a >> per-cpu tick device that has FEAT_C3_STOP? It sounds like there >> is a bug in the preference logic or you should boost the rating >> of the arm global timer above the twd. Does this patch help? It >> should make the arm global timer the tick device and whatever the >> cadence timer you have into the broadcast device. > I finally got to test your patch. Unfortunately, it makes the system > hang even earlier:
Sorry it had a bug depending on the registration order. Can you try this one (tabs are probably spaces, sorry)? I will go read through this thread to see if we already covered the registration order. ---8<---- diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 218bcb5..d3539e5 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c @@ -77,6 +77,9 @@ static bool tick_check_broadcast_device(struct clock_event_device *curdev, !(newdev->features & CLOCK_EVT_FEAT_ONESHOT)) return false; + if (cpumask_equal(newdev->cpumask, cpumask_of(smp_processor_id()))) + return false; + return !curdev || newdev->rating > curdev->rating; } diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 64522ec..dd08f3b 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c @@ -244,12 +244,22 @@ static bool tick_check_preferred(struct clock_event_device *curdev, return false; } + if (!curdev) + return true; + + /* Always prefer a tick device that doesn't suffer from FEAT_C3STOP */ + if (!(newdev->features & CLOCK_EVT_FEAT_C3STOP) && + (curdev->features & CLOCK_EVT_FEAT_C3STOP)) + return true; + if ((newdev->features & CLOCK_EVT_FEAT_C3STOP) && + !(curdev->features & CLOCK_EVT_FEAT_C3STOP)) + return false; + /* * Use the higher rated one, but prefer a CPU local device with a lower * rating than a non-CPU local device */ - return !curdev || - newdev->rating > curdev->rating || + return newdev->rating > curdev->rating || !cpumask_equal(curdev->cpumask, newdev->cpumask); } -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/