mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 14:14:24 +08:00
Documentation/x86: Update documentation for SVA (Shared Virtual Addressing)
Adjust the documentation to the new way how a PASID is being allocated, freed and fixed up. Based on a patch by Ashok Raj <ashok.raj@intel.com> [ bp: Massage commit message, fix htmldocs build warning ] Signed-off-by: Fenghua Yu <fenghua.yu@intel.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Tony Luck <tony.luck@intel.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20220207230254.3342514-12-fenghua.yu@intel.com
This commit is contained in:
parent
6e3133d901
commit
83aa52ffed
@ -104,18 +104,47 @@ The MSR must be configured on each logical CPU before any application
|
||||
thread can interact with a device. Threads that belong to the same
|
||||
process share the same page tables, thus the same MSR value.
|
||||
|
||||
PASID is cleared when a process is created. The PASID allocation and MSR
|
||||
programming may occur long after a process and its threads have been created.
|
||||
One thread must call iommu_sva_bind_device() to allocate the PASID for the
|
||||
process. If a thread uses ENQCMD without the MSR first being populated, a #GP
|
||||
will be raised. The kernel will update the PASID MSR with the PASID for all
|
||||
threads in the process. A single process PASID can be used simultaneously
|
||||
with multiple devices since they all share the same address space.
|
||||
PASID Life Cycle Management
|
||||
===========================
|
||||
|
||||
One thread can call iommu_sva_unbind_device() to free the allocated PASID.
|
||||
The kernel will clear the PASID MSR for all threads belonging to the process.
|
||||
PASID is initialized as INVALID_IOASID (-1) when a process is created.
|
||||
|
||||
New threads inherit the MSR value from the parent.
|
||||
Only processes that access SVA-capable devices need to have a PASID
|
||||
allocated. This allocation happens when a process opens/binds an SVA-capable
|
||||
device but finds no PASID for this process. Subsequent binds of the same, or
|
||||
other devices will share the same PASID.
|
||||
|
||||
Although the PASID is allocated to the process by opening a device,
|
||||
it is not active in any of the threads of that process. It's loaded to the
|
||||
IA32_PASID MSR lazily when a thread tries to submit a work descriptor
|
||||
to a device using the ENQCMD.
|
||||
|
||||
That first access will trigger a #GP fault because the IA32_PASID MSR
|
||||
has not been initialized with the PASID value assigned to the process
|
||||
when the device was opened. The Linux #GP handler notes that a PASID has
|
||||
been allocated for the process, and so initializes the IA32_PASID MSR
|
||||
and returns so that the ENQCMD instruction is re-executed.
|
||||
|
||||
On fork(2) or exec(2) the PASID is removed from the process as it no
|
||||
longer has the same address space that it had when the device was opened.
|
||||
|
||||
On clone(2) the new task shares the same address space, so will be
|
||||
able to use the PASID allocated to the process. The IA32_PASID is not
|
||||
preemptively initialized as the PASID value might not be allocated yet or
|
||||
the kernel does not know whether this thread is going to access the device
|
||||
and the cleared IA32_PASID MSR reduces context switch overhead by xstate
|
||||
init optimization. Since #GP faults have to be handled on any threads that
|
||||
were created before the PASID was assigned to the mm of the process, newly
|
||||
created threads might as well be treated in a consistent way.
|
||||
|
||||
Due to complexity of freeing the PASID and clearing all IA32_PASID MSRs in
|
||||
all threads in unbind, free the PASID lazily only on mm exit.
|
||||
|
||||
If a process does a close(2) of the device file descriptor and munmap(2)
|
||||
of the device MMIO portal, then the driver will unbind the device. The
|
||||
PASID is still marked VALID in the PASID_MSR for any threads in the
|
||||
process that accessed the device. But this is harmless as without the
|
||||
MMIO portal they cannot submit new work to the device.
|
||||
|
||||
Relationships
|
||||
=============
|
||||
|
Loading…
Reference in New Issue
Block a user