MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / first_available_range

Method first_available_range

vm-allocator/src/address.rs:126–161  ·  view source on GitHub ↗
(
        &self,
        req_size: GuestUsize,
        alignment: GuestUsize,
    )

Source from the content-addressed store, hash-verified

124 }
125
126 fn first_available_range(
127 &self,
128 req_size: GuestUsize,
129 alignment: GuestUsize,
130 ) -> Option<GuestAddress> {
131 let reversed_ranges: Vec<(&GuestAddress, &GuestUsize)> = self.ranges.iter().rev().collect();
132
133 for (idx, (address, _size)) in reversed_ranges.iter().enumerate() {
134 let next_range_idx = idx + 1;
135 let prev_end_address = if next_range_idx >= reversed_ranges.len() {
136 self.base
137 } else {
138 reversed_ranges[next_range_idx]
139 .0
140 .unchecked_add(*(reversed_ranges[next_range_idx].1))
141 };
142
143 // If we have enough space between this range and the previous one,
144 // we return the start of this range minus the requested size.
145 // As each new range is allocated at the end of the available address space,
146 // we will tend to always allocate new ranges there as well. In other words,
147 // ranges accumulate at the end of the address space.
148 if let Some(size_delta) =
149 address.checked_sub(self.align_address(prev_end_address, alignment).raw_value())
150 {
151 let adjust = alignment.saturating_sub(1);
152 if size_delta.raw_value() >= req_size {
153 return Some(
154 self.align_address(address.unchecked_sub(req_size + adjust), alignment),
155 );
156 }
157 }
158 }
159
160 None
161 }
162
163 /// Allocates a range of addresses from the managed region. Returns `Some(allocated_address)`
164 /// when successful, or `None` if an area of `size` can't be allocated or if alignment isn't

Callers 1

allocateMethod · 0.80

Calls 3

iterMethod · 0.80
align_addressMethod · 0.80
lenMethod · 0.45

Tested by

no test coverage detected