Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp485344iog; Fri, 17 Jun 2022 07:20:09 -0700 (PDT) X-Google-Smtp-Source: AGRyM1tqQjYLY3AMpWZ7+zBkSAKo9/2/k5c4FO7WYow04FJLuoYn8RmmBCpXviH4NKwxiLIRGqkm X-Received: by 2002:a05:6402:4410:b0:434:f35f:132e with SMTP id y16-20020a056402441000b00434f35f132emr12541535eda.215.1655475608776; Fri, 17 Jun 2022 07:20:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655475608; cv=none; d=google.com; s=arc-20160816; b=phEQLkr3trzV9mNu9w261/fp6O2qNpeMYXKi161pdcuGQ9rQVjF90CIgzvh6D7O6dB UoX/d/ClP3OXbLfxHNPL8ex5rrHKs32sOz+86xvnuARFbmpjzN3S9+QjveHTj3Vnjl/y d0jOwejc93vBWgp2uWKOlru8NwJirheXh5DzinNwZOf6i5tkriZGEDAHFgZrx7I1ZIoC JXP+42lV/lJmsDV/MKvEYkBCMTGPuTxNrspE0oEoRj8JGpvDJryl9HhJMDbN96Lhzukd okQDBBDQYGQpIp5wNpB8n4BlrFIBFOD8UIiPgee8feybXjbzV8fWmNg93CccjPsvzu9P r3QA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :organization:references:in-reply-to:message-id:subject:cc:to:from :date; bh=l6ftPi0w3khnCM+1XY5lSG5emURb2D0Xse3lYG3/J8k=; b=mIsm5wFWBySWwsSe9l5w2EbbmupWHZBY2Tg1yqBBqG2d6+XDFhz+nxOwZH7+rax1qV 3bW/Two4pxrKJvnqexrEYDMNImPxKW7ynjqHturesSAnGfdc7tbG3vrY7y3JcGh3g4XH ZAyyXC/w5RGPZ3YqwDIphQNu5CS1xMI3LLRFhUnzBxsRPIDXHBicdufZDHFNqNyyLSCX Bj/tHhzs18oJ5RFVSv/vUlNcPkS0+jMHw3Hkvqb2/imEofOlFNeKW7ASubDTazHkCEsg eIyvhJaeE6WYSWIHXldXAIFYM6z7YiNtxxmGmkZX0K4yhFPjtg8Fxl4h5AlTm9AoAL8x lRVw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i5-20020a05640242c500b00423f62ce403si2108627edc.571.2022.06.17.07.19.43; Fri, 17 Jun 2022 07:20:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1382611AbiFQOFT (ORCPT + 99 others); Fri, 17 Jun 2022 10:05:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44792 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233854AbiFQOFR (ORCPT ); Fri, 17 Jun 2022 10:05:17 -0400 Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4E7A413FAD; Fri, 17 Jun 2022 07:05:16 -0700 (PDT) Received: from fraeml738-chm.china.huawei.com (unknown [172.18.147.207]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4LPgly0bmjz67yhs; Fri, 17 Jun 2022 22:05:02 +0800 (CST) Received: from lhreml710-chm.china.huawei.com (10.201.108.61) by fraeml738-chm.china.huawei.com (10.206.15.219) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Fri, 17 Jun 2022 16:05:13 +0200 Received: from localhost (10.81.209.131) by lhreml710-chm.china.huawei.com (10.201.108.61) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.2375.24; Fri, 17 Jun 2022 15:05:12 +0100 Date: Fri, 17 Jun 2022 15:05:08 +0100 From: Jonathan Cameron To: CC: Dan Williams , Ira Weiny , Vishal Verma , Ben Widawsky , Steven Rostedt , Ingo Molnar , , Subject: Re: [PATCH 2/3] cxl/mbox: Add GET_POISON_LIST mailbox command support Message-ID: <20220617150508.0000266a@Huawei.com> In-Reply-To: <382a9c35ef43e89db85670637d88371f9197b7a2.1655250669.git.alison.schofield@intel.com> References: <382a9c35ef43e89db85670637d88371f9197b7a2.1655250669.git.alison.schofield@intel.com> Organization: Huawei Technologies Research and Development (UK) Ltd. X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.29; i686-w64-mingw32) MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.81.209.131] X-ClientProxiedBy: lhreml709-chm.china.huawei.com (10.201.108.58) To lhreml710-chm.china.huawei.com (10.201.108.61) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 14 Jun 2022 17:10:27 -0700 alison.schofield@intel.com wrote: > From: Alison Schofield > > CXL devices that support persistent memory maintain a list of locations > that are poisoned or result in poison if the addresses are accessed by > the host. > > Per the spec (CXL 2.0 8.2.8.5.4.1), the device returns this Poison > list as a set of Media Error Records that include the source of the > error, the starting device physical address and length. The length is > the number of adjacent DPAs in the record and is in units of 64 bytes. > > Retrieve the list and log each Media Error Record as a trace event of > type cxl_poison_list. > > Signed-off-by: Alison Schofield A few more things inline. Otherwise, can confirm it works with some hack QEMU code. I'll tidy that up and post soon. > +int cxl_mem_get_poison_list(struct device *dev) > +{ > + struct cxl_memdev *cxlmd = to_cxl_memdev(dev); > + struct cxl_dev_state *cxlds = cxlmd->cxlds; > + struct cxl_mbox_poison_payload_out *po; > + struct cxl_mbox_poison_payload_in pi; > + int nr_records = 0; > + int rc, i; > + > + if (range_len(&cxlds->pmem_range)) { > + pi.offset = cpu_to_le64(cxlds->pmem_range.start); > + pi.length = cpu_to_le64(range_len(&cxlds->pmem_range)); > + } else { > + return -ENXIO; > + } > + > + po = kvmalloc(cxlds->payload_size, GFP_KERNEL); > + if (!po) > + return -ENOMEM; > + > + do { > + rc = cxl_mbox_send_cmd(cxlds, CXL_MBOX_OP_GET_POISON, &pi, > + sizeof(pi), po, cxlds->payload_size); > + if (rc) > + goto out; > + > + if (po->flags & CXL_POISON_FLAG_OVERFLOW) { > + time64_t o_time = le64_to_cpu(po->overflow_timestamp); > + > + dev_err(dev, "Poison list overflow at %ptTs UTC\n", > + &o_time); > + rc = -ENXIO; > + goto out; > + } > + > + if (po->flags & CXL_POISON_FLAG_SCANNING) { > + dev_err(dev, "Scan Media in Progress\n"); > + rc = -EBUSY; > + goto out; > + } > + > + for (i = 0; i < le16_to_cpu(po->count); i++) { > + u64 addr = le64_to_cpu(po->record[i].address); > + u32 len = le32_to_cpu(po->record[i].length); > + int source = FIELD_GET(CXL_POISON_SOURCE_MASK, addr); > + > + if (!CXL_POISON_SOURCE_VALID(source)) { > + dev_dbg(dev, "Invalid poison source %d", > + source); > + source = CXL_POISON_SOURCE_INVALID; > + } > + > + trace_cxl_poison_list(dev, source, addr, len); Need to mask off the lower 6 bits of addr as they contain the source + a few reserved bits. I was confused how you were geting better than 64 byte precision in your example. > + } > + > + /* Protect against an uncleared _FLAG_MORE */ > + nr_records = nr_records + le16_to_cpu(po->count); > + if (nr_records >= cxlds->poison_max) > + goto out; > + > + } while (po->flags & CXL_POISON_FLAG_MORE); So.. A conundrum here. What happens if: 1. We get an error mid way through a set of multiple reads (something intermittent - maybe a software issue) 2. We will drop out of here fine and report the error. 3. We run this function again. It will (I think) currently pick up where we left off, but we have no way of knowing that as there isn't a 'total records' count or any other form of index in the output payload. So, software solutions I think should work (though may warrant a note to be added to the spec). 1. Read whole thing twice. First time is just to ensure we get to the end and flush out any prior half done reads. 2. Issue a read for a different region (perhaps length 0) first and assume everything starts from scratch when we go back to this region. Jonathan > + > +out: > + kvfree(po); > + return rc; > +} > +EXPORT_SYMBOL_NS_GPL(cxl_mem_get_poison_list, CXL); > + > struct cxl_dev_state *cxl_dev_state_create(struct device *dev) > { > struct cxl_dev_state *cxlds;