pm: Fix uninitialized struct page semaphore
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 28 Oct 2017 00:38:00 +0000 (20:38 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Oct 2017 18:57:20 +0000 (14:57 -0400)
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/pagemap.c
kern/src/pmap.c

index 6cf169c..8435241 100644 (file)
@@ -202,7 +202,10 @@ int pm_load_page(struct page_map *pm, unsigned long index, struct page **pp)
                /* important that UP_TO_DATE is not set.  once we put it in the PM,
                 * others can find it, and we still need to fill it. */
                atomic_set(&page->pg_flags, PG_LOCKED | PG_PAGEMAP);
-               page->pg_sem.nr_signals = 0;    /* preemptively locking */
+               /* The sem needs to be initted before anyone can try to lock it, meaning
+                * before it is in the page cache.  We also want it locked preemptively,
+                * by setting signals = 0. */
+               sem_init(&page->pg_sem, 0);
                error = pm_insert_page(pm, index, page);
                switch (error) {
                        case 0:
index 6b4d167..9935287 100644 (file)
@@ -80,8 +80,8 @@ void pmem_init(struct multiboot_info *mbi)
        printk("Max physical RAM (appx, bytes): %lu\n", max_pmem);
        printk("Max addressable physical RAM (appx): %lu\n", max_paddr);
        printk("Highest page number (including reserved): %lu\n", max_nr_pages);
-       /* We should init the page structs, but zeroing happens to work, since the
-        * sems are not irqsave. */
+       /* We should init the page structs, but zeroing happens to work, except for
+        * the sems.  Those are init'd by the page cache before they are used. */
        pages = (struct page*)boot_zalloc(max_nr_pages * sizeof(struct page),
                                          PGSIZE);
        base_arena_init(mbi);