Add searching always for chunks after getting global lock
This commit is contained in:
parent
8759a57902
commit
c26830a820
@ -253,14 +253,12 @@ impl VMManager {
|
||||
// Single VMA Chunk could be updated during the release of internal manager lock. Get overlapping chunk again.
|
||||
// This is done here because we don't want to acquire the big internal manager lock as soon as entering this function.
|
||||
let mut internal_manager = self.internal();
|
||||
let overlapping_chunk = if chunk.range() != vma.lock().unwrap().range() {
|
||||
let overlapping_chunk = {
|
||||
let process_mem_chunks = current.vm().mem_chunks().read().unwrap();
|
||||
process_mem_chunks
|
||||
.iter()
|
||||
.find(|&chunk| chunk.range().intersect(&munmap_range).is_some())
|
||||
.map(|chunk| chunk.clone())
|
||||
} else {
|
||||
Some(chunk)
|
||||
};
|
||||
if let Some(overlapping_chunk) = overlapping_chunk {
|
||||
return internal_manager.munmap_chunk(
|
||||
@ -320,8 +318,8 @@ impl VMManager {
|
||||
|
||||
// There are rare cases that mutliple threads do mprotect or munmap for the same single-vma chunk
|
||||
// but for different ranges and the cloned chunk is outdated when acquiring the InternalVMManger lock here.
|
||||
// In this case, we search for the chunk again.
|
||||
let chunk = if chunk.range() != vma.lock().unwrap().range() {
|
||||
//Thus, we search for the chunk again.
|
||||
let chunk = {
|
||||
let current = current!();
|
||||
let process_mem_chunks = current.vm().mem_chunks().read().unwrap();
|
||||
let chunk = process_mem_chunks
|
||||
@ -331,8 +329,6 @@ impl VMManager {
|
||||
return_errno!(ENOMEM, "invalid mprotect range");
|
||||
}
|
||||
chunk.unwrap().clone()
|
||||
} else {
|
||||
chunk
|
||||
};
|
||||
return internal_manager.mprotect_single_vma_chunk(&chunk, protect_range, perms);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user