X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=markers-test%2Ftest-mark-speed-local.c;h=1940cdc36e3a1f8b05ee2de227acbc00aafa1b8a;hb=31efe1f8304f09a4f4139c387a98d3215cd423c9;hp=5bcbccb7b2ee1ea9c892142f75e5001628eec9da;hpb=fd6b47e8b3a16645290159ba13e04e8eaae9c5cb;p=lttv.git diff --git a/markers-test/test-mark-speed-local.c b/markers-test/test-mark-speed-local.c index 5bcbccb7..1940cdc3 100644 --- a/markers-test/test-mark-speed-local.c +++ b/markers-test/test-mark-speed-local.c @@ -10,6 +10,29 @@ #include #include +static void pmc_flush_cache(void) + { + register int i; + /* write back and invalidate cache (a serializing instruction) */ + + __asm__ __volatile__ ( "wbinvd" : : : "memory" ); + + /* The wbinvd instruction does not wait for the external caches + * to be flushed, but only requests that it be done. The loop + * is to be sure that enough time has elapsed, but the compiler + * might simplify or even remove it. The loop bound is for a + * 512 KB L2 cache. On a Pentium Pro/II/III, the loop uses + * 2 cycles per iteration. + * + * Does wbinvd also cause the TLB to be flushed? + * A comment in mtrr.c suggests that it does. + */ + for (i = 0; i < 512*1024; i++) { + cpu_relax(); + } + } + + static void noinline test2(const struct marker *mdata, void *call_private, ...) { @@ -61,14 +84,12 @@ static void noinline test2(const struct marker *mdata, struct proc_dir_entry *pentry = NULL; -char temp0[8192]; -int temp[8192] __cacheline_aligned; -char temp5[8192]; - static inline void test(unsigned long arg, unsigned long arg2) { + volatile int temp[5]; #ifdef CACHEFLUSH - wbinvd(); + clflush(¤t->pid); + //pmc_flush_cache(); #endif temp[2] = (temp[0] + 60) << 10; temp[3] = (temp[2] + 60) << 10; @@ -90,8 +111,8 @@ static int my_open(struct inode *inode, struct file *file) local_irq_save(flags); #ifdef CACHEFLUSH - wbinvd(); /* initial write back, without cycle count */ - msleep(20); /* wait for L2 flush */ + //pmc_flush_cache(); /* initial write back, without cycle count */ + //msleep(20); /* wait for L2 flush */ #endif rdtsc_barrier(); cycles1 = get_cycles();