MFC: r269051
Copying pages via temporary mappings in the !DMAP case of pmap_copy_pages() involves updating the corresponding page tables followed by accesses to the pages in question. This sequence is subject to the situation exactly described in the "AMD64 Architecture Programmer's Manual Volume 2: System Programming" rev. 3.23, "7.3.1 Special Coherency Considerations" [1, p. 171 f.]. Therefore, issuing the INVLPG right after modifying the PTE bits is crucial (see also r269050, MFCed to stable/10 in r269235). For the amd64 PMAP code, the order of instructions was already correct. The above fact still is worth documenting, though. 1: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/24593_APM_v21.pdf Reviewed by: alc Sponsored by: Bally Wulff Games & Entertainment GmbH
This commit is contained in:
parent
4f9788cb2b
commit
6b4298527d
@ -4984,6 +4984,14 @@ pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
|
||||
int cnt;
|
||||
boolean_t pinned;
|
||||
|
||||
/*
|
||||
* NB: The sequence of updating a page table followed by accesses
|
||||
* to the corresponding pages used in the !DMAP case is subject to
|
||||
* the situation described in the "AMD64 Architecture Programmer's
|
||||
* Manual Volume 2: System Programming" rev. 3.23, "7.3.1 Special
|
||||
* Coherency Considerations". Therefore, issuing the INVLPG right
|
||||
* after modifying the PTE bits is crucial.
|
||||
*/
|
||||
pinned = FALSE;
|
||||
while (xfersize > 0) {
|
||||
a_pg_offset = a_offset & PAGE_MASK;
|
||||
|
Loading…
x
Reference in New Issue
Block a user