Module Name:    src
Committed By:   bouyer
Date:           Wed May  6 19:52:19 UTC 2020

Modified Files:
        src/sys/arch/xen/xen: balloon.c

Log Message:
Attempts to make MP-safe:
xpmap_ptom_unmap() doens't need to be called at splvm; we own the pa.
Use atomic ops to change pmap_pa_end
Make sure the ptom/mtop are up to date before giving the pages back to the
pool.


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/xen/xen/balloon.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/xen/xen/balloon.c
diff -u src/sys/arch/xen/xen/balloon.c:1.22 src/sys/arch/xen/xen/balloon.c:1.23
--- src/sys/arch/xen/xen/balloon.c:1.22	Wed May  6 17:27:39 2020
+++ src/sys/arch/xen/xen/balloon.c	Wed May  6 19:52:19 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: balloon.c,v 1.22 2020/05/06 17:27:39 bouyer Exp $ */
+/* $NetBSD: balloon.c,v 1.23 2020/05/06 19:52:19 bouyer Exp $ */
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -75,7 +75,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: balloon.c,v 1.22 2020/05/06 17:27:39 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: balloon.c,v 1.23 2020/05/06 19:52:19 bouyer Exp $");
 
 #include <sys/inttypes.h>
 #include <sys/device.h>
@@ -366,7 +366,7 @@ bpge_dtor(void *arg, void *obj)
 static size_t
 balloon_inflate(struct balloon_xenbus_softc *sc, size_t tpages)
 {
-	int rpages, s, ret;
+	int rpages, ret;
 	paddr_t pa;
 	struct balloon_page_entry *bpg_entry;
 	xen_pfn_t *mfn_list = sc->sc_mfn_list;
@@ -395,10 +395,8 @@ balloon_inflate(struct balloon_xenbus_so
 
 		mfn_list[rpages] = xpmap_ptom(pa) >> PAGE_SHIFT;
 
-		s = splvm(); /* XXXSMP */
 		/* Invalidate pg */
 		xpmap_ptom_unmap(pa);
-		splx(s);
 
 		SLIST_INSERT_HEAD(&balloon_sc->balloon_page_entries, 
 				  bpg_entry, entry);
@@ -494,19 +492,29 @@ balloon_deflate(struct balloon_xenbus_so
 			pa = pmap_pa_end;
 
 			/* P2M update */
-			s = splvm(); /* XXXSMP */
-			pmap_pa_end += PAGE_SIZE; /* XXX: TLB flush ?*/
+#if defined(_LP64) || defined(PAE)
+			atomic_add_64(&pmap_pa_end, PAGE_SIZE);
+#else
+			atomic_add_32(&pmap_pa_end, PAGE_SIZE);
+#endif
+			s = splvm();
 			xpmap_ptom_map(pa, ptoa(mfn_list[rpages]));
 			xpq_queue_machphys_update(ptoa(mfn_list[rpages]), pa);
+			xpq_flush_queue();
 			splx(s);
 
 			if (uvm_physseg_plug(atop(pa), 1, NULL) == false) {
 				/* Undo P2M */
-				s = splvm(); /* XXXSMP */
+				s = splvm();
 				xpmap_ptom_unmap(pa);
 				xpq_queue_machphys_update(ptoa(mfn_list[rpages]), 0);
-				pmap_pa_end -= PAGE_SIZE; /* XXX: TLB flush ?*/
+				xpq_flush_queue();
 				splx(s);
+#if defined(_LP64) || defined(PAE)
+				atomic_add_64(&pmap_pa_end, -PAGE_SIZE);
+#else
+				atomic_add_32(&pmap_pa_end, -PAGE_SIZE);
+#endif
 				break;
 			}
 			continue;
@@ -529,18 +537,15 @@ balloon_deflate(struct balloon_xenbus_so
 		/* Update P->M */
 		pa = VM_PAGE_TO_PHYS(bpg_entry->pg);
 
-		s = splvm(); /* XXXSMP */
-
+		s = splvm();
 		xpmap_ptom_map(pa, ptoa(mfn_list[rpages]));
 		xpq_queue_machphys_update(ptoa(mfn_list[rpages]), pa);
-
+		xpq_flush_queue();
 		splx(s);
 
 		pool_cache_put(sc->bpge_pool, bpg_entry);
 	}
 
-	xpq_flush_queue();
-
 #if BALLOONDEBUG
 	device_printf(sc->sc_dev, "deflate %zu => deflated by %d\n",
 	    tpages, rpages);

Reply via email to