discard trailing free page maps

This commit is contained in:
Nikita Smith
2026-04-15 15:32:51 -07:00
parent 5f3e7e7175
commit d1d42102dd
+21 -25
View File
@@ -627,32 +627,31 @@ msf_find_max_pn_(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNu
MSF_PageNumber fpm_pn = fpm_pn_arr.v[fpm_pn_idx]; MSF_PageNumber fpm_pn = fpm_pn_arr.v[fpm_pn_idx];
U32Array fpm_data = msf_fpm_data_from_pn(page_data_list, page_size, fpm_pn); U32Array fpm_data = msf_fpm_data_from_pn(page_data_list, page_size, fpm_pn);
// we have to work around the fact that FPM bits are always alloced U64 bit_idx = max_U64;
// and also there is a trail of unused FPM groups too U64 hi = fpm_data.count*32;
U32 bit_idx = max_U32; while (hi > 0) {
for (MSF_Int i = fpm_page_count - 1; i >= 0; i -= 1) { U64 msb_idx = bit_array_scan_right_to_left32(fpm_data, 0, hi, MSF_PAGE_STATE_ALLOC);
U32 fpm_lo = i * fpm_interval_wrong + 3; // skip first page bit and FPM group bits
U32 fpm_hi = i * fpm_interval_wrong + fpm_interval_wrong;
bit_idx = bit_array_scan_right_to_left32(fpm_data, fpm_lo, fpm_hi, MSF_PAGE_STATE_ALLOC);
if (bit_idx <= fpm_interval_correct) {
break;
}
}
// check first page bit // FPM is empty
if (bit_idx >= fpm_interval_correct) { if (msb_idx >= hi) { break; }
bit_idx = bit_array_scan_left_to_right32(fpm_data, 0, 1, MSF_PAGE_STATE_ALLOC);
if (bit_idx >= fpm_interval_correct) { // hit FPM page -- keep going
U64 k = msb_idx % fpm_interval_wrong;
if (k < 3) {
hi = msb_idx;
continue; continue;
} }
bit_idx = msb_idx;
break;
} }
// compute max page number // stop if there is a page
MSF_PageNumber pn = bit_idx + (MSF_UInt)fpm_pn_idx * fpm_interval_correct; if (bit_idx != max_U64) {
max_pn = Max(max_pn, pn); max_pn = Max(bit_idx, 2) + fpm_pn_idx * fpm_interval_correct;
break; break;
} }
}
return max_pn; return max_pn;
} }
@@ -666,6 +665,7 @@ msf_find_max_pn(MSF_PageDataList page_data_list, MSF_UInt page_size)
MSF_PageNumber fpm0_max = msf_find_max_pn_(page_data_list, page_size, fpm0_pn_arr); MSF_PageNumber fpm0_max = msf_find_max_pn_(page_data_list, page_size, fpm0_pn_arr);
MSF_PageNumber fpm1_max = msf_find_max_pn_(page_data_list, page_size, fpm1_pn_arr); MSF_PageNumber fpm1_max = msf_find_max_pn_(page_data_list, page_size, fpm1_pn_arr);
MSF_PageNumber max_pn = Max(fpm0_max, fpm1_max); MSF_PageNumber max_pn = Max(fpm0_max, fpm1_max);
Assert(max_pn > 1);
scratch_end(scratch); scratch_end(scratch);
return max_pn; return max_pn;
} }
@@ -1672,13 +1672,9 @@ msf_get_page_data_nodes(Arena *arena, MSF_Context *msf)
internal U64 internal U64
msf_get_save_size(MSF_Context *msf) msf_get_save_size(MSF_Context *msf)
{ {
#if 0
MSF_PageNumber max_pn = msf_find_max_pn(msf->page_data_list, msf->page_size); MSF_PageNumber max_pn = msf_find_max_pn(msf->page_data_list, msf->page_size);
U64 size = ((U64)max_pn + 1) * (U64)msf->page_size; U64 page_count = max_pn + 1;
Assert(msf_count_pages(size, msf->page_size) == msf->page_count); U64 size = page_count * msf->page_size;
#else
U64 size = (U64)msf->page_count * msf->page_size;
#endif
return size; return size;
} }