[roll] Roll fuchsia [kernel][vm] Fix bug in SupplyPagesLocked

The current code for `SupplyPagesLocked` does not correctly handle the
case where the PMM returns a `ZX_ERR_SHOULD_WAIT`. Consider the
following series of events:
1. `TakePagesLocked` is called on a VMO that has been compressed.
2. The resulting splice list is passed into `SupplyPagesLocked`.
3. `SupplyPagesLocked` starts iterating through the splice list. In
   doing so, it pops the first page P off the list.
4. Page P is compressed, so `SupplyPagesLocked` invokes
   `MakePageFromReference`, which attempts to allocate a page from the
   PMM to hold the decompressed contents.
5. The PMM returns `ZX_ERR_SHOULD_WAIT`, causing `SupplyPagesLocked`
   to return. Notice that page P is no longer in the splice list.
6. The caller of `SupplyPagesLocked` (`VmObjectPaged::SupplyPages`)
   notices that `ZX_ERR_SHOULD_WAIT` was returned and therefore waits on
   the page request populated by the PMM.
7. Once the page request has succeeded, `VmObjectPaged::SupplyPages`
   calls `VmCowPages::SupplyPagesLocked` with the same splice list
   again, hoping to resume the operation where it left off. However,
   page P is no longer in the splice list, so it is skipped.
This means that the contents of page P are lost, and all successive
pages are inserted at the wrong offset (off by exactly one page).

This CL fixes the issue by leaving page P in the splice list until
`MakePageFromReference` has succeeded. It does so by "peeking" at the
first page in the splice list, determining if it is a reference, and
then decompressing it prior to actually popping the page from the list.

Original-Bug: 126153
Original-Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/950652
Original-Revision: 3e88262dedd3e5495dedadfe808127184d3b337b
GitOrigin-RevId: aa985a2fd5e0168083ec165d99c6df7b5d4d45c3
Change-Id: I782f4d89ad722e13ec8dd669da9b2a2b0939d89d
1 file changed
tree: 26b42ae6e548e41239e5660618784776a66d1d1f
  1. git-hooks/
  2. infra/
  3. third_party/
  4. cts
  5. firmware
  6. flower
  7. jiri.lock
  8. MILESTONE
  9. minimal
  10. prebuilts
  11. README.md
  12. stem
  13. test_durations
  14. toolchain
README.md

Integration

This repository contains Fuchsia's Global Integration manifest files.

Making changes

All changes should be made to the internal version of this repository. Our infrastructure automatically updates this version when the internal one changes.

Currently all changes must be made by a Google employee. Non-Google employees wishing to make a change can ask for assistance via the IRC channel #fuchsia on Freenode.

Obtaining the source

First install Jiri.

Next run:

$ jiri init
$ jiri import minimal https://fuchsia.googlesource.com/integration
$ jiri update

Third party

Third party projects should have their own subdirectory in ./third_party.