kernel/vm: Implement swap adoption for cut_area middle case.
Rename MovePageRange to Adopt and group it with Resize/Rebase as it covers the third, middle cut case. Implement VMAnonymousCache::Adopt() to actually adopt swap pages. This has to recreate swap blocks instead of taking them over from the source cache as the cut offset or base offset between the caches may not be swap block aligned. This means that adoption may fail due to memory shortage in allocating the swap blocks. For the middle cut case it is therefore now possible to have the adopt fail in which case the previous cache restore logic is applied. Since the readoption of the pages from the second cache can fail for the same reason, there is a slight chance that we can't restore and lose pages. For now, just panic in such a case and add a TODO to free memory and retry. Change-Id: I9a661f00c8f03bbbea2fe6dee90371c68d7951e6 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2588 Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
6dc4e9d72e
commit
4e2b49bc0c
@@ -113,8 +113,6 @@ public:
|
||||
void MovePage(vm_page* page, off_t offset);
|
||||
void MovePage(vm_page* page);
|
||||
void MoveAllPages(VMCache* fromCache);
|
||||
void MovePageRange(VMCache* source, off_t offset,
|
||||
off_t size, off_t newOffset);
|
||||
|
||||
inline page_num_t WiredPagesCount() const;
|
||||
inline void IncrementWiredPagesCount();
|
||||
@@ -134,6 +132,8 @@ public:
|
||||
int priority);
|
||||
virtual status_t Resize(off_t newSize, int priority);
|
||||
virtual status_t Rebase(off_t newBase, int priority);
|
||||
virtual status_t Adopt(VMCache* source, off_t offset, off_t size,
|
||||
off_t newOffset);
|
||||
|
||||
status_t FlushAndRemoveAllPages();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user