svn commit: r340678 - head/sys/arm64/arm64
Rodney W. Grimes
freebsd at pdx.rh.CN85.dnsmgr.net
Tue Nov 20 16:06:44 UTC 2018
> Author: markj
> Date: Tue Nov 20 15:12:37 2018
> New Revision: 340678
> URL: https://svnweb.freebsd.org/changeset/base/340678
>
> Log:
> Handle kernel superpage mappings in pmap_remove_l2().
>
> PR: 233088
> Reviewed by: alc, andrew, kib
> Tested by: sbruno
> MFC after: 3 days
> Sponsored by: The FreeBSD Foundation
> Differential Revision: https://reviews.freebsd.org/D17981
Mark,
If this is the fix for the aarch64/arm64 build
cluster failure could you *please* make sure it gets
MFC and MFS to releng/12 before this thursdays builds
of RC2? Ie, about the next 24 hours?
Consider this an RE approval for immediate MFC to
stable/12 so that you can send an MFS RFA to merge it
to releng/12 which well take another re to approve.
Thanks,
Rod <RE
> Modified:
> head/sys/arm64/arm64/pmap.c
>
> Modified: head/sys/arm64/arm64/pmap.c
> ==============================================================================
> --- head/sys/arm64/arm64/pmap.c Tue Nov 20 14:59:27 2018 (r340677)
> +++ head/sys/arm64/arm64/pmap.c Tue Nov 20 15:12:37 2018 (r340678)
> @@ -2382,8 +2382,40 @@ pmap_pv_insert_l2(pmap_t pmap, vm_offset_t va, pd_entr
> return (true);
> }
>
> +static void
> +pmap_remove_kernel_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t va)
> +{
> + pt_entry_t newl2, oldl2;
> + vm_page_t ml3;
> + vm_paddr_t ml3pa;
> +
> + KASSERT(!VIRT_IN_DMAP(va), ("removing direct mapping of %#lx", va));
> + KASSERT(pmap == kernel_pmap, ("pmap %p is not kernel_pmap", pmap));
> + PMAP_LOCK_ASSERT(pmap, MA_OWNED);
> +
> + ml3 = pmap_remove_pt_page(pmap, va);
> + if (ml3 == NULL)
> + panic("pmap_remove_kernel_l2: Missing pt page");
> +
> + ml3pa = VM_PAGE_TO_PHYS(ml3);
> + newl2 = ml3pa | L2_TABLE;
> +
> + /*
> + * Initialize the page table page.
> + */
> + pagezero((void *)PHYS_TO_DMAP(ml3pa));
> +
> + /*
> + * Demote the mapping. The caller must have already invalidated the
> + * mapping (i.e., the "break" in break-before-make).
> + */
> + oldl2 = pmap_load_store(l2, newl2);
> + KASSERT(oldl2 == 0, ("%s: found existing mapping at %p: %#lx",
> + __func__, l2, oldl2));
> +}
> +
> /*
> - * pmap_remove_l2: do the things to unmap a level 2 superpage in a process
> + * pmap_remove_l2: Do the things to unmap a level 2 superpage.
> */
> static int
> pmap_remove_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t sva,
> @@ -2419,16 +2451,18 @@ pmap_remove_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_
> vm_page_aflag_clear(m, PGA_WRITEABLE);
> }
> }
> - KASSERT(pmap != kernel_pmap,
> - ("Attempting to remove an l2 kernel page"));
> - ml3 = pmap_remove_pt_page(pmap, sva);
> - if (ml3 != NULL) {
> - pmap_resident_count_dec(pmap, 1);
> - KASSERT(ml3->wire_count == NL3PG,
> - ("pmap_remove_l2: l3 page wire count error"));
> - ml3->wire_count = 1;
> - vm_page_unwire_noq(ml3);
> - pmap_add_delayed_free_list(ml3, free, FALSE);
> + if (pmap == kernel_pmap) {
> + pmap_remove_kernel_l2(pmap, l2, sva);
> + } else {
> + ml3 = pmap_remove_pt_page(pmap, sva);
> + if (ml3 != NULL) {
> + pmap_resident_count_dec(pmap, 1);
> + KASSERT(ml3->wire_count == NL3PG,
> + ("pmap_remove_l2: l3 page wire count error"));
> + ml3->wire_count = 1;
> + vm_page_unwire_noq(ml3);
> + pmap_add_delayed_free_list(ml3, free, FALSE);
> + }
> }
> return (pmap_unuse_pt(pmap, sva, l1e, free));
> }
>
>
--
Rod Grimes rgrimes at freebsd.org
More information about the svn-src-head
mailing list