How to use sem_timedwait?
Konstantin Belousov
kostikbel at gmail.com
Fri Dec 16 18:46:00 UTC 2016
On Fri, Dec 16, 2016 at 11:06:53AM -0700, Ian Lepore wrote:
> I tried LAPIC, HPET, and i8254 for eventtimer.hardware, there was no
> change with any of them. I tried turning periodic on, still no change.
> Changing alloweddeviation made no change. I tried different hardware
> choices for timecounter too (not that timecounting is showing any signs
> of trouble on this machine), no change.
>
> revolution > sysctl dev.cpu.0
> dev.cpu.0.cx_usage: 100.00% 0.00% 0.00% last 303us
> dev.cpu.0.cx_lowest: C1
> dev.cpu.0.cx_supported: C1/1/32 C2/2/96 C3/3/128
> dev.cpu.0.freq_levels: 3334/143000 3333/130000 3200/117000 3067/105000
> 2933/94000 2800/85000 2667/76000 2533/68000 2400/61000 2267/54000
> 2133/48000 2000/43000 1867/39000 1733/35000 1600/32000
> dev.cpu.0.freq: 3333
> dev.cpu.0.temperature: 69.0C
> dev.cpu.0.coretemp.throttle_log: 0
> dev.cpu.0.coretemp.tjmax: 101.0C
> dev.cpu.0.coretemp.resolution: 1
> dev.cpu.0.coretemp.delta: 32
> dev.cpu.0.%parent: acpi0
> dev.cpu.0.%pnpinfo: _HID=none _UID=0
> dev.cpu.0.%location: handle=\_PR_.P001
> dev.cpu.0.%driver: cpu
> dev.cpu.0.%desc: ACPI CPU
>
> I also ran the test program on a couple servers at $work runing 10.3-
> stable, and they both showed identical behavior, with the result in the
> same range as on this machine: nsec = 9315538211 for 1000000 loops of
> 10000 nsec.
>
> One of those machines is running as a vmware guest:
>
> FreeBSD 10.3-STABLE-20161014 #2 r307350M: Mon Oct 17 18:07:23 MDT 2016
> FreeBSD clang version 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512
> CPU: Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz (2197.45-MHz K8-class CPU)
> Origin="GenuineIntel" Id=0x206d2 Family=0x6 Model=0x2d Stepping=2
> Features=0xfa3fbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,DTS,MMX,FXSR,SSE,SSE2,SS>
> Features2=0x9fba2203<SSE3,PCLMULQDQ,SSSE3,CX16,PCID,SSE4.1,SSE4.2,x2APIC,POPCNT,TSCDLT,AESNI,XSAVE,OSXSAVE,AVX,HV>
> AMD Features=0x28100800<SYSCALL,NX,RDTSCP,LM>
> AMD Features2=0x1<LAHF>
> Structured Extended Features=0x2<TSCADJ>
> TSC: P-state invariant
> Hypervisor: Origin = "VMwareVMware"
> real memory = 2147483648 (2048 MB)
> avail memory = 2050031616 (1955 MB)
> Event timer "LAPIC" quality 600
>
> and the other is running on bare metal:
>
> FreeBSD 10.3-STABLE-20161014 #2 r307350M: Mon Oct 17 18:30:37 MDT 2016
> CPU: Intel(R) Xeon(R) CPU X5550 @ 2.67GHz (2660.05-MHz K8-class CPU)
> Origin="GenuineIntel" Id=0x106a5 Family=0x6 Model=0x1a Stepping=5
> Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
> Features2=0x9ce3bd<SSE3,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,DCA,SSE4.1,SSE4.2,POPCNT>
> AMD Features=0x28100800<SYSCALL,NX,RDTSCP,LM>
> AMD Features2=0x1<LAHF>
> VT-x: PAT,HLT,MTF,PAUSE,EPT,VPID
> TSC: P-state invariant, performance statistics
> real memory = 206158430208 (196608 MB)
> avail memory = 200380227584 (191097 MB)
> Event timer "LAPIC" quality 400
Am I right that you only tested on stable/10 machines ? What you see
and I do not, might be due to the missed MFC of r296775, which commit
message claims that it fixes truncation in converions.
Below is the commit merged to stable/10, could you test it ? I do not
have any stable/10 machine.
Index: sys/kern/kern_event.c
===================================================================
--- sys/kern/kern_event.c (revision 310169)
+++ sys/kern/kern_event.c (working copy)
@@ -556,34 +556,59 @@ knote_fork(struct knlist *list, int pid)
#define NOTE_TIMER_PRECMASK (NOTE_SECONDS|NOTE_MSECONDS|NOTE_USECONDS| \
NOTE_NSECONDS)
-static __inline sbintime_t
+static sbintime_t
timer2sbintime(intptr_t data, int flags)
{
- sbintime_t modifier;
+ /*
+ * Macros for converting to the fractional second portion of an
+ * sbintime_t using 64bit multiplication to improve precision.
+ */
+#define NS_TO_SBT(ns) (((ns) * (((uint64_t)1 << 63) / 500000000)) >> 32)
+#define US_TO_SBT(us) (((us) * (((uint64_t)1 << 63) / 500000)) >> 32)
+#define MS_TO_SBT(ms) (((ms) * (((uint64_t)1 << 63) / 500)) >> 32)
switch (flags & NOTE_TIMER_PRECMASK) {
case NOTE_SECONDS:
- modifier = SBT_1S;
- break;
+#ifdef __LP64__
+ if (data > (SBT_MAX / SBT_1S))
+ return SBT_MAX;
+#endif
+ return ((sbintime_t)data << 32);
case NOTE_MSECONDS: /* FALLTHROUGH */
case 0:
- modifier = SBT_1MS;
- break;
+ if (data >= 1000) {
+ int64_t secs = data / 1000;
+#ifdef __LP64__
+ if (secs > (SBT_MAX / SBT_1S))
+ return SBT_MAX;
+#endif
+ return (secs << 32 | MS_TO_SBT(data % 1000));
+ }
+ return MS_TO_SBT(data);
case NOTE_USECONDS:
- modifier = SBT_1US;
- break;
+ if (data >= 1000000) {
+ int64_t secs = data / 1000000;
+#ifdef __LP64__
+ if (secs > (SBT_MAX / SBT_1S))
+ return SBT_MAX;
+#endif
+ return (secs << 32 | US_TO_SBT(data % 1000000));
+ }
+ return US_TO_SBT(data);
case NOTE_NSECONDS:
- modifier = SBT_1NS;
+ if (data >= 1000000000) {
+ int64_t secs = data / 1000000000;
+#ifdef __LP64__
+ if (secs > (SBT_MAX / SBT_1S))
+ return SBT_MAX;
+#endif
+ return (secs << 32 | US_TO_SBT(data % 1000000000));
+ }
+ return NS_TO_SBT(data);
+ default:
break;
- default:
- return (-1);
}
-
-#ifdef __LP64__
- if (data > SBT_MAX / modifier)
- return (SBT_MAX);
-#endif
- return (modifier * data);
+ return (-1);
}
static void
Index: .
===================================================================
--- . (revision 310169)
+++ . (working copy)
Property changes on: .
___________________________________________________________________
Modified: svn:mergeinfo
## -0,0 +0,1 ##
Merged /head:r296775
More information about the freebsd-hackers
mailing list