diff options
author | Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> | 2010-01-18 12:25:45 -0500 |
---|---|---|
committer | Robert Richter <robert.richter@amd.com> | 2010-02-26 09:14:02 -0500 |
commit | f125be1469303f7b9324447f251d74a0da24952f (patch) | |
tree | 53fa411406eea63346868a77ea07d256a9132448 | |
parent | 64683da6643e8c6c93f1f99548399b08c029fd13 (diff) |
oprofile/x86: implement lsfr pseudo-random number generator for IBS
This patch implements a linear feedback shift register (LFSR) for
pseudo-random number generation for IBS.
For IBS measurements it would be good to minimize memory traffic in
the interrupt handler since every access pollutes the data
caches. Computing a maximal period LFSR just needs shifts and ORs.
The LFSR method is good enough to randomize the ops at low
overhead. 16 pseudo-random bits are enough for the implementation and
it doesn't matter that the pattern repeats with a fairly short
cycle. It only needs to break up (hard) periodic sampling behavior.
The logic was designed by Paul Drongowski.
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Signed-off-by: Robert Richter <robert.richter@amd.com>
-rw-r--r-- | arch/x86/oprofile/op_model_amd.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c index 6557683c190e..97c84ebe3f24 100644 --- a/arch/x86/oprofile/op_model_amd.c +++ b/arch/x86/oprofile/op_model_amd.c | |||
@@ -218,6 +218,29 @@ static void op_amd_setup_ctrs(struct op_x86_model_spec const *model, | |||
218 | } | 218 | } |
219 | } | 219 | } |
220 | 220 | ||
221 | /* | ||
222 | * 16-bit Linear Feedback Shift Register (LFSR) | ||
223 | * | ||
224 | * 16 14 13 11 | ||
225 | * Feedback polynomial = X + X + X + X + 1 | ||
226 | */ | ||
227 | static unsigned int lfsr_random(void) | ||
228 | { | ||
229 | static unsigned int lfsr_value = 0xF00D; | ||
230 | unsigned int bit; | ||
231 | |||
232 | /* Compute next bit to shift in */ | ||
233 | bit = ((lfsr_value >> 0) ^ | ||
234 | (lfsr_value >> 2) ^ | ||
235 | (lfsr_value >> 3) ^ | ||
236 | (lfsr_value >> 5)) & 0x0001; | ||
237 | |||
238 | /* Advance to next register value */ | ||
239 | lfsr_value = (lfsr_value >> 1) | (bit << 15); | ||
240 | |||
241 | return lfsr_value; | ||
242 | } | ||
243 | |||
221 | static inline void | 244 | static inline void |
222 | op_amd_handle_ibs(struct pt_regs * const regs, | 245 | op_amd_handle_ibs(struct pt_regs * const regs, |
223 | struct op_msrs const * const msrs) | 246 | struct op_msrs const * const msrs) |