Prev: MAINTAINERS: update for ARM/Gemini
Next: swapper fixes (Was: kernel panic on kill(0, SIGTERM) with PGID == 0)
From: Andrew Morton on 10 May 2010 17:40 On Sun, 9 May 2010 16:04:44 -0700 Arjan van de Ven <arjan(a)infradead.org> wrote: > +static void detect_repeating_patterns(struct menu_device *data) > +{ > + int i; > + uint64_t avg = 0; > + uint64_t stddev = 0; /* contains the square of the std deviation */ > + > + /* first calculate average and standard deviation of the past */ > + for (i = 0; i < INTERVALS; i++) > + avg += data->intervals[i]; > + > + /* if the avg is beyond the known next tick, it's worthless */ > + if (avg > data->expected_us) > + return; > + > + avg = avg / INTERVALS; > + for (i = 0; i < INTERVALS; i++) > + stddev += (data->intervals[i] - avg) * > + (data->intervals[i] - avg); > + > + stddev = stddev / INTERVALS; > + > + /* > + * now.. if stddev is small.. then assume we have a > + * repeating pattern and predict we keep doing this. > + */ > + > + if (avg && stddev < STDDEV_THRESH) > + data->predicted_us = avg; > +} You got lucky there, because INTERVALS is a power of two. If someone changes INTERVALS to 7, this code will ask for __udivdi3 and won't link on i364. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Arjan van de Ven on 10 May 2010 21:30 On Mon, 10 May 2010 14:38:50 -0700 Andrew Morton <akpm(a)linux-foundation.org> wrote: > > + if (avg && stddev < STDDEV_THRESH) > > + data->predicted_us = avg; > > +} > > You got lucky there, because INTERVALS is a power of two. If someone > changes INTERVALS to 7, this code will ask for __udivdi3 and won't > link on i364. yeah you'd think it almost isn't an accident ;-) -- Arjan van de Ven Intel Open Source Technology Centre For development, discussion and tips for power savings, visit http://www.lesswatts.org -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Andrew Morton on 10 May 2010 22:50 On Mon, 10 May 2010 18:27:46 -0700 Arjan van de Ven <arjan(a)infradead.org> wrote: > On Mon, 10 May 2010 14:38:50 -0700 > Andrew Morton <akpm(a)linux-foundation.org> wrote: > > > > + if (avg && stddev < STDDEV_THRESH) > > > + data->predicted_us = avg; > > > +} > > > > You got lucky there, because INTERVALS is a power of two. If someone > > changes INTERVALS to 7, this code will ask for __udivdi3 and won't > > link on i364. > > yeah you'd think it almost isn't an accident ;-) If it was deliberate the code would read avg >>= INTERVALS_SHIFT; :-p -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Frank Rowand on 19 May 2010 16:00 Aplogies if this is a duplicate, my outgoing email seems to have not been working. On 05/09/10 16:04, Arjan van de Ven wrote: > +/* > + * Try detecting repeating patterns by keeping track of the last 8 > + * intervals, and checking if the standard deviation of that set > + * of points is below a threshold. If it is... then use the > + * average of these 8 points as the estimated value. > + */ > +static void detect_repeating_patterns(struct menu_device *data) > +{ > + int i; > + uint64_t avg = 0; > + uint64_t stddev = 0; /* contains the square of the std deviation */ > + > + /* first calculate average and standard deviation of the past */ > + for (i = 0; i < INTERVALS; i++) > + avg += data->intervals[i]; > + > + /* if the avg is beyond the known next tick, it's worthless */ > + if (avg > data->expected_us) > + return; > + Should the following division by INTERVALS be moved up 6 lines to before "if (avg > data->expected_us)"? > + avg = avg / INTERVALS; > + for (i = 0; i < INTERVALS; i++) > + stddev += (data->intervals[i] - avg) * > + (data->intervals[i] - avg); > + > + stddev = stddev / INTERVALS; > + > + /* > + * now.. if stddev is small.. then assume we have a > + * repeating pattern and predict we keep doing this. > + */ > + > + if (avg && stddev < STDDEV_THRESH) > + data->predicted_us = avg; > +} -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Andrew Morton on 21 May 2010 15:50 On Wed, 19 May 2010 12:51:50 -0700 Frank Rowand <frank.rowand(a)am.sony.com> wrote: > Aplogies if this is a duplicate, my outgoing email seems to have not > been working. > > On 05/09/10 16:04, Arjan van de Ven wrote: > > > +/* > > + * Try detecting repeating patterns by keeping track of the last 8 > > + * intervals, and checking if the standard deviation of that set > > + * of points is below a threshold. If it is... then use the > > + * average of these 8 points as the estimated value. > > + */ > > +static void detect_repeating_patterns(struct menu_device *data) > > +{ > > + int i; > > + uint64_t avg = 0; > > + uint64_t stddev = 0; /* contains the square of the std deviation */ > > + > > + /* first calculate average and standard deviation of the past */ > > + for (i = 0; i < INTERVALS; i++) > > + avg += data->intervals[i]; > > + > > + /* if the avg is beyond the known next tick, it's worthless */ > > + if (avg > data->expected_us) > > + return; > > + > > Should the following division by INTERVALS be moved up 6 lines to before > "if (avg > data->expected_us)"? Quite possibly. > > + avg = avg / INTERVALS; > > + for (i = 0; i < INTERVALS; i++) > > + stddev += (data->intervals[i] - avg) * > > + (data->intervals[i] - avg); > > + > > + stddev = stddev / INTERVALS; > > + > > + /* > > + * now.. if stddev is small.. then assume we have a > > + * repeating pattern and predict we keep doing this. > > + */ > > + > > + if (avg && stddev < STDDEV_THRESH) > > + data->predicted_us = avg; > > +} wakey wakey, Arjan. Also, expected_us is 32-bit and predicted_us is 64-bit. Was that rational? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|
Next
|
Last
Pages: 1 2 Prev: MAINTAINERS: update for ARM/Gemini Next: swapper fixes (Was: kernel panic on kill(0, SIGTERM) with PGID == 0) |