Refactor merge_all_single_vma_chunks to reduce iteration

This commit is contained in:
Hui, Chunyang 2022-05-12 13:20:10 +00:00 committed by volcano
parent 849e35f01e
commit 2cd20d315e

@ -317,7 +317,7 @@ impl ProcessVM {
.unwrap() .unwrap()
}); });
// Try merging connecting VMAs // Try merging connecting single VMA chunks
for chunks in single_vma_chunks.windows(2) { for chunks in single_vma_chunks.windows(2) {
let chunk_a = &chunks[0]; let chunk_a = &chunks[0];
let chunk_b = &chunks[1]; let chunk_b = &chunks[1];
@ -343,36 +343,28 @@ impl ProcessVM {
} }
} }
// Remove single dummy VMA chunk // Collect merged vmas which will be the output of this function
single_vma_chunks let mut merged_vmas = Vec::new();
.drain_filter(|chunk| chunk.is_single_dummy_vma())
.collect::<Vec<ChunkRef>>();
// Get all merged chunks whose vma and range are conflict // Insert the merged chunks or unchanged chunks back to mem_chunk list
let merged_chunks = single_vma_chunks for chunk in single_vma_chunks.into_iter().filter_map(|chunk| {
.drain_filter(|chunk| chunk.is_single_vma_with_conflict_size()) if !chunk.is_single_dummy_vma() {
.collect::<Vec<ChunkRef>>(); if chunk.is_single_vma_with_conflict_size() {
let new_vma = chunk.get_vma_for_single_vma_chunk();
merged_vmas.push(new_vma.clone());
// Get merged vmas Some(Arc::new(Chunk::new_chunk_with_vma(new_vma)))
let mut new_vmas = Vec::new(); } else {
merged_chunks.iter().for_each(|chunk| { Some(chunk)
let vma = chunk.get_vma_for_single_vma_chunk(); }
new_vmas.push(vma) } else {
}); None
}
// Add all merged vmas back to mem_chunk list of the process }) {
new_vmas.iter().for_each(|vma| {
let chunk = Arc::new(Chunk::new_chunk_with_vma(vma.clone()));
mem_chunks.insert(chunk);
});
// Add all unchanged single vma chunks back to mem_chunk list
while single_vma_chunks.len() > 0 {
let chunk = single_vma_chunks.pop().unwrap();
mem_chunks.insert(chunk); mem_chunks.insert(chunk);
} }
Ok(new_vmas) Ok(merged_vmas)
} }
pub fn get_process_range(&self) -> &VMRange { pub fn get_process_range(&self) -> &VMRange {