From owner-svn-src-all@freebsd.org Fri Sep 6 03:02:13 2019 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 3FEF2DCF8C; Fri, 6 Sep 2019 03:02:13 +0000 (UTC) (envelope-from jhibbits@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 46Pj5c6L7kz3FWD; Fri, 6 Sep 2019 03:02:12 +0000 (UTC) (envelope-from jhibbits@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id A5BE1E5B9; Fri, 6 Sep 2019 03:02:12 +0000 (UTC) (envelope-from jhibbits@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x8632CPq070297; Fri, 6 Sep 2019 03:02:12 GMT (envelope-from jhibbits@FreeBSD.org) Received: (from jhibbits@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x8632CEi070296; Fri, 6 Sep 2019 03:02:12 GMT (envelope-from jhibbits@FreeBSD.org) Message-Id: <201909060302.x8632CEi070296@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jhibbits set sender to jhibbits@FreeBSD.org using -f From: Justin Hibbits Date: Fri, 6 Sep 2019 03:02:12 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r351923 - head/sys/powerpc/aim X-SVN-Group: head X-SVN-Commit-Author: jhibbits X-SVN-Commit-Paths: head/sys/powerpc/aim X-SVN-Commit-Revision: 351923 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 Sep 2019 03:02:13 -0000 Author: jhibbits Date: Fri Sep 6 03:02:12 2019 New Revision: 351923 URL: https://svnweb.freebsd.org/changeset/base/351923 Log: powerpc64/pmap: Fix a WITNESS error in alloc_pvo_entry() We only call alloc_pvo_entry() with M_WAITOK from one location. However, this can be called while holding nonsleepable locks. Rather than passing M_WAITOK down, use vm_wait() and loop. Modified: head/sys/powerpc/aim/mmu_oea64.c Modified: head/sys/powerpc/aim/mmu_oea64.c ============================================================================== --- head/sys/powerpc/aim/mmu_oea64.c Fri Sep 6 02:52:20 2019 (r351922) +++ head/sys/powerpc/aim/mmu_oea64.c Fri Sep 6 03:02:12 2019 (r351923) @@ -374,16 +374,10 @@ vm_page_to_pvoh(vm_page_t m) } static struct pvo_entry * -alloc_pvo_entry(int bootstrap, int flags) +alloc_pvo_entry(int bootstrap) { struct pvo_entry *pvo; - KASSERT(bootstrap || (flags & M_WAITOK) || (flags & M_NOWAIT), - ("Either M_WAITOK or M_NOWAIT flag must be specified " - "when bootstrap is 0")); - KASSERT(!bootstrap || !(flags & M_WAITOK), - ("M_WAITOK can't be used with bootstrap")); - if (!moea64_initialized || bootstrap) { if (moea64_bpvo_pool_index >= moea64_bpvo_pool_size) { panic("moea64_enter: bpvo pool exhausted, %d, %d, %zd", @@ -395,7 +389,7 @@ alloc_pvo_entry(int bootstrap, int flags) bzero(pvo, sizeof(*pvo)); pvo->pvo_vaddr = PVO_BOOTSTRAP; } else - pvo = uma_zalloc(moea64_pvo_zone, flags | M_ZERO); + pvo = uma_zalloc(moea64_pvo_zone, M_NOWAIT | M_ZERO); return (pvo); } @@ -663,7 +657,7 @@ moea64_setup_direct_map(mmu_t mmup, vm_offset_t kernel pregions[i].mr_size; pa += moea64_large_page_size) { pte_lo = LPTE_M; - pvo = alloc_pvo_entry(1 /* bootstrap */, 0); + pvo = alloc_pvo_entry(1 /* bootstrap */); pvo->pvo_vaddr |= PVO_WIRED | PVO_LARGE; init_pvo_entry(pvo, kernel_pmap, PHYS_TO_DMAP(pa)); @@ -1404,7 +1398,7 @@ moea64_enter(mmu_t mmu, pmap_t pmap, vm_offset_t va, v if ((m->oflags & VPO_UNMANAGED) == 0 && !vm_page_xbusied(m)) VM_OBJECT_ASSERT_LOCKED(m->object); - pvo = alloc_pvo_entry(0, M_NOWAIT); + pvo = alloc_pvo_entry(0); if (pvo == NULL) return (KERN_RESOURCE_SHORTAGE); pvo->pvo_pmap = NULL; /* to be filled in later */ @@ -1631,7 +1625,7 @@ moea64_uma_page_alloc(uma_zone_t zone, vm_size_t bytes va = VM_PAGE_TO_PHYS(m); - pvo = alloc_pvo_entry(1 /* bootstrap */, 0); + pvo = alloc_pvo_entry(1 /* bootstrap */); pvo->pvo_pte.prot = VM_PROT_READ | VM_PROT_WRITE; pvo->pvo_pte.pa = VM_PAGE_TO_PHYS(m) | LPTE_M; @@ -1863,7 +1857,11 @@ moea64_kenter_attr(mmu_t mmu, vm_offset_t va, vm_paddr int error; struct pvo_entry *pvo, *oldpvo; - pvo = alloc_pvo_entry(0, M_WAITOK); + do { + pvo = alloc_pvo_entry(0); + if (pvo == NULL) + vm_wait(NULL); + } while (pvo == NULL); pvo->pvo_pte.prot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE; pvo->pvo_pte.pa = (pa & ~ADDR_POFF) | moea64_calc_wimg(pa, ma); pvo->pvo_vaddr |= PVO_WIRED;