Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752921AbcDOQ6X (ORCPT ); Fri, 15 Apr 2016 12:58:23 -0400 Received: from mga02.intel.com ([134.134.136.20]:33360 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751692AbcDOQ6W (ORCPT ); Fri, 15 Apr 2016 12:58:22 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,488,1455004800"; d="scan'208";a="785722545" From: "Verma, Vishal L" To: "Williams, Dan J" , "linux-nvdimm@lists.01.org" CC: "linux-kernel@vger.kernel.org" , "jmoyer@redhat.com" Subject: Re: [PATCH] libnvdimm, pmem: clarify the write+clear_poison+write flow Thread-Topic: [PATCH] libnvdimm, pmem: clarify the write+clear_poison+write flow Thread-Index: AQHRlsBWSgu8OLn38Ue2zkxeA5d+lJ+Lt94A Date: Fri, 15 Apr 2016 16:58:20 +0000 Message-ID: <1460739500.3012.4.camel@intel.com> References: <146068804768.24085.7722589204633361307.stgit@dwillia2-desk3.jf.intel.com> In-Reply-To: <146068804768.24085.7722589204633361307.stgit@dwillia2-desk3.jf.intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.254.176.69] Content-Type: text/plain; charset="utf-8" Content-ID: <39A453E113C88640B3D1A80D7F3D399C@intel.com> MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id u3FGwS3G003770 Content-Length: 1736 Lines: 52 On Thu, 2016-04-14 at 19:40 -0700, Dan Williams wrote: > The ACPI specification does not specify the state of data after a > clear > poison operation.  Potential future libnvdimm bus implementations for > other architectures also might not specify or disagree on the state > of > data after clear poison.  Clarify why we write twice. > > Reported-by: Jeff Moyer > Reported-by: Vishal Verma > Signed-off-by: Dan Williams > --- >  drivers/nvdimm/pmem.c |   14 ++++++++++++++ >  1 file changed, 14 insertions(+) Looks good, thanks! Reviewed-by: Vishal Verma > > diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c > index c6befaa9c708..d9a0dbc2d023 100644 > --- a/drivers/nvdimm/pmem.c > +++ b/drivers/nvdimm/pmem.c > @@ -86,6 +86,20 @@ static int pmem_do_bvec(struct pmem_device *pmem, > struct page *page, >   flush_dcache_page(page); >   } >   } else { > + /* > +  * Note that we write the data both before and after > +  * clearing poison.  The write before clear poison > +  * handles situations where the latest written data > is > +  * preserved and the clear poison operation simply > marks > +  * the address range as valid without changing the > data. > +  * In this case application software can assume that > an > +  * interrupted write will either return the new good > +  * data or an error. > +  * > +  * However, if pmem_clear_poison() leaves the data > in an > +  * indeterminate state we need to perform the write > +  * after clear poison. > +  */ >   flush_dcache_page(page); >   memcpy_to_pmem(pmem_addr, mem + off, len); >   if (unlikely(bad_pmem)) { >