diff options
Diffstat (limited to 'litmus/lockdown.c')
-rw-r--r-- | litmus/lockdown.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/litmus/lockdown.c b/litmus/lockdown.c index bb93690c00c9..09712554c5b9 100644 --- a/litmus/lockdown.c +++ b/litmus/lockdown.c | |||
@@ -77,6 +77,7 @@ void litmus_setup_lockdown(void __iomem *base, u32 id) | |||
77 | #else | 77 | #else |
78 | 78 | ||
79 | static void __iomem *cache_base; | 79 | static void __iomem *cache_base; |
80 | |||
80 | static void __iomem *lockreg_d; | 81 | static void __iomem *lockreg_d; |
81 | static void __iomem *lockreg_i; | 82 | static void __iomem *lockreg_i; |
82 | static raw_spinlock_t prefetch_lock; | 83 | static raw_spinlock_t prefetch_lock; |
@@ -113,7 +114,11 @@ u32 color_read_in_mem(u32 lock_val, u32 unlock_val, void *start, void *end) | |||
113 | : [addr] "+r" (start), | 114 | : [addr] "+r" (start), |
114 | [val] "+r" (v) | 115 | [val] "+r" (v) |
115 | : [end] "r" (end), | 116 | : [end] "r" (end), |
117 | #ifdef CONFIG_CACHE_PL310 | ||
118 | [cachereg] "r" (ld_d_reg(raw_smp_processor_id())), | ||
119 | #else | ||
116 | [cachereg] "r" (lockreg_d), | 120 | [cachereg] "r" (lockreg_d), |
121 | #endif | ||
117 | [lockval] "r" (lock_val) | 122 | [lockval] "r" (lock_val) |
118 | : "cc"); | 123 | : "cc"); |
119 | 124 | ||
@@ -137,7 +142,10 @@ u32 color_read_in_mem_lock(u32 lock_val, u32 unlock_val, void *start, void *end) | |||
137 | unsigned long flags; | 142 | unsigned long flags; |
138 | u32 v = 0; | 143 | u32 v = 0; |
139 | 144 | ||
145 | #ifndef CONFIG_CACHE_PL310 | ||
140 | raw_spin_lock_irqsave(&prefetch_lock, flags); | 146 | raw_spin_lock_irqsave(&prefetch_lock, flags); |
147 | #endif | ||
148 | |||
141 | __asm__ __volatile__ ( | 149 | __asm__ __volatile__ ( |
142 | " .align 5\n" | 150 | " .align 5\n" |
143 | " str %[lockval], [%[cachereg]]\n" | 151 | " str %[lockval], [%[cachereg]]\n" |
@@ -148,11 +156,18 @@ u32 color_read_in_mem_lock(u32 lock_val, u32 unlock_val, void *start, void *end) | |||
148 | : [addr] "+r" (start), | 156 | : [addr] "+r" (start), |
149 | [val] "+r" (v) | 157 | [val] "+r" (v) |
150 | : [end] "r" (end), | 158 | : [end] "r" (end), |
159 | #ifdef CONFIG_CACHE_PL310 | ||
160 | [cachereg] "r" (ld_d_reg(raw_smp_processor_id())), | ||
161 | #else | ||
151 | [cachereg] "r" (lockreg_d), | 162 | [cachereg] "r" (lockreg_d), |
163 | #endif | ||
152 | [lockval] "r" (lock_val), | 164 | [lockval] "r" (lock_val), |
153 | [unlockval] "r" (unlock_val) | 165 | [unlockval] "r" (unlock_val) |
154 | : "cc"); | 166 | : "cc"); |
167 | |||
168 | #ifndef CONFIG_CACHE_PL310 | ||
155 | raw_spin_unlock_irqrestore(&prefetch_lock, flags); | 169 | raw_spin_unlock_irqrestore(&prefetch_lock, flags); |
170 | #endif | ||
156 | 171 | ||
157 | return v; | 172 | return v; |
158 | } | 173 | } |
@@ -330,9 +345,16 @@ int litmus_lockdown_proc_handler(struct ctl_table *table, int write, | |||
330 | 345 | ||
331 | #define TRIALS 1000 | 346 | #define TRIALS 1000 |
332 | 347 | ||
348 | static void sleep_ns(int ns) | ||
349 | { | ||
350 | int i; | ||
351 | lt_t start = litmus_clock(); | ||
352 | for (i = 0; litmus_clock() - start < ns;i++); | ||
353 | } | ||
354 | |||
333 | static int test_get_cycles_overhead(void) | 355 | static int test_get_cycles_overhead(void) |
334 | { | 356 | { |
335 | u64 sum = 0, min = (u64)-1, max = 0; | 357 | u64 avg = 0, min = (u64)-1, max = 0; |
336 | unsigned long flags; | 358 | unsigned long flags; |
337 | cycles_t a, b; | 359 | cycles_t a, b; |
338 | int i; | 360 | int i; |
@@ -342,6 +364,7 @@ static int test_get_cycles_overhead(void) | |||
342 | local_irq_save(flags); | 364 | local_irq_save(flags); |
343 | preempt_disable(); | 365 | preempt_disable(); |
344 | a = litmus_get_cycles(); | 366 | a = litmus_get_cycles(); |
367 | sleep_ns(15000); | ||
345 | b = litmus_get_cycles(); | 368 | b = litmus_get_cycles(); |
346 | preempt_enable(); | 369 | preempt_enable(); |
347 | local_irq_restore(flags); | 370 | local_irq_restore(flags); |
@@ -350,10 +373,11 @@ static int test_get_cycles_overhead(void) | |||
350 | max = diff; | 373 | max = diff; |
351 | if (diff < min) | 374 | if (diff < min) |
352 | min = diff; | 375 | min = diff; |
353 | sum += diff; | 376 | avg += div64_u64(diff, TRIALS); |
354 | } | 377 | } |
355 | printk("cycle test: avg: %llu min: %llu max: %llu\n", | 378 | printk("cycle test 15us: avg: %llu min: %llu max: %llu\n", |
356 | div64_u64(sum, TRIALS), min, max); | 379 | avg, min, max); |
380 | |||
357 | return 0; | 381 | return 0; |
358 | } | 382 | } |
359 | 383 | ||
@@ -661,7 +685,7 @@ int litmus_test_prefetch_proc_handler(struct ctl_table *table, int write, | |||
661 | 685 | ||
662 | free_page((unsigned long)vaddr); | 686 | free_page((unsigned long)vaddr); |
663 | 687 | ||
664 | //test_get_cycles_overhead(); | 688 | test_get_cycles_overhead(); |
665 | test_read_in(); | 689 | test_read_in(); |
666 | 690 | ||
667 | return 0; | 691 | return 0; |