From patchwork Tue Apr 23 03:48:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alison Schofield X-Patchwork-Id: 13639290 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E263E1C6A3 for ; Tue, 23 Apr 2024 03:48:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713844093; cv=none; b=Nk2MQBXYhM/NIbljUjT2PnRVF+pLyJq+/wLHQWRjFJJQb/zEvE+6c4dzeBW58bpw+EEgRIYGS4KgsoVpN2YuBLgnXzDDKqqRYljdspE1xFWpN7uUyK91SQryib/ljPZL8QlobVJybKb1+fUl4RIMYNLE7R6GHNmZyiI9XzfdUgc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713844093; c=relaxed/simple; bh=ABXHD79SAY7dW0Fx6Y7aYlXFP4JckPvRUUEtzb8P5uc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=IzsurDgk8XcmubzZlOfR/cI0C6PP55lzRkgK86lfF1GwMImx99/wb4+3zHa6TwvA4bjivtK1GXzDUIx42xKQko9XUmN4W6b9T1VenOlsYFXqdkaB52jYVLxQuMH5yUyw/iPbgNsYip+Sn/XzuGl+m9Nv3M8/tKG+GHKyPps3pEE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=FSk+//yd; arc=none smtp.client-ip=192.198.163.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="FSk+//yd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1713844092; x=1745380092; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ABXHD79SAY7dW0Fx6Y7aYlXFP4JckPvRUUEtzb8P5uc=; b=FSk+//ydIeDfi2N8yaEnGziqRvfIELqKwgl05x0oXovwuOq77C40vo8H f/C4hGVG6MVRfsaEs5CGXwdvW2huisTQZQVXuCRLHsGpmq9FSr9RLqd7x QoJAYzox7Swa8xhRppApsU8T9i0w5Xz1K7OBYYcST6YOA4QeH9Bw5hbcE T/lnKeyT8By5zKBAuRTk6scB+/AOMrKdv4n1Pp1y0hsH4WCepkVTzN3uJ SQpSlFs77LU2FYL8pDMLGvvoqDttTTxhsHPuIHW1aBCQ+WJPUuswSFZEz i68twpHdZ1ftl+tvlwId6q6XiOV221JhgbIU2KJ4LmmRvXnT9TGhMZodV w==; X-CSE-ConnectionGUID: L0+QQk/FTZGBCfZrNWYAUw== X-CSE-MsgGUID: texOfMJaSqa2hrF79nVEsg== X-IronPort-AV: E=McAfee;i="6600,9927,11052"; a="26925884" X-IronPort-AV: E=Sophos;i="6.07,222,1708416000"; d="scan'208";a="26925884" Received: from orviesa003.jf.intel.com ([10.64.159.143]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Apr 2024 20:48:10 -0700 X-CSE-ConnectionGUID: 7LCXNCAuSxu2xnAe9Pirkw== X-CSE-MsgGUID: HJ/iozNsQiOQU2a50VmyqA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,222,1708416000"; d="scan'208";a="28884700" Received: from aschofie-mobl2.amr.corp.intel.com (HELO localhost) ([10.209.73.120]) by ORVIESA003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Apr 2024 20:48:09 -0700 From: alison.schofield@intel.com To: Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , Vishal Verma , Ira Weiny , Dan Williams Cc: linux-cxl@vger.kernel.org, Steven Rostedt , Jonathan Cameron Subject: [PATCH v2 1/4] cxl/region: Move cxl_dpa_to_region() work to the region driver Date: Mon, 22 Apr 2024 20:48:03 -0700 Message-Id: X-Mailer: git-send-email 2.40.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-cxl@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Alison Schofield This helper belongs in the region driver as it is only useful with CONFIG_CXL_REGION. Add a stub in core.h for when the region driver is not built. Signed-off-by: Alison Schofield Reviewed-by: Jonathan Cameron Reviewed-by: Ira Weiny --- drivers/cxl/core/core.h | 7 +++++++ drivers/cxl/core/memdev.c | 44 --------------------------------------- drivers/cxl/core/region.c | 44 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 44 deletions(-) diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index bc5a95665aa0..87008505f8a9 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -27,7 +27,14 @@ void cxl_decoder_kill_region(struct cxl_endpoint_decoder *cxled); int cxl_region_init(void); void cxl_region_exit(void); int cxl_get_poison_by_endpoint(struct cxl_port *port); +struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa); + #else +static inline +struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) +{ + return NULL; +} static inline int cxl_get_poison_by_endpoint(struct cxl_port *port) { return 0; diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c index d4e259f3a7e9..0277726afd04 100644 --- a/drivers/cxl/core/memdev.c +++ b/drivers/cxl/core/memdev.c @@ -251,50 +251,6 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd) } EXPORT_SYMBOL_NS_GPL(cxl_trigger_poison_list, CXL); -struct cxl_dpa_to_region_context { - struct cxl_region *cxlr; - u64 dpa; -}; - -static int __cxl_dpa_to_region(struct device *dev, void *arg) -{ - struct cxl_dpa_to_region_context *ctx = arg; - struct cxl_endpoint_decoder *cxled; - u64 dpa = ctx->dpa; - - if (!is_endpoint_decoder(dev)) - return 0; - - cxled = to_cxl_endpoint_decoder(dev); - if (!cxled->dpa_res || !resource_size(cxled->dpa_res)) - return 0; - - if (dpa > cxled->dpa_res->end || dpa < cxled->dpa_res->start) - return 0; - - dev_dbg(dev, "dpa:0x%llx mapped in region:%s\n", dpa, - dev_name(&cxled->cxld.region->dev)); - - ctx->cxlr = cxled->cxld.region; - - return 1; -} - -static struct cxl_region *cxl_dpa_to_region(struct cxl_memdev *cxlmd, u64 dpa) -{ - struct cxl_dpa_to_region_context ctx; - struct cxl_port *port; - - ctx = (struct cxl_dpa_to_region_context) { - .dpa = dpa, - }; - port = cxlmd->endpoint; - if (port && is_cxl_endpoint(port) && cxl_num_decoders_committed(port)) - device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region); - - return ctx.cxlr; -} - static int cxl_validate_poison_dpa(struct cxl_memdev *cxlmd, u64 dpa) { struct cxl_dev_state *cxlds = cxlmd->cxlds; diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 5c186e0a39b9..4b227659e3f8 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2679,6 +2679,50 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port) return rc; } +struct cxl_dpa_to_region_context { + struct cxl_region *cxlr; + u64 dpa; +}; + +static int __cxl_dpa_to_region(struct device *dev, void *arg) +{ + struct cxl_dpa_to_region_context *ctx = arg; + struct cxl_endpoint_decoder *cxled; + u64 dpa = ctx->dpa; + + if (!is_endpoint_decoder(dev)) + return 0; + + cxled = to_cxl_endpoint_decoder(dev); + if (!cxled->dpa_res || !resource_size(cxled->dpa_res)) + return 0; + + if (dpa > cxled->dpa_res->end || dpa < cxled->dpa_res->start) + return 0; + + dev_dbg(dev, "dpa:0x%llx mapped in region:%s\n", dpa, + dev_name(&cxled->cxld.region->dev)); + + ctx->cxlr = cxled->cxld.region; + + return 1; +} + +struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) +{ + struct cxl_dpa_to_region_context ctx; + struct cxl_port *port; + + ctx = (struct cxl_dpa_to_region_context) { + .dpa = dpa, + }; + port = cxlmd->endpoint; + if (port && is_cxl_endpoint(port) && cxl_num_decoders_committed(port)) + device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region); + + return ctx.cxlr; +} + static struct lock_class_key cxl_pmem_region_key; static struct cxl_pmem_region *cxl_pmem_region_alloc(struct cxl_region *cxlr) From patchwork Tue Apr 23 03:48:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alison Schofield X-Patchwork-Id: 13639291 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 885FB1CABA for ; Tue, 23 Apr 2024 03:48:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713844094; cv=none; b=jUjnnpxJSEZ6eOZQ1YKpForKEO1EqzulhJhy/pfyNr1yOiYgf+i6936sDMqxhjrkyIzlxCd9HN6xWbnb5xIxnJpmH50rRs83BTDSk8XWdruib7a7nIPj4NqTzQJAuzKzCrsgb41BHIXuwMdSlkiwA+eVvdz6Y2/GxG1ngzNR214= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713844094; c=relaxed/simple; bh=yPYnKclMREVRLLUt2xYrlcYrMI1HGouYO5TgD/9AZYU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=n3ojjxEm1pAeIRLRCFeWRcDoa+eJxfoozeXxXSHSW95BzWG3FDf0lXqRtMEwRs8BX7cotuWwWojF/Fqk3Ht1Rt7aaBHvCpxDv1XMmTERKvADI181po7QqBt9cQLsQigqZkWzBZQtYwg4a09SWFX93Y5+Q/lTogM9XX3GFN3r9Ig= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=GTzwBKyw; arc=none smtp.client-ip=192.198.163.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="GTzwBKyw" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1713844092; x=1745380092; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=yPYnKclMREVRLLUt2xYrlcYrMI1HGouYO5TgD/9AZYU=; b=GTzwBKywbQfPL5/iNEbSFvef2ldSt6s7HBcXfkTMug1YCb0Of0BSVkKv 6oijnVUJOBM/qWOfWyz6r+kUjmC3PnoElK5Qk9VgXD4L2t/SaqQYIvECX Wm+KvnhtRnMsjmroiAt/eeZdjDBmsArdOteqKCLIbM6xXdmFN+uN68yS2 TU6J5JFF6xndK0gWUkJS2ihcVUHQb+jyxOSoQ7ZLg93cyxzhlVuOAjPxS /FmOa58oVtgb5mVxrydeuLGl/ydpPPVuA5Y8ep8o5GdecG+qL4b26ls3a X0RlFQOLMpNIPm2k4pTAZg3d2qfRl6oWUmy7auTh3UL93XiL4yQNlKPyc Q==; X-CSE-ConnectionGUID: Z8G06JKUQf25lCDB3okOCg== X-CSE-MsgGUID: p3SiSOL6QSuUGPma4RvCJA== X-IronPort-AV: E=McAfee;i="6600,9927,11052"; a="26925893" X-IronPort-AV: E=Sophos;i="6.07,222,1708416000"; d="scan'208";a="26925893" Received: from orviesa003.jf.intel.com ([10.64.159.143]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Apr 2024 20:48:10 -0700 X-CSE-ConnectionGUID: 7UJHRm/eTW+FcWS9sy13lg== X-CSE-MsgGUID: RFVzn4FiSWGHeuCL6MkYcg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,222,1708416000"; d="scan'208";a="28884703" Received: from aschofie-mobl2.amr.corp.intel.com (HELO localhost) ([10.209.73.120]) by ORVIESA003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Apr 2024 20:48:10 -0700 From: alison.schofield@intel.com To: Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , Vishal Verma , Ira Weiny , Dan Williams Cc: linux-cxl@vger.kernel.org, Steven Rostedt , Jonathan Cameron Subject: [PATCH v2 2/4] cxl/region: Move cxl_trace_hpa() work to the region driver Date: Mon, 22 Apr 2024 20:48:04 -0700 Message-Id: <9a7b3700f9ab84d7d0ea087b7e212c63850e41f9.1713842838.git.alison.schofield@intel.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-cxl@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Alison Schofield This work belongs in the region driver as it is only useful with CONFIG_CXL_REGION. Add a stub in core.h for when the region driver is not built. Reviewed-by: Jonathan Cameron Reviewed-by: Ira Weiny Signed-off-by: Alison Schofield --- drivers/cxl/core/core.h | 7 +++ drivers/cxl/core/region.c | 91 +++++++++++++++++++++++++++++++++++++++ drivers/cxl/core/trace.c | 91 --------------------------------------- drivers/cxl/core/trace.h | 2 - 4 files changed, 98 insertions(+), 93 deletions(-) diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 87008505f8a9..625394486459 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -28,8 +28,15 @@ int cxl_region_init(void); void cxl_region_exit(void); int cxl_get_poison_by_endpoint(struct cxl_port *port); struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa); +u64 cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, + u64 dpa); #else +static inline u64 +cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa) +{ + return ULLONG_MAX; +} static inline struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) { diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 4b227659e3f8..45eb9c560fd6 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2723,6 +2723,97 @@ struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) return ctx.cxlr; } +static bool cxl_is_hpa_in_range(u64 hpa, struct cxl_region *cxlr, int pos) +{ + struct cxl_region_params *p = &cxlr->params; + int gran = p->interleave_granularity; + int ways = p->interleave_ways; + u64 offset; + + /* Is the hpa within this region at all */ + if (hpa < p->res->start || hpa > p->res->end) { + dev_dbg(&cxlr->dev, + "Addr trans fail: hpa 0x%llx not in region\n", hpa); + return false; + } + + /* Is the hpa in an expected chunk for its pos(-ition) */ + offset = hpa - p->res->start; + offset = do_div(offset, gran * ways); + if ((offset >= pos * gran) && (offset < (pos + 1) * gran)) + return true; + + dev_dbg(&cxlr->dev, + "Addr trans fail: hpa 0x%llx not in expected chunk\n", hpa); + + return false; +} + +static u64 cxl_dpa_to_hpa(u64 dpa, struct cxl_region *cxlr, + struct cxl_endpoint_decoder *cxled) +{ + u64 dpa_offset, hpa_offset, bits_upper, mask_upper, hpa; + struct cxl_region_params *p = &cxlr->params; + int pos = cxled->pos; + u16 eig = 0; + u8 eiw = 0; + + ways_to_eiw(p->interleave_ways, &eiw); + granularity_to_eig(p->interleave_granularity, &eig); + + /* + * The device position in the region interleave set was removed + * from the offset at HPA->DPA translation. To reconstruct the + * HPA, place the 'pos' in the offset. + * + * The placement of 'pos' in the HPA is determined by interleave + * ways and granularity and is defined in the CXL Spec 3.0 Section + * 8.2.4.19.13 Implementation Note: Device Decode Logic + */ + + /* Remove the dpa base */ + dpa_offset = dpa - cxl_dpa_resource_start(cxled); + + mask_upper = GENMASK_ULL(51, eig + 8); + + if (eiw < 8) { + hpa_offset = (dpa_offset & mask_upper) << eiw; + hpa_offset |= pos << (eig + 8); + } else { + bits_upper = (dpa_offset & mask_upper) >> (eig + 8); + bits_upper = bits_upper * 3; + hpa_offset = ((bits_upper << (eiw - 8)) + pos) << (eig + 8); + } + + /* The lower bits remain unchanged */ + hpa_offset |= dpa_offset & GENMASK_ULL(eig + 7, 0); + + /* Apply the hpa_offset to the region base address */ + hpa = hpa_offset + p->res->start; + + if (!cxl_is_hpa_in_range(hpa, cxlr, cxled->pos)) + return ULLONG_MAX; + + return hpa; +} + +u64 cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, + u64 dpa) +{ + struct cxl_region_params *p = &cxlr->params; + struct cxl_endpoint_decoder *cxled = NULL; + + for (int i = 0; i < p->nr_targets; i++) { + cxled = p->targets[i]; + if (cxlmd == cxled_to_memdev(cxled)) + break; + } + if (!cxled || cxlmd != cxled_to_memdev(cxled)) + return ULLONG_MAX; + + return cxl_dpa_to_hpa(dpa, cxlr, cxled); +} + static struct lock_class_key cxl_pmem_region_key; static struct cxl_pmem_region *cxl_pmem_region_alloc(struct cxl_region *cxlr) diff --git a/drivers/cxl/core/trace.c b/drivers/cxl/core/trace.c index d0403dc3c8ab..7f2a9dd0d0e3 100644 --- a/drivers/cxl/core/trace.c +++ b/drivers/cxl/core/trace.c @@ -6,94 +6,3 @@ #define CREATE_TRACE_POINTS #include "trace.h" - -static bool cxl_is_hpa_in_range(u64 hpa, struct cxl_region *cxlr, int pos) -{ - struct cxl_region_params *p = &cxlr->params; - int gran = p->interleave_granularity; - int ways = p->interleave_ways; - u64 offset; - - /* Is the hpa within this region at all */ - if (hpa < p->res->start || hpa > p->res->end) { - dev_dbg(&cxlr->dev, - "Addr trans fail: hpa 0x%llx not in region\n", hpa); - return false; - } - - /* Is the hpa in an expected chunk for its pos(-ition) */ - offset = hpa - p->res->start; - offset = do_div(offset, gran * ways); - if ((offset >= pos * gran) && (offset < (pos + 1) * gran)) - return true; - - dev_dbg(&cxlr->dev, - "Addr trans fail: hpa 0x%llx not in expected chunk\n", hpa); - - return false; -} - -static u64 cxl_dpa_to_hpa(u64 dpa, struct cxl_region *cxlr, - struct cxl_endpoint_decoder *cxled) -{ - u64 dpa_offset, hpa_offset, bits_upper, mask_upper, hpa; - struct cxl_region_params *p = &cxlr->params; - int pos = cxled->pos; - u16 eig = 0; - u8 eiw = 0; - - ways_to_eiw(p->interleave_ways, &eiw); - granularity_to_eig(p->interleave_granularity, &eig); - - /* - * The device position in the region interleave set was removed - * from the offset at HPA->DPA translation. To reconstruct the - * HPA, place the 'pos' in the offset. - * - * The placement of 'pos' in the HPA is determined by interleave - * ways and granularity and is defined in the CXL Spec 3.0 Section - * 8.2.4.19.13 Implementation Note: Device Decode Logic - */ - - /* Remove the dpa base */ - dpa_offset = dpa - cxl_dpa_resource_start(cxled); - - mask_upper = GENMASK_ULL(51, eig + 8); - - if (eiw < 8) { - hpa_offset = (dpa_offset & mask_upper) << eiw; - hpa_offset |= pos << (eig + 8); - } else { - bits_upper = (dpa_offset & mask_upper) >> (eig + 8); - bits_upper = bits_upper * 3; - hpa_offset = ((bits_upper << (eiw - 8)) + pos) << (eig + 8); - } - - /* The lower bits remain unchanged */ - hpa_offset |= dpa_offset & GENMASK_ULL(eig + 7, 0); - - /* Apply the hpa_offset to the region base address */ - hpa = hpa_offset + p->res->start; - - if (!cxl_is_hpa_in_range(hpa, cxlr, cxled->pos)) - return ULLONG_MAX; - - return hpa; -} - -u64 cxl_trace_hpa(struct cxl_region *cxlr, struct cxl_memdev *cxlmd, - u64 dpa) -{ - struct cxl_region_params *p = &cxlr->params; - struct cxl_endpoint_decoder *cxled = NULL; - - for (int i = 0; i < p->nr_targets; i++) { - cxled = p->targets[i]; - if (cxlmd == cxled_to_memdev(cxled)) - break; - } - if (!cxled || cxlmd != cxled_to_memdev(cxled)) - return ULLONG_MAX; - - return cxl_dpa_to_hpa(dpa, cxlr, cxled); -} diff --git a/drivers/cxl/core/trace.h b/drivers/cxl/core/trace.h index e5f13260fc52..161bdb5734b0 100644 --- a/drivers/cxl/core/trace.h +++ b/drivers/cxl/core/trace.h @@ -642,8 +642,6 @@ TRACE_EVENT(cxl_memory_module, #define cxl_poison_overflow(flags, time) \ (flags & CXL_POISON_FLAG_OVERFLOW ? le64_to_cpu(time) : 0) -u64 cxl_trace_hpa(struct cxl_region *cxlr, struct cxl_memdev *memdev, u64 dpa); - TRACE_EVENT(cxl_poison, TP_PROTO(struct cxl_memdev *cxlmd, struct cxl_region *cxlr, From patchwork Tue Apr 23 03:48:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alison Schofield X-Patchwork-Id: 13639292 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D50D71C687 for ; Tue, 23 Apr 2024 03:48:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713844094; cv=none; b=sSf8/GyCIbinkG4Grze9eNbH3XBvbLN8cBl1hOBhYBk1Tz5LqSKPL1ZTfFtLH4XN095xfbuW74c2DXcBJOMbLcGgLGoq+0reOvIVA7xaUsEIJpWPJmK5JWzixM4/z4Sy0Im3DayuLQKBzoGGD3uchF8/uFskoSRZVNfp12gLSGs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713844094; c=relaxed/simple; bh=Pc5feEYKcNb02XEg051Cu+r+KgAQ7eV6ik2KQhwtbpM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tDHcGE37c8ZmkmD3ArscUxtzuaKO6UGmfPxxYOv85wE+AjguLe7Y7+MdGyl3BIumZ0v3uoY/GhdxY6z6lFIfWzVmmBOG4qYzwA8FZsOkLrNkGK6AA1M+npR8MF3gSbjB0msex+rrrZAtf7lhlZlWlgl2RYs8Smfp/Tp6n1KWErw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=mfUH5wIw; arc=none smtp.client-ip=192.198.163.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="mfUH5wIw" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1713844093; x=1745380093; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Pc5feEYKcNb02XEg051Cu+r+KgAQ7eV6ik2KQhwtbpM=; b=mfUH5wIwPxmRH0z/PFP4tfaXc/fmMIVGs1mgOr/8urp+veCEImJS8GNA AsVNZEgxsM0X+rSzZTyTaBNzsrK8x9TcnXAbE6VQnpAcMHiJQwJdrZqwf bzNE5q7d9qLAUL9o8HHPL6bQ7w5RjS5OybmgZdBT5IhPZOg9hQ0o+okqb fAI6V0Qs85b4eociIva7tY9+2RKg9UWpN0S2c9zw0+fDfsyOrdNzSwRhp 6pitwBL2KLXUdkUk5ikRNctoNfsAB/p4PyKU3sCjSMYLYePJluMJQDK9q MnLfM/8qDHUYomrq4MLOK9rVFKMO4sZlP3FD/BfSg/t4hPUbi46pEYElP w==; X-CSE-ConnectionGUID: zNstFMgwQHuN28laqr1vlA== X-CSE-MsgGUID: qJFBvu+EQRStj6ZRvPRjXQ== X-IronPort-AV: E=McAfee;i="6600,9927,11052"; a="26925899" X-IronPort-AV: E=Sophos;i="6.07,222,1708416000"; d="scan'208";a="26925899" Received: from orviesa003.jf.intel.com ([10.64.159.143]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Apr 2024 20:48:11 -0700 X-CSE-ConnectionGUID: dTGt7U+PQqytymIkhfIrtA== X-CSE-MsgGUID: oI7pF/91SXCYOwDaPYr6dg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,222,1708416000"; d="scan'208";a="28884706" Received: from aschofie-mobl2.amr.corp.intel.com (HELO localhost) ([10.209.73.120]) by ORVIESA003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Apr 2024 20:48:11 -0700 From: alison.schofield@intel.com To: Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , Vishal Verma , Ira Weiny , Dan Williams Cc: linux-cxl@vger.kernel.org, Steven Rostedt , Jonathan Cameron Subject: [PATCH v2 3/4] cxl/core: Add region info to cxl_general_media and cxl_dram events Date: Mon, 22 Apr 2024 20:48:05 -0700 Message-Id: <800328a3fdffa0f3ece709be337bd64a07089bff.1713842838.git.alison.schofield@intel.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-cxl@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Alison Schofield User space may need to know which region, if any, maps the DPAs (device physical addresses) reported in a cxl_general_media or cxl_dram event. Since the mapping can change, the kernel provides this information at the time the event occurs. This informs user space that at event this mapped this to this . Add the same region info that is included in the cxl_poison trace event: the DPA->HPA translation, region name, and region uuid. Introduce and use new helpers that lookup that region info using the struct cxl_memdev and a DPA. The new fields are inserted in the trace event and no existing fields are modified. If the DPA is not mapped, user will see: hpa=ULLONG_MAX, region="", and uuid=0 This work must be protected by dpa_rwsem & region_rwsem since it is looking up region mappings. Signed-off-by: Alison Schofield Reviewed-by: Jonathan Cameron Reviewed-by: Ira Weiny --- drivers/cxl/core/core.h | 6 +++++ drivers/cxl/core/mbox.c | 17 ++++++++++--- drivers/cxl/core/region.c | 8 ++++++ drivers/cxl/core/trace.h | 52 +++++++++++++++++++++++++++++++++++---- 4 files changed, 74 insertions(+), 9 deletions(-) diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 625394486459..2fd8d9797f36 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -30,8 +30,14 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port); struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa); u64 cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa); +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa); #else +static inline +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa) +{ + return ""; +} static inline u64 cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa) { diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c index 9adda4795eb7..3c1c37d5fcb0 100644 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@ -842,14 +842,23 @@ void cxl_event_trace_record(const struct cxl_memdev *cxlmd, enum cxl_event_type event_type, const uuid_t *uuid, union cxl_event *evt) { + if (event_type == CXL_CPER_EVENT_MEM_MODULE) { + trace_cxl_memory_module(cxlmd, type, &evt->mem_module); + return; + } + if (event_type == CXL_CPER_EVENT_GENERIC) { + trace_cxl_generic_event(cxlmd, type, uuid, &evt->generic); + return; + } + + /* Protect trace events that do DPA->HPA translations */ + guard(rwsem_read)(&cxl_region_rwsem); + guard(rwsem_read)(&cxl_dpa_rwsem); + if (event_type == CXL_CPER_EVENT_GEN_MEDIA) trace_cxl_general_media(cxlmd, type, &evt->gen_media); else if (event_type == CXL_CPER_EVENT_DRAM) trace_cxl_dram(cxlmd, type, &evt->dram); - else if (event_type == CXL_CPER_EVENT_MEM_MODULE) - trace_cxl_memory_module(cxlmd, type, &evt->mem_module); - else - trace_cxl_generic_event(cxlmd, type, uuid, &evt->generic); } EXPORT_SYMBOL_NS_GPL(cxl_event_trace_record, CXL); diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 45eb9c560fd6..a5b1eaee1e58 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2723,6 +2723,14 @@ struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) return ctx.cxlr; } +const char *cxl_trace_to_region_name(const struct cxl_memdev *cxlmd, u64 dpa) +{ + struct cxl_region *cxlr = cxl_dpa_to_region(cxlmd, dpa); + + /* trace __string() assignment requires "", not NULL */ + return cxlr ? dev_name(&cxlr->dev) : ""; +} + static bool cxl_is_hpa_in_range(u64 hpa, struct cxl_region *cxlr, int pos) { struct cxl_region_params *p = &cxlr->params; diff --git a/drivers/cxl/core/trace.h b/drivers/cxl/core/trace.h index 161bdb5734b0..2e24364b2b8d 100644 --- a/drivers/cxl/core/trace.h +++ b/drivers/cxl/core/trace.h @@ -14,6 +14,28 @@ #include #include "core.h" +#ifndef __CXL_EVENTS_DECLARE_ONCE_ONLY +#define __CXL_EVENTS_DECLARE_ONCE_ONLY +static inline +void store_region_info(const struct cxl_memdev *cxlmd, u64 dpa, uuid_t *uuid, + u64 *hpa) +{ + struct cxl_region *cxlr; + + cxlr = cxl_dpa_to_region(cxlmd, dpa); + if (cxlr) { + uuid_copy(uuid, &cxlr->params.uuid); + *hpa = cxl_trace_hpa(cxlr, cxlmd, dpa); + } else { + uuid_copy(uuid, &uuid_null); + *hpa = ULLONG_MAX; + } +} +#endif /* __CXL_EVENTS_DECLARE_ONCE_ONLY */ + +#define rec_pa_to_dpa(record) \ + (le64_to_cpu(rec->phys_addr) & CXL_DPA_MASK) + #define CXL_RAS_UC_CACHE_DATA_PARITY BIT(0) #define CXL_RAS_UC_CACHE_ADDR_PARITY BIT(1) #define CXL_RAS_UC_CACHE_BE_PARITY BIT(2) @@ -330,10 +352,14 @@ TRACE_EVENT(cxl_general_media, __field(u8, channel) __field(u32, device) __array(u8, comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE) - __field(u16, validity_flags) /* Following are out of order to pack trace record */ + __field(u64, hpa) + __field_struct(uuid_t, region_uuid) + __field(u16, validity_flags) __field(u8, rank) __field(u8, dpa_flags) + __string(region_name, + cxl_trace_to_region_name(cxlmd, rec_pa_to_dpa(record))) ), TP_fast_assign( @@ -354,18 +380,24 @@ TRACE_EVENT(cxl_general_media, memcpy(__entry->comp_id, &rec->component_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE); __entry->validity_flags = get_unaligned_le16(&rec->validity_flags); + __assign_str(region_name, + cxl_trace_to_region_name(cxlmd, __entry->dpa)); + store_region_info(cxlmd, __entry->dpa, &__entry->region_uuid, + &__entry->hpa); ), CXL_EVT_TP_printk("dpa=%llx dpa_flags='%s' " \ "descriptor='%s' type='%s' transaction_type='%s' channel=%u rank=%u " \ - "device=%x comp_id=%s validity_flags='%s'", + "device=%x comp_id=%s validity_flags='%s' " \ + "hpa=%llx region=%s region_uuid=%pUb", __entry->dpa, show_dpa_flags(__entry->dpa_flags), show_event_desc_flags(__entry->descriptor), show_mem_event_type(__entry->type), show_trans_type(__entry->transaction_type), __entry->channel, __entry->rank, __entry->device, __print_hex(__entry->comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE), - show_valid_flags(__entry->validity_flags) + show_valid_flags(__entry->validity_flags), + __entry->hpa, __get_str(region_name), &__entry->region_uuid ) ); @@ -417,10 +449,14 @@ TRACE_EVENT(cxl_dram, __field(u32, nibble_mask) __field(u32, row) __array(u8, cor_mask, CXL_EVENT_DER_CORRECTION_MASK_SIZE) + __field(u64, hpa) + __field_struct(uuid_t, region_uuid) __field(u8, rank) /* Out of order to pack trace record */ __field(u8, bank_group) /* Out of order to pack trace record */ __field(u8, bank) /* Out of order to pack trace record */ __field(u8, dpa_flags) /* Out of order to pack trace record */ + __string(region_name, + cxl_trace_to_region_name(cxlmd, rec_pa_to_dpa(record))) ), TP_fast_assign( @@ -444,12 +480,17 @@ TRACE_EVENT(cxl_dram, __entry->column = get_unaligned_le16(rec->column); memcpy(__entry->cor_mask, &rec->correction_mask, CXL_EVENT_DER_CORRECTION_MASK_SIZE); + __assign_str(region_name, + cxl_trace_to_region_name(cxlmd, __entry->dpa)); + store_region_info(cxlmd, __entry->dpa, &__entry->region_uuid, + &__entry->hpa); ), CXL_EVT_TP_printk("dpa=%llx dpa_flags='%s' descriptor='%s' type='%s' " \ "transaction_type='%s' channel=%u rank=%u nibble_mask=%x " \ "bank_group=%u bank=%u row=%u column=%u cor_mask=%s " \ - "validity_flags='%s'", + "validity_flags='%s' " \ + "hpa=%llx region=%s region_uuid=%pUb", __entry->dpa, show_dpa_flags(__entry->dpa_flags), show_event_desc_flags(__entry->descriptor), show_mem_event_type(__entry->type), @@ -458,7 +499,8 @@ TRACE_EVENT(cxl_dram, __entry->bank_group, __entry->bank, __entry->row, __entry->column, __print_hex(__entry->cor_mask, CXL_EVENT_DER_CORRECTION_MASK_SIZE), - show_dram_valid_flags(__entry->validity_flags) + show_dram_valid_flags(__entry->validity_flags), + __entry->hpa, __get_str(region_name), &__entry->region_uuid ) ); From patchwork Tue Apr 23 03:48:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alison Schofield X-Patchwork-Id: 13639293 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AD0FD1CFBD for ; Tue, 23 Apr 2024 03:48:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713844095; cv=none; b=VkPssZcwFJ087OFel0JgLKWoNdGbTppTeKXditJWzGa2A+8GmkXNUKEhXwmfprvdsa/pqdfJOAhMWsDfKXrNPj9/B7plztAbzgn8Fqlmrz1g4OgDo2HLBa788mnZwSZci+rhWL6o9DyyVmgqqI9mn+Q/J9l9Du7kwwS66bx1GKU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713844095; c=relaxed/simple; bh=Bm21AZGUnvoLbfmQ36OgN3ggg0k1mdJr8Pu9OGlBCRU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Tp+1kAPmwENhj1pQEMO/K+gz4Ah22b+noFa4AAOkMRuTk2VupiPxZmuwyDfKKGwEkAXr7CjFu3Pnym2KHd9CguYRhX7GEHzFmiSitnu7n7vam864/QgYDFSGvjycF8ueNVN07k22tsICb7lPI+BCeuukCjenE2sSLGvYnEJEtHc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=LVjMfRNi; arc=none smtp.client-ip=192.198.163.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="LVjMfRNi" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1713844093; x=1745380093; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Bm21AZGUnvoLbfmQ36OgN3ggg0k1mdJr8Pu9OGlBCRU=; b=LVjMfRNisTgQF4aJecP+WIRt0iSsVbxIWme+MnXKKmYb04bPF0g4Tt/p w+YnzoR2+N3g17bxvTS8PhEIMUyhhU4CMn0Wi5OrRonD0wwGtDikbo7Vc VMYYYjPVYSTjv8qWz27VEvFJg4Ft21W8ZPpmySshf7Rkw762ELAApwFVx 0Br9AhUxx0h5UDhZL7jmxMlY9lrd1hK+pwMF7XifWMhUxRxRtQ4Tk2q/6 pkCpNOqTvb7JapV5OI3ibjwmmAYeSu7TJ7c9J6XPKy6Yk6xaadpgiXD9x PvgvGrvLX4Ui3qLip5WYBE6BxK6OSpHbn0hnalCKmol7SpAm/TMOYrTPh A==; X-CSE-ConnectionGUID: q6P+j6C5QZed7G9SF8GwwA== X-CSE-MsgGUID: +o1IaVsdTiGZA8PjKU5HnQ== X-IronPort-AV: E=McAfee;i="6600,9927,11052"; a="26925902" X-IronPort-AV: E=Sophos;i="6.07,222,1708416000"; d="scan'208";a="26925902" Received: from orviesa003.jf.intel.com ([10.64.159.143]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Apr 2024 20:48:12 -0700 X-CSE-ConnectionGUID: vG+sPtqpT9ecP4BKEDukbQ== X-CSE-MsgGUID: 1NfrmRRlSIOvDOVfU6C95w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,222,1708416000"; d="scan'208";a="28884711" Received: from aschofie-mobl2.amr.corp.intel.com (HELO localhost) ([10.209.73.120]) by ORVIESA003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Apr 2024 20:48:11 -0700 From: alison.schofield@intel.com To: Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , Vishal Verma , Ira Weiny , Dan Williams Cc: linux-cxl@vger.kernel.org, Steven Rostedt , Jonathan Cameron Subject: [PATCH v2 4/4] cxl/core: Remove cxlr dependency from cxl_poison trace events Date: Mon, 22 Apr 2024 20:48:06 -0700 Message-Id: <9a125b4bbf6556b9dda5727a4fad3e7ab25a1e1a.1713842838.git.alison.schofield@intel.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-cxl@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Alison Schofield cxl_poison trace events pass a pointer to a struct cxl_region when poison is discovered in a mapped endpoint. This made for easy look up of region name, uuid, and was useful in starting the dpa->hpa translation. Another set of trace helpers is now available that eliminates the need to pass on that cxlr. (It was passed along a lot!) In addition to tidying up the cxl_poison calling path, shifting to the new helpers also means all CXL trace events will share the same code in that regard. Switch from a uuid array to the field_struct type uuid_t to align on one uuid format in all CXL trace events. That is useful when sharing region uuid lookup helpers. No externally visible naming changes are made to cxl_poison trace events. Signed-off-by: Alison Schofield Reviewed-by: Jonathan Cameron Reviewed-by: Ira Weiny --- drivers/cxl/core/mbox.c | 5 ++--- drivers/cxl/core/memdev.c | 8 ++++---- drivers/cxl/core/region.c | 8 ++++---- drivers/cxl/core/trace.h | 27 +++++++++++---------------- drivers/cxl/cxlmem.h | 3 +-- 5 files changed, 22 insertions(+), 29 deletions(-) diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c index 3c1c37d5fcb0..60a51ea3ff25 100644 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@ -1299,8 +1299,7 @@ int cxl_set_timestamp(struct cxl_memdev_state *mds) } EXPORT_SYMBOL_NS_GPL(cxl_set_timestamp, CXL); -int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len, - struct cxl_region *cxlr) +int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len) { struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); struct cxl_mbox_poison_out *po; @@ -1332,7 +1331,7 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len, break; for (int i = 0; i < le16_to_cpu(po->count); i++) - trace_cxl_poison(cxlmd, cxlr, &po->record[i], + trace_cxl_poison(cxlmd, &po->record[i], po->flags, po->overflow_ts, CXL_POISON_TRACE_LIST); diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c index 0277726afd04..1a0b596da7b6 100644 --- a/drivers/cxl/core/memdev.c +++ b/drivers/cxl/core/memdev.c @@ -200,14 +200,14 @@ static int cxl_get_poison_by_memdev(struct cxl_memdev *cxlmd) if (resource_size(&cxlds->pmem_res)) { offset = cxlds->pmem_res.start; length = resource_size(&cxlds->pmem_res); - rc = cxl_mem_get_poison(cxlmd, offset, length, NULL); + rc = cxl_mem_get_poison(cxlmd, offset, length); if (rc) return rc; } if (resource_size(&cxlds->ram_res)) { offset = cxlds->ram_res.start; length = resource_size(&cxlds->ram_res); - rc = cxl_mem_get_poison(cxlmd, offset, length, NULL); + rc = cxl_mem_get_poison(cxlmd, offset, length); /* * Invalid Physical Address is not an error for * volatile addresses. Device support is optional. @@ -321,7 +321,7 @@ int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa) .address = cpu_to_le64(dpa), .length = cpu_to_le32(1), }; - trace_cxl_poison(cxlmd, cxlr, &record, 0, 0, CXL_POISON_TRACE_INJECT); + trace_cxl_poison(cxlmd, &record, 0, 0, CXL_POISON_TRACE_INJECT); out: up_read(&cxl_dpa_rwsem); up_read(&cxl_region_rwsem); @@ -385,7 +385,7 @@ int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa) .address = cpu_to_le64(dpa), .length = cpu_to_le32(1), }; - trace_cxl_poison(cxlmd, cxlr, &record, 0, 0, CXL_POISON_TRACE_CLEAR); + trace_cxl_poison(cxlmd, &record, 0, 0, CXL_POISON_TRACE_CLEAR); out: up_read(&cxl_dpa_rwsem); up_read(&cxl_region_rwsem); diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index a5b1eaee1e58..8cd057fc212c 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2585,7 +2585,7 @@ static int cxl_get_poison_unmapped(struct cxl_memdev *cxlmd, if (ctx->mode == CXL_DECODER_RAM) { offset = ctx->offset; length = resource_size(&cxlds->ram_res) - offset; - rc = cxl_mem_get_poison(cxlmd, offset, length, NULL); + rc = cxl_mem_get_poison(cxlmd, offset, length); if (rc == -EFAULT) rc = 0; if (rc) @@ -2603,7 +2603,7 @@ static int cxl_get_poison_unmapped(struct cxl_memdev *cxlmd, return 0; } - return cxl_mem_get_poison(cxlmd, offset, length, NULL); + return cxl_mem_get_poison(cxlmd, offset, length); } static int poison_by_decoder(struct device *dev, void *arg) @@ -2637,7 +2637,7 @@ static int poison_by_decoder(struct device *dev, void *arg) if (cxled->skip) { offset = cxled->dpa_res->start - cxled->skip; length = cxled->skip; - rc = cxl_mem_get_poison(cxlmd, offset, length, NULL); + rc = cxl_mem_get_poison(cxlmd, offset, length); if (rc == -EFAULT && cxled->mode == CXL_DECODER_RAM) rc = 0; if (rc) @@ -2646,7 +2646,7 @@ static int poison_by_decoder(struct device *dev, void *arg) offset = cxled->dpa_res->start; length = cxled->dpa_res->end - offset + 1; - rc = cxl_mem_get_poison(cxlmd, offset, length, cxled->cxld.region); + rc = cxl_mem_get_poison(cxlmd, offset, length); if (rc == -EFAULT && cxled->mode == CXL_DECODER_RAM) rc = 0; if (rc) diff --git a/drivers/cxl/core/trace.h b/drivers/cxl/core/trace.h index 2e24364b2b8d..1cfdd1558e6c 100644 --- a/drivers/cxl/core/trace.h +++ b/drivers/cxl/core/trace.h @@ -686,23 +686,24 @@ TRACE_EVENT(cxl_memory_module, TRACE_EVENT(cxl_poison, - TP_PROTO(struct cxl_memdev *cxlmd, struct cxl_region *cxlr, + TP_PROTO(const struct cxl_memdev *cxlmd, const struct cxl_poison_record *record, u8 flags, __le64 overflow_ts, enum cxl_poison_trace_type trace_type), - TP_ARGS(cxlmd, cxlr, record, flags, overflow_ts, trace_type), + TP_ARGS(cxlmd, record, flags, overflow_ts, trace_type), TP_STRUCT__entry( __string(memdev, dev_name(&cxlmd->dev)) __string(host, dev_name(cxlmd->dev.parent)) __field(u64, serial) __field(u8, trace_type) - __string(region, cxlr ? dev_name(&cxlr->dev) : "") + __string(region, + cxl_trace_to_region_name(cxlmd, cxl_poison_record_dpa(record))) __field(u64, overflow_ts) __field(u64, hpa) __field(u64, dpa) __field(u32, dpa_length) - __array(char, uuid, 16) + __field_struct(uuid_t, uuid) __field(u8, source) __field(u8, flags) ), @@ -717,27 +718,21 @@ TRACE_EVENT(cxl_poison, __entry->source = cxl_poison_record_source(record); __entry->trace_type = trace_type; __entry->flags = flags; - if (cxlr) { - __assign_str(region, dev_name(&cxlr->dev)); - memcpy(__entry->uuid, &cxlr->params.uuid, 16); - __entry->hpa = cxl_trace_hpa(cxlr, cxlmd, - __entry->dpa); - } else { - __assign_str(region, ""); - memset(__entry->uuid, 0, 16); - __entry->hpa = ULLONG_MAX; - } + __assign_str(region, + cxl_trace_to_region_name(cxlmd, __entry->dpa)); + store_region_info(cxlmd, __entry->dpa, &__entry->uuid, + &__entry->hpa); ), TP_printk("memdev=%s host=%s serial=%lld trace_type=%s region=%s " \ - "region_uuid=%pU hpa=0x%llx dpa=0x%llx dpa_length=0x%x " \ + "region_uuid=%pUb hpa=0x%llx dpa=0x%llx dpa_length=0x%x " \ "source=%s flags=%s overflow_time=%llu", __get_str(memdev), __get_str(host), __entry->serial, show_poison_trace_type(__entry->trace_type), __get_str(region), - __entry->uuid, + &__entry->uuid, __entry->hpa, __entry->dpa, __entry->dpa_length, diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h index 20fb3b35e89e..a733b31b7799 100644 --- a/drivers/cxl/cxlmem.h +++ b/drivers/cxl/cxlmem.h @@ -828,8 +828,7 @@ void cxl_event_trace_record(const struct cxl_memdev *cxlmd, const uuid_t *uuid, union cxl_event *evt); int cxl_set_timestamp(struct cxl_memdev_state *mds); int cxl_poison_state_init(struct cxl_memdev_state *mds); -int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len, - struct cxl_region *cxlr); +int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len); int cxl_trigger_poison_list(struct cxl_memdev *cxlmd); int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa); int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa);