Ensure the sanity of the stats returned, make the TODO a Note.

* Ensure that we don't underflow the used_pages count and that used
  + cached pages don't overflow max_pages. As there is no locking the
  values may change while we read them so that such situations could
  arise.
* Make the TODO about the missing locking into a Note explaining the
  above, as it is not really worth adding locking here. The stats are
  only informational.
This commit is contained in:
Michael Lotz
2011-11-14 19:07:37 +01:00
parent 4d3d4878a5
commit c12f51264b
+15 -5
View File
@@ -4053,9 +4053,11 @@ vm_page_num_unused_pages(void)
void
vm_page_get_stats(system_info *info)
{
// TODO: there's no locking protecting any of the queues or counters here,
// so we run the risk of getting bogus values when evaluating them at
// throughout this function...
// Note: there's no locking protecting any of the queues or counters here,
// so we run the risk of getting bogus values when evaluating them
// throughout this function. As these stats are for informational purposes
// only, it is not really worth introducing such locking. Therefore we just
// ensure that we don't under- or overflow any of the values.
// The pages used for the block cache buffers. Those should not be counted
// as used but as cached pages.
@@ -4079,8 +4081,16 @@ vm_page_get_stats(system_info *info)
// active + inactive + unused + wired + modified + cached + free + clear
// So taking out the cached (including modified non-temporary), free and
// clear ones leaves us with all used pages.
info->used_pages = info->max_pages - info->cached_pages
- sFreePageQueue.Count() - sClearPageQueue.Count();
int32 subtractPages = info->cached_pages + sFreePageQueue.Count()
+ sClearPageQueue.Count();
info->used_pages = subtractPages > info->max_pages
? 0 : info->max_pages - subtractPages;
if (info->used_pages + info->cached_pages > info->max_pages) {
// Something was shuffled around while we were summing up the counts.
// Make the values sane, preferring the worse case of more used pages.
info->cached_pages = info->max_pages - info->used_pages;
}
info->page_faults = vm_num_page_faults();
info->ignored_pages = sIgnoredPages;