Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F133130751
D17850.id50044.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
1 KB
Referenced Files
None
Subscribers
None
D17850.id50044.diff
View Options
Index: head/sys/x86/x86/delay.c
===================================================================
--- head/sys/x86/x86/delay.c
+++ head/sys/x86/x86/delay.c
@@ -51,11 +51,23 @@
#include <machine/cpu.h>
#include <x86/init.h>
-static u_int
-get_tsc(__unused struct timecounter *tc)
+static void
+delay_tsc(int n)
{
+ uint64_t end, now;
- return (rdtsc32());
+ /*
+ * Pin the current thread ensure correct behavior if the TSCs
+ * on different CPUs are not in sync.
+ */
+ sched_pin();
+ now = rdtsc();
+ end = now + tsc_freq * n / 1000000;
+ do {
+ cpu_spinwait();
+ now = rdtsc();
+ } while (now < end);
+ sched_unpin();
}
static int
@@ -66,22 +78,24 @@
uint64_t end, freq, now;
u_int last, mask, u;
- tc = timecounter;
- freq = atomic_load_acq_64(&tsc_freq);
- if (tsc_is_invariant && freq != 0) {
- func = get_tsc;
- mask = ~0u;
- } else {
- if (tc->tc_quality <= 0)
- return (0);
- func = tc->tc_get_timecount;
- mask = tc->tc_counter_mask;
- freq = tc->tc_frequency;
+ /*
+ * Only use the TSC if it is P-state invariant. If the TSC is
+ * not P-state invariant and the CPU is not running at the
+ * "full" P-state, then the TSC will increment at some rate
+ * less than tsc_freq and delay_tsc() will wait too long.
+ */
+ if (tsc_is_invariant && tsc_freq != 0) {
+ delay_tsc(n);
+ return (1);
}
+ tc = timecounter;
+ if (tc->tc_quality <= 0)
+ return (0);
+ func = tc->tc_get_timecount;
+ mask = tc->tc_counter_mask;
+ freq = tc->tc_frequency;
now = 0;
end = freq * n / 1000000;
- if (func == get_tsc)
- sched_pin();
last = func(tc) & mask;
do {
cpu_spinwait();
@@ -92,8 +106,6 @@
now += u - last;
last = u;
} while (now < end);
- if (func == get_tsc)
- sched_unpin();
return (1);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Oct 24, 5:30 AM (14 h, 35 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24103906
Default Alt Text
D17850.id50044.diff (1 KB)
Attached To
Mode
D17850: Add a delay_tsc() static function for when DELAY() uses the TSC.
Attached
Detach File
Event Timeline
Log In to Comment