Let's properly synchronize with drivers that set PageOffline(). Unfreeze
every now and then, so drivers that want to set PageOffline() can make
progress.

Signed-off-by: David Hildenbrand <[email protected]>
---
 fs/proc/kcore.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c
index 92ff1e4436cb..3d7531f47389 100644
--- a/fs/proc/kcore.c
+++ b/fs/proc/kcore.c
@@ -311,6 +311,7 @@ static void append_kcore_note(char *notes, size_t *i, const 
char *name,
 static ssize_t
 read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos)
 {
+       size_t page_offline_frozen = 0;
        char *buf = file->private_data;
        size_t phdrs_offset, notes_offset, data_offset;
        size_t phdrs_len, notes_len;
@@ -509,6 +510,18 @@ read_kcore(struct file *file, char __user *buffer, size_t 
buflen, loff_t *fpos)
                        pfn = __pa(start) >> PAGE_SHIFT;
                        page = pfn_to_online_page(pfn);
 
+                       /*
+                        * Don't race against drivers that set PageOffline()
+                        * and expect no further page access.
+                        */
+                       if (page_offline_frozen == MAX_ORDER_NR_PAGES) {
+                               page_offline_unfreeze();
+                               page_offline_frozen = 0;
+                               cond_resched();
+                       }
+                       if (!page_offline_frozen++)
+                               page_offline_freeze();
+
                        /*
                         * Don't read offline sections, logically offline pages
                         * (e.g., inflated in a balloon), hwpoisoned pages,
@@ -565,6 +578,8 @@ read_kcore(struct file *file, char __user *buffer, size_t 
buflen, loff_t *fpos)
        }
 
 out:
+       if (page_offline_frozen)
+               page_offline_unfreeze();
        up_read(&kclist_lock);
        if (ret)
                return ret;
-- 
2.30.2

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to