Acked-by: Zi Yan <z...@nvidia.com>
Signed-off-by: David Hildenbrand <da...@redhat.com>

Hi David, sorry for jumping in late

Hi,

not late at all :)


@@ -1157,6 +1083,7 @@ static void virtio_mem_set_fake_offline(unsigned long pfn,
                        SetPageDirty(page);
                else
                        __SetPageOffline(page);
+               __SetPageOfflineSkippable(page);
                VM_WARN_ON_ONCE(!PageOffline(page));

I think I am having some issues understanding this, let me see if I get
it.

- virtio-mem defines PageOffline pages, which are logically-offlined
   pages within an onlined memory-block

PageOffline is a more generic concept also e.g., used by memory balloning. virtio-mem uses that concept, yes.

- PageOffline pages have a refcount of '0' once they are properly
   initialized, meaning that refcount > 0 implies somebody is holding
   a refcount and that should not really happen

PageOffline pages currently always have a refcount > 0 (except temporarily in this special case we are removing here). In the future, it won't have a refcount at all.

- logically-offline pages belonging to onlined memory-blocks are marked 
PageDirty,
   while logically-offlined pages we allocated via alloc_contig_range are marked
   PageOffline (I am getting a bit lost between fake-online, fake-offline, my 
fault)

No, the code is confusing.

All pages are PageOffline. Only the ones that have not been onlined are *in addition* PageDirty.

The relevant bit is documented in page-flags.h:

"When a memory block gets onlined, all pages are initialized with a refcount of 1 and PageOffline(). generic_online_page() will take care of clearing PageOffline()."

- If we want to release logically-offline pages belonging to an onlined 
memory-block,
   we ClearDirty them and be done

PageOffline gets cleared in both cases: See the comment in virtio_mem_clear_fake_offline()

"/* generic_online_page() will clear PageOffline(). */"

I'll note that I am planning on removing that PageDirty() handling completely, and also letting handling PageOffline() clearing be always performed by memory freeing core (the latter is easier to achieve).

- If we want to release logically-offlined pages belonging we allocated
   via alloc_contig_range, we clear PageOffline and be done

Yes, in the future that clearing will be done by the core (so the plan).

> - PageOfflineSkipabble are unmovable PageOffline pages, which cannot be migrated?

Yes, but they can simply be skipped -- consider them memory holes we (the driver) can rediscover when re-onlining the memory. See below.

- So for a PageOffline to be able to be migrated away must be Movable or
   marked PageOfflineSkipabble, making do_migrate_range ignore it

Yes.

- PageOfflineSkipabble will be marked PageOffline upon re-onlining? Will
   still be marked as PageOfflineSkipabble?

When re-onlining, the core will set them all PageOffline, and virtio-mem will intercept page onlining using the page_online_cb.

virtio-mem will then online the actually plugged parts (-> generic_online_page(), which clears PageOffline and exposes them to the buddy) and set the unplugged/hole parts as PageOfflineSkipabble again.

That logic resides in virtio_mem_online_page_cb().


+
+               /*
+                * Only PageOffline() pages that are marked "skippable" cannot
+                * be migrated but can be skipped when offlining. See

It is probably me, and nevermind the comment but I somehow find
"PageOfflineSkipabble are not migrated but skipped when offlining" a bit
easier.

Definitely. Thanks!

--
Cheers,

David / dhildenb


Reply via email to