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