Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
prov/xpmem: Fix xpmem memory corruption
The offset into the XPMEM memory to be copied is calculated on the receiving end. XPMEM code calculates the memory to map to in the following manner: memory_region_start_address = ofi_get_page_start(original_address) memory_region_length = ofi_get_page_end(original_address+original_length) It then caches that memory region and attaches to it if necessary. The offset is calculated as follows: offset = original_address - memory_region_start_address The cache search is provided the following parameters: - memory_region_start_address - memory_region_length After getting the mapped address, the copy is done from the mapped address plus the offset. When searching the cache a cache hit is found if the region being searched is within a memory region which has already been cached. However, this exposes a bug in XPMEM. Here is an example to illustrate the issue: address being looked up: 0x7fffc8463000 Length: 0x5FFF Ending address: 0x7FFFC8468FFF offset: 0x1000 Address cached: 0x7fffc8462000 Lengh: 0x6FFF Ending Address: 0x7FFFC8468FFF As shown in the example the memory region being looked up in the cache is within the cached memory region. However, if the cached memory region address is returned and subsequently the calculated offset is used to copy the data, there will be a discrepancy of a page, leading to memory corruption. In the above example the copy will start from 0x7fffc8462000 + 0x1000 instead of from 0x7fffc8463000 + 0x1000 To resolve the issue, calculate the delta between the remote address which is returned in the cache result and the remote address used in the operation. Add that delta to the offset to calculate the starting address of the memory operation. Signed-off-by: Amir Shehata <shehataa@ornl.gov>
- Loading branch information