Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754870AbbBKWYS (ORCPT ); Wed, 11 Feb 2015 17:24:18 -0500 Received: from mga11.intel.com ([192.55.52.93]:28436 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754704AbbBKWYQ (ORCPT ); Wed, 11 Feb 2015 17:24:16 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.09,561,1418112000"; d="scan'208";a="665088880" Message-ID: <54DBD682.3000306@intel.com> Date: Wed, 11 Feb 2015 14:24:02 -0800 From: "H. Peter Anvin" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Ross Zwisler , linux-kernel@vger.kernel.org CC: Ingo Molnar , Thomas Gleixner , Borislav Petkov Subject: Re: [PATCH v3 1/2] x86: Add support for the pcommit instruction References: <1422377631-8986-1-git-send-email-ross.zwisler@linux.intel.com> <1422377631-8986-2-git-send-email-ross.zwisler@linux.intel.com> In-Reply-To: <1422377631-8986-2-git-send-email-ross.zwisler@linux.intel.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2762 Lines: 83 On 01/27/2015 08:53 AM, Ross Zwisler wrote: > Add support for the new pcommit (persistent commit) instruction. This > instruction was announced in the document "Intel Architecture > Instruction Set Extensions Programming Reference" with reference number > 319433-022. > > https://software.intel.com/sites/default/files/managed/0d/53/319433-022.pdf > > The pcommit instruction ensures that data that has been flushed from the > processor's cache hierarchy with clwb, clflushopt or clflush is accepted to > memory and is durable on the DIMM. The primary use case for this is persistent > memory. > > This function shows how to properly use clwb/clflushopt/clflush and > pcommit with appropriate fencing: > > void flush_and_commit_buffer(void *vaddr, unsigned int size) > { > void *vend = vaddr + size - 1; > > for (; vaddr < vend; vaddr += boot_cpu_data.x86_clflush_size) > clwb(vaddr); > > /* Flush any possible final partial cacheline */ > clwb(vend); > > /* > * sfence to order clwb/clflushopt/clflush cache flushes > * mfence via mb() also works > */ > wmb(); > > /* pcommit and the required sfence for ordering */ > pcommit_sfence(); > } > > After this function completes the data pointed to by vaddr is has been > accepted to memory and will be durable if the vaddr points to > persistent memory. > > Pcommit must always be ordered by an mfence or sfence, so to help > simplify things we include both the pcommit and the required sfence in > the alternatives generated by pcommit_sfence(). The other option is to > keep them separated, but on platforms that don't support pcommit this > would then turn into: > > void flush_and_commit_buffer(void *vaddr, unsigned int size) > { > void *vend = vaddr + size - 1; > > for (; vaddr < vend; vaddr += boot_cpu_data.x86_clflush_size) > clwb(vaddr); > > /* Flush any possible final partial cacheline */ > clwb(vend); > > /* > * sfence to order clwb/clflushopt/clflush cache flushes > * mfence via mb() also works > */ > wmb(); > > nop(); /* from pcommit(), via alternatives */ > > /* > * sfence to order pcommit > * mfence via mb() also works > */ > wmb(); > } > > This is still correct, but now you've got two fences separated by only a > nop. With the commit and the fence together in pcommit_sfence() you > avoid the final unneeded fence. Acked-by: H. Peter Anvin -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/