From owner-freebsd-current@FreeBSD.ORG Mon Feb 18 12:44:42 2013 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id BA9B7BD3 for ; Mon, 18 Feb 2013 12:44:42 +0000 (UTC) (envelope-from onwahe@gmail.com) Received: from mail-qc0-f169.google.com (mail-qc0-f169.google.com [209.85.216.169]) by mx1.freebsd.org (Postfix) with ESMTP id 76A419EF for ; Mon, 18 Feb 2013 12:44:42 +0000 (UTC) Received: by mail-qc0-f169.google.com with SMTP id t2so2068581qcq.14 for ; Mon, 18 Feb 2013 04:44:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=clj2jLuBS6szYBXrwNXIVjHIef6VYc3YFNEmyRWOnRY=; b=OcR+2piBHeEDhRkK1xYMU6e2RncKvWAv8aKeIBQMmMttqMniR1wjmk4Op2IiIuPvwE Cm1wfr+9opxpPCwjmEcp1WtIyG5uz3SKvmBhzmN/4RMBdJMRpzsMP97segR+EsRzjRO0 1XG3tR6uIn5lYv+utbDHJNkR13TPHQrGLCjgNkdAEOkEaUhbAcerHlEnAa143dVyrvnS yQXnM9lDF8u7pzbKCrmCE+b7fCExPHLh6VLOjM9+AcBigKHdoXuv3uplMNaEF8Dn7arC +KA7IOd08QOfmIAg/coEanHUj0A85SzJS06ZE1VfzGl9MwhKlpCIdTAc+1vTVzDhHl0Y kD+g== MIME-Version: 1.0 X-Received: by 10.49.108.9 with SMTP id hg9mr4830469qeb.34.1361191476028; Mon, 18 Feb 2013 04:44:36 -0800 (PST) Received: by 10.49.121.198 with HTTP; Mon, 18 Feb 2013 04:44:35 -0800 (PST) Date: Mon, 18 Feb 2013 13:44:35 +0100 Message-ID: Subject: [patch] i386 pmap sysmaps_pcpu[] atomic access From: Svatopluk Kraus To: freebsd-current@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Feb 2013 12:44:42 -0000 Hi, the access to sysmaps_pcpu[] should be atomic with respect to thread migration. Otherwise, a sysmaps for one CPU can be stolen by another CPU and the purpose of per CPU sysmaps is broken. A patch is enclosed. Svata Index: sys/i386/i386/pmap.c =================================================================== --- sys/i386/i386/pmap.c (revision 246831) +++ sys/i386/i386/pmap.c (working copy) @@ -4146,11 +4146,11 @@ { struct sysmaps *sysmaps; + sched_pin(); sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)]; mtx_lock(&sysmaps->lock); if (*sysmaps->CMAP2) panic("pmap_zero_page: CMAP2 busy"); - sched_pin(); *sysmaps->CMAP2 = PG_V | PG_RW | VM_PAGE_TO_PHYS(m) | PG_A | PG_M | pmap_cache_bits(m->md.pat_mode, 0); invlcaddr(sysmaps->CADDR2); @@ -4171,11 +4171,11 @@ { struct sysmaps *sysmaps; + sched_pin(); sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)]; mtx_lock(&sysmaps->lock); if (*sysmaps->CMAP2) panic("pmap_zero_page_area: CMAP2 busy"); - sched_pin(); *sysmaps->CMAP2 = PG_V | PG_RW | VM_PAGE_TO_PHYS(m) | PG_A | PG_M | pmap_cache_bits(m->md.pat_mode, 0); invlcaddr(sysmaps->CADDR2); @@ -4220,13 +4220,13 @@ { struct sysmaps *sysmaps; + sched_pin(); sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)]; mtx_lock(&sysmaps->lock); if (*sysmaps->CMAP1) panic("pmap_copy_page: CMAP1 busy"); if (*sysmaps->CMAP2) panic("pmap_copy_page: CMAP2 busy"); - sched_pin(); invlpg((u_int)sysmaps->CADDR1); invlpg((u_int)sysmaps->CADDR2); *sysmaps->CMAP1 = PG_V | VM_PAGE_TO_PHYS(src) | PG_A | @@ -5072,11 +5072,11 @@ vm_offset_t sva, eva; if ((cpu_feature & CPUID_CLFSH) != 0) { + sched_pin(); sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)]; mtx_lock(&sysmaps->lock); if (*sysmaps->CMAP2) panic("pmap_flush_page: CMAP2 busy"); - sched_pin(); *sysmaps->CMAP2 = PG_V | PG_RW | VM_PAGE_TO_PHYS(m) | PG_A | PG_M | pmap_cache_bits(m->md.pat_mode, 0); invlcaddr(sysmaps->CADDR2);