From owner-svn-src-head@freebsd.org Sun Aug 16 16:31:11 2015 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id BCC759BBBB9; Sun, 16 Aug 2015 16:31:11 +0000 (UTC) (envelope-from jason.harmening@gmail.com) Received: from mail-ob0-x235.google.com (mail-ob0-x235.google.com [IPv6:2607:f8b0:4003:c01::235]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 7BA6AEEF; Sun, 16 Aug 2015 16:31:11 +0000 (UTC) (envelope-from jason.harmening@gmail.com) Received: by obbhe7 with SMTP id he7so95203015obb.0; Sun, 16 Aug 2015 09:31:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-type:content-transfer-encoding; bh=n9GhTXKLQxMrD9ONnIS5SX2O617WR0XjovaTsyZmBo8=; b=qcyWTgEM1Yrg/Sye+CJG22EwIz+bAwEqSM5wgrfhotIXlWOTSDLtlr+BPKN1F+V7u/ oEox2byx6lQ7jlXlOgM6biaxoiFw/yRtXGL3kvstoWrkN50dCmpOAcUwhOqpPkfnG9hB jWezmhMV/dNne3YZwpBl+7VkK21pD6gJr5MTN/mgAKYf9o/lIxl6QN9W1pz2yFWoGIWk Zb1iLg7GRxc8v7d21VsDfMo2F5BelrX7XOTFcZphzTacsIw/xvwnVIMwGTv1Csgu3koF TPQvixA+7TLRFfsjjIemSn0ySQ8Ua9u2j5wbc+PQ6gBuJFQ7Rz/acsitzYqoQbPvWk9+ j2NQ== X-Received: by 10.60.16.228 with SMTP id j4mr50442450oed.59.1439742670783; Sun, 16 Aug 2015 09:31:10 -0700 (PDT) Received: from corona.austin.rr.com (cpe-72-177-6-10.austin.res.rr.com. [72.177.6.10]) by smtp.googlemail.com with ESMTPSA id gu5sm5368964obc.21.2015.08.16.09.31.08 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 16 Aug 2015 09:31:09 -0700 (PDT) Subject: Re: svn commit: r286787 - head/sys/x86/x86 To: Konstantin Belousov , Roger Pau Monn?? References: <201508142008.t7EK8Hkt037329@repo.freebsd.org> <55CF390F.5010407@FreeBSD.org> <55CF5B13.1040501@gmail.com> <55D046F5.60601@FreeBSD.org> <20150816090358.GW2072@kib.kiev.ua> <20150816095004.GX2072@kib.kiev.ua> Cc: "Jason A. Harmening" , src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org From: Jason Harmening Message-ID: <55D0BBB3.4060707@gmail.com> Date: Sun, 16 Aug 2015 11:34:59 -0500 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <20150816095004.GX2072@kib.kiev.ua> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 16 Aug 2015 16:31:11 -0000 On 08/16/15 04:50, Konstantin Belousov wrote: > On Sun, Aug 16, 2015 at 12:03:58PM +0300, Konstantin Belousov wrote: >> On Sun, Aug 16, 2015 at 10:16:53AM +0200, Roger Pau Monn?? wrote: >>> pmap_map_io_transient contains some of this logic, but it uses >>> vmem_alloc (with M_WAITOK) instead of a pcpu pageframe, which defeats >>> part of the purpose of this change and cannot be used as-is. >> >> This logic can be repeated, but it is probably too much for the purpose. >> It would be enough to have single frame (we cannot reuse CMAP1), >> protected by a spin mutex. I do not see much sense in providing >> optimized per-cpu frames for this case. > > Like this. I only compiled the patch. > > diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c > index 1e64fc8..9d2b2d9 100644 > --- a/sys/amd64/amd64/pmap.c > +++ b/sys/amd64/amd64/pmap.c > @@ -390,6 +390,8 @@ static struct md_page *pv_table; > */ > pt_entry_t *CMAP1 = 0; > caddr_t CADDR1 = 0; > +static vm_offset_t qframe = 0; > +static struct mtx qframe_mtx; > > static int pmap_flags = PMAP_PDE_SUPERPAGE; /* flags for x86 pmaps */ > > @@ -1031,7 +1033,7 @@ pmap_init(void) > struct pmap_preinit_mapping *ppim; > vm_page_t mpte; > vm_size_t s; > - int i, pv_npg; > + int error, i, pv_npg; > > /* > * Initialize the vm page array entries for the kernel pmap's > @@ -1112,6 +1114,12 @@ pmap_init(void) > printf("PPIM %u: PA=%#lx, VA=%#lx, size=%#lx, mode=%#x\n", i, > ppim->pa, ppim->va, ppim->sz, ppim->mode); > } > + > + mtx_init(&qframe_mtx, "qfrmlk", NULL, MTX_SPIN); > + error = vmem_alloc(kernel_arena, PAGE_SIZE, M_BESTFIT | M_WAITOK, > + (vmem_addr_t *)&qframe); > + if (error != 0) > + panic("qframe allocation failed"); > } > > static SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD, 0, > @@ -7019,13 +7027,28 @@ pmap_unmap_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count, > vm_offset_t > pmap_quick_enter_page(vm_page_t m) > { > + vm_paddr_t paddr; > > - return (PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m))); > + paddr = VM_PAGE_TO_PHYS(m); > + if (paddr < dmaplimit) > + return (PHYS_TO_DMAP(paddr)); > + mtx_lock_spin(&qframe_mtx); > + KASSERT(*vtopte(qframe) == 0, ("qframe busy")); > + pte_store(vtopte(qframe), paddr | X86_PG_RW | X86_PG_V | X86_PG_A | > + X86_PG_M | pmap_cache_bits(kernel_pmap, m->md.pat_mode, 0)); > + invlpg(qframe); > + return (qframe); > } > > void > pmap_quick_remove_page(vm_offset_t addr) > { > + > + if (addr != qframe) > + return; > + pte_store(vtopte(qframe), 0); > + invlpg(qframe); > + mtx_unlock_spin(&qframe_mtx); > } > > #include "opt_ddb.h" > That looks fine to me.