Add Konstantin Belousov <kostikbel@gmail.com>'s PCID report.
This commit is contained in:
parent
64f935807a
commit
80cec0601e
Notes:
svn2git
2020-12-08 03:00:23 +00:00
svn path=/head/; revision=46970
1 changed files with 58 additions and 0 deletions
|
@ -1053,4 +1053,62 @@
|
||||||
The FreeBSD Foundation
|
The FreeBSD Foundation
|
||||||
</sponsor>
|
</sponsor>
|
||||||
</project>
|
</project>
|
||||||
|
|
||||||
|
<project cat='kern'>
|
||||||
|
<title>Rewritten PCID Support</title>
|
||||||
|
|
||||||
|
<contact>
|
||||||
|
<person>
|
||||||
|
<name>
|
||||||
|
<given>Konstantin</given>
|
||||||
|
<common>Belousov</common>
|
||||||
|
</name>
|
||||||
|
<email>kib@FreeBSD.org</email>
|
||||||
|
</person>
|
||||||
|
</contact>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<p>Process-Context Identifiers (PCIDs) is a feature of the TLB
|
||||||
|
on Intel processors, existing since the Sandy Bridge
|
||||||
|
micro-architecture introduction. It allows the TLB to
|
||||||
|
simultaneously cache translation information for several
|
||||||
|
address spaces, and gives an opportunity for the operating
|
||||||
|
system context switch code to avoid flushing the TLB on the
|
||||||
|
process switch. Each cached translation is tagged with some
|
||||||
|
context identifier, and at context switch time, the operating
|
||||||
|
system instructs the processor which context is becoming
|
||||||
|
active. The feature slightly reduces context switch time by
|
||||||
|
avoiding flush, and more importantly, it reduces the warm-up
|
||||||
|
period for the thread after a context switch.</p>
|
||||||
|
|
||||||
|
<p>&os; already used PCID, but the existing implementation
|
||||||
|
had several shortcomings. The <tt>amd64</tt> pmap (the
|
||||||
|
machine-dependent portion of the virtual memory subsystem)
|
||||||
|
maintained a bitmap of all CPUs which ever loaded a
|
||||||
|
translation for the given address space, and avoided TLB flush
|
||||||
|
on the context switch. The bitmap was used to direct
|
||||||
|
Inter-Processor Interrupts to the marked CPU when the
|
||||||
|
operating system needed to perform TLB invalidation. The most
|
||||||
|
important deficiency of the implementation is the increase of
|
||||||
|
TLB invalidation IPIs since the bitmap could only grow until
|
||||||
|
full TLB shootdown is performed. It increases the TLB rate,
|
||||||
|
which negated the positive effects of avoiding TLB flushes on
|
||||||
|
large machines. Secondarily, the bitmap maintenance in both
|
||||||
|
the pmap and the context code was quite complicated, leading
|
||||||
|
to bugs. These issues resulted in the PCID feature being
|
||||||
|
disabled by default.</p>
|
||||||
|
|
||||||
|
<p>The new PCID implementation uses an algorithm described in
|
||||||
|
the U. Vahalia book "UNIX Internals: The New Frontiers". The
|
||||||
|
algorithm is already used, for example, by the MIPS pmap for
|
||||||
|
assigning the ASIDs to software-managed TLB entries. The pmap
|
||||||
|
maintains a per-CPU generation count, which is assigned to the
|
||||||
|
next unused PCID when the context is activated on CPU. TLB
|
||||||
|
invalidation includes resetting the generation count, which
|
||||||
|
causes reallocation of PCID when a context switch is
|
||||||
|
performed. As result, the new implementation issues exactly
|
||||||
|
the same amount of shootdown IPIs as pmap which does not
|
||||||
|
utilize PCID.</p>
|
||||||
|
</body>
|
||||||
|
</project>
|
||||||
</report>
|
</report>
|
||||||
|
|
Loading…
Reference in a new issue