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);