[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 02/10] mini-os: sort and sanitize e820 memory map
Juergen Gross, le lun. 13 déc. 2021 15:56:21 +0100, a ecrit: > On 12.12.21 01:05, Samuel Thibault wrote: > > Hello, > > > > Juergen Gross, le lun. 06 déc. 2021 08:23:29 +0100, a ecrit: > > > - align the entries to page boundaries > > > > > + /* Adjust map entries to page boundaries. */ > > > + for ( i = 0; i < e820_entries; i++ ) > > > + { > > > + end = (e820_map[i].addr + e820_map[i].size + PAGE_SIZE - 1) & > > > PAGE_MASK; > > > + e820_map[i].addr &= PAGE_MASK; > > > + e820_map[i].size = end - e820_map[i].addr; > > > + } > > > > Mmm, what if the previous entry ends after the aligned start? > > > > On real machines that does happen, and you'd rather round up the start > > address of usable areas, rather than rounding it down (and conversely > > for the end). > > I think you are partially right. :-) > > Entries for resources managed by Mini-OS (RAM, maybe NVME?) should be > rounded to cover only complete pages (start rounded up, end rounded > down), but all other entries should be rounded to cover the complete > area (start rounded down, end rounded up) in order not to use any > partial used page for e.g. mapping foreign pages. Right! > > > + /* Sort entries by start address. */ > > > + for ( i = 0; i < e820_entries - 1; i++ ) > > > + { > > > + if ( e820_map[i].addr > e820_map[i + 1].addr ) > > > + { > > > + e820_swap_entries(i, i + 1); > > > + i = -1; > > > + } > > > + } > > > > This looks O(n^3) to me? A bubble sort like this should be fine: > > > > /* Sort entries by start address. */ > > for ( last = e820_entries; last > 1; last-- ) > > { > > for ( i = 0; i < last - 1; i++ ) > > { > > if ( e820_map[i].addr > e820_map[i + 1].addr ) > > { > > e820_swap_entries(i, i + 1); > > } > > } > > } > > Hmm, depends. > > Assuming a rather well sorted map my version is O(n), while yours > is still O(n^2). Right, I was a bit lazy :) This should be fine: /* Sort entries by start address. */ for ( i = 1; i < e820_entries; i++ ) for ( j = i; j > 0 && e820_map[j-1].addr > e820_map[j].addr ) ; j-- ) e820_swap_entries(j - 1, j); > I'm fine both ways, whatever you prefer. I really prefer for loops which don't unexpectedly modify their loop index, that's much less scary :) Samuel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |